Определить, является ли текущий процесс PowerShell 32-разрядным или 64-разрядным? - PullRequest
76 голосов
/ 21 декабря 2011

При запуске сценария PowerShell на платформе x64-разрядной ОС, как определить в сценарии , на какой версии PowerShell (32-разрядной или 64-разрядной) выполняется сценарий?

Фон
Как 32-разрядные, так и 64-разрядные версии PowerShell установлены по умолчанию на 64-разрядной платформе, такой как Windows Server 2008. Это может привести к трудностям приЗапускается сценарий PowerShell, который должен быть нацелен на конкретную архитектуру (т. Е. Использовать 64-разрядный сценарий для SharePoint 2010, чтобы использовать 64-разрядные библиотеки).

Смежный вопрос:

Ответы [ 4 ]

131 голосов
/ 21 декабря 2011

Если ваша оболочка работает на .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True
80 голосов
/ 21 декабря 2011

Чтобы определить в своем скрипте, какую версию PowerShell вы используете, вы можете использовать следующие вспомогательные функции (любезно ответа ДжаредПара на связанный вопрос):

# Is this a Wow64 powershell host
function Test-Wow64() {
    return (Test-Win32) -and (test-path env:\PROCESSOR_ARCHITEW6432)
}

# Is this a 64 bit process
function Test-Win64() {
    return [IntPtr]::size -eq 8
}

# Is this a 32 bit process
function Test-Win32() {
    return [IntPtr]::size -eq 4
}

Вышеуказанные функции используют тот факт, что размер System.IntPtr зависит от платформы. Это 4 байта на 32-битной машине и 8 байтов на 64-битной машине.

Обратите внимание, что стоит отметить, что расположение 32-разрядной и 64-разрядной версий Powershell несколько вводит в заблуждение. 32-разрядная оболочка PowerShell находится на C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, а 64-разрядная оболочка PowerShell - на C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, любезно предоставленная в этой статье .

14 голосов
/ 05 ноября 2013

Вы также можете использовать это.Я тестировал его на PowerShell версии 2.0 и 4.0.

$Arch = (Get-Process -Id $PID).StartInfo.EnvironmentVariables["PROCESSOR_ARCHITECTURE"];
if ($Arch -eq 'x86') {
    Write-Host -Object 'Running 32-bit PowerShell';
}
elseif ($Arch -eq 'amd64') {
    Write-Host -Object 'Running 64-bit PowerShell';
}

Значение $Arch будет либо x86, либо amd64.

Крутая вещь, если вы сделаете это таким образом.Вы также можете указать другой идентификатор процесса, помимо локального ($PID), для определения архитектуры другого процесса PowerShell.

1 голос
/ 25 октября 2018
Switch([IntPtr]::size * 8) {

32 { <#your 32 bit stuff#> ;break }

64 { <#your 64 bit stuff#> ;break }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...