Определите, является ли текущий процесс PowerShell 32-разрядным или 64-разрядным?
при запуске сценария PowerShell на 64-разрядной платформе ОС, как вы можете определить скрипт на какой версии PowerShell (32-разрядной или 64-разрядной) работает скрипт?
фон
32-разрядная и 64-разрядная версии PowerShell устанавливаются по умолчанию на 64-разрядной платформе, такой как Windows Server 2008. Это может привести к трудностям при запуске сценария PowerShell, который должен быть нацелен на определенную архитектуру (т. е. использовать 64-разрядную версию для сценарий для SharePoint 2010, чтобы использовать 64-разрядные библиотеки).
вопрос:
- Что является лучшим способом, чтобы запрограммировать в PowerShell х64 и х86 вариабельность? Этот вопрос касается кода, работающего как с 32-разрядной, так и с 64-разрядной архитектурой. Мой вопрос касается случая, когда вы хотите убедиться, что скрипт работает только на правильную версию.
3 ответа:
чтобы определить в сценарии, какую версию PowerShell вы используете, вы можете использовать следующие вспомогательные функции (любезно JaredPar это!--5-->ответ на соответствующий вопрос):
# 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 }
вышеуказанные функции используют тот факт, что размер системы.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
главной статьи.
вы можете использовать это также. Я тестировал его на 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.