Определите, является ли текущий PowerShell Process 32-разрядным или 64-разрядным?

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

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

Похожие вопросы:

Ответ 1

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

PS> [Environment]::Is64BitProcess
True

Ответ 2

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

# 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, любезно предоставлена ​​этой статьей.

Ответ 3

Вы также можете использовать это. Я тестировал его на 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.