Определите, является ли текущий процесс 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 69

3 ответа:

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

PS> [Environment]::Is64BitProcess
True

чтобы определить в сценарии, какую версию 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.