Как при запуске сценария PowerShell на платформе x64-разрядной ОС определить в сценарии, на какой версии PowerShell (32-разрядной или 64-разрядной) выполняется сценарий?
Предпосылки
Как 32-разрядная, так и 64-разрядная версии PowerShell устанавливаются по умолчанию на 64-разрядной платформе, такой как Windows Server 2008. Это может привести к трудностям при запуске сценария PowerShell, который должен ориентироваться на конкретную архитектуру (т. Е. С использованием 64-разрядной версии). bit для скрипта для SharePoint 2010, чтобы использовать 64-битные библиотеки).
Связанный вопрос:
- Как лучше всего программировать против вариативности powershell x64 и x86? Этот вопрос касается кода, работающего как в 32-битной, так и в 64-битной архитектурах. Мой вопрос касается случая, когда вы хотите, чтобы сценарий работал только с правильной версией.
scripting
powershell
64-bit
32-bit
MagicAndi
источник
источник
Для того, чтобы определить , в скрипте , какая версия 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
, любезно предоставленные этой статьей .источник
[IntPtr]::size * 8
. Это умножит 8 на размер, что даст вам 32/64 в зависимости от архитектуры, например:"$([IntPtr]::size * 8)bit"
Вы также можете использовать это. Я тестировал его на 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
всегда возвращает среду текущего процесса, независимо от того, в каком процессе вы его выполняете.источник
Process.StartInfo.EnvironmentVariables
всегда возвращает среду текущего процесса, независимо от того, в каком процессе вы его выполняете. Просто используйте,$env:PROCESSOR_ARCHITECTURE
если вы хотите получить доступ к текущей среде - это PowerShell 1.0 до AFAIK. Конечно 2.0. Вы можете перечислить среду с помощьюls env:
.Поскольку сама Windows (и PowerShell) теперь поддерживается на большем количестве архитектур, таких как ARM64, этого не всегда может быть достаточно, чтобы проверить, является ли приложение 64-разрядным.
[Environment]::Is64BitProcess
также вернетсяTrue
в Windows, работающую на ARM64, поэтому вы не можете полагаться на нее, если вам действительно нужно знать, работаете ли выAMD64
. Для этого в Windows вы можете использовать следующую переменную среды:$Env:PROCESSOR_ARCHITECTURE
, Которая возвращает значения нравитсяAMD64
,Arm64
илиx86
.источник
Switch([IntPtr]::size * 8) { 32 { <#your 32 bit stuff#> ;break } 64 { <#your 64 bit stuff#> ;break } }
источник