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

83

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

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

Связанный вопрос:

MagicAndi
источник

Ответы:

142

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

PS> [Environment]::Is64BitProcess
True
Шэй Леви
источник
Шей, спасибо, что поделились очень полезным фрагментом кода. +1 К сожалению, я использую PowerShell v2, но я рад принять это как ответ.
MagicAndi
5
Спасибо, что приняли это как ответ, но вы должны передать его @MagicAndi, он работает независимо от версии.
Шей Леви
2
@ShayLevy Нет, определенно лучше принять тот, который будет применяться в будущем. В 2018 году PowerShell 2 гораздо менее актуален.
jpmc26 06
83

Для того, чтобы определить , в скрипте , какая версия 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, любезно предоставленные этой статьей .

MagicAndi
источник
на основе этого ответа я нашел , что наиболее полезный способ для того , чтобы использовать значение в строке является: [IntPtr]::size * 8. Это умножит 8 на размер, что даст вам 32/64 в зависимости от архитектуры, например:"$([IntPtr]::size * 8)bit"
Себастьян
2
К вашему сведению, чтобы запустить 64-битный процесс из 32-битной командной строки, замените «System32» на «sysnative». C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: size"
JohnP2
13

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

РЕДАКТИРОВАТЬ:

Предостережение заключается в том, что Process.StartInfo.EnvironmentVariablesвсегда возвращает среду текущего процесса, независимо от того, в каком процессе вы его выполняете.

Тревор Салливан
источник
Большое спасибо. Приведенный выше сценарий помог мне решить проблему :)
santosh kumar patro
5
Process.StartInfo.EnvironmentVariablesвсегда возвращает среду текущего процесса, независимо от того, в каком процессе вы его выполняете. Просто используйте, $env:PROCESSOR_ARCHITECTUREесли вы хотите получить доступ к текущей среде - это PowerShell 1.0 до AFAIK. Конечно 2.0. Вы можете перечислить среду с помощью ls env:.
JT.
$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64'
Натан Хартли,
2

Поскольку сама Windows (и PowerShell) теперь поддерживается на большем количестве архитектур, таких как ARM64, этого не всегда может быть достаточно, чтобы проверить, является ли приложение 64-разрядным.

[Environment]::Is64BitProcessтакже вернется Trueв Windows, работающую на ARM64, поэтому вы не можете полагаться на нее, если вам действительно нужно знать, работаете ли вы AMD64. Для этого в Windows вы можете использовать следующую переменную среды:

$Env:PROCESSOR_ARCHITECTURE, Которая возвращает значения нравится AMD64, Arm64или x86.

Knelis
источник
1
Switch([IntPtr]::size * 8) {

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

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

}
Fluxnull
источник