Określ, czy bieżący proces PowerShell jest 32-bitowy czy 64-bitowy?

Podczas uruchamiania skryptu PowerShell na platformie x64-bitowej, jak można określić w skrypcie na jakiej wersji PowerShell (32-bitowej lub 64-bitowej) skrypt jest uruchomiony?

Tło
Zarówno 32-bitowe, jak i 64-bitowe wersje PowerShell są instalowane domyślnie na platformie 64-bitowej, takiej jak Windows Server 2008. Może to prowadzić do trudności podczas uruchamiania skryptu PowerShell, który musi być ukierunkowany na konkretną architekturę (np. użycie 64-bitowego skryptu dla SharePoint 2010, w celu wykorzystania bibliotek 64-bitowych).

Podobne pytanie:

Author: Community, 2011-12-21

3 answers

Jeśli jesteś shell działa na. Net 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True
 118
Author: Shay Levy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-21 12:13:10

Aby określić w skrypcie, jakiej wersji PowerShell używasz, możesz użyć następujących funkcji pomocniczych (dzięki uprzejmości JaredPar ' S odpowiedź na powiązane pytanie):

# 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
}

Powyższe funkcje wykorzystują fakt, że Rozmiar systemu.IntPtr jest specyficzne dla platformy. Jest to 4 bajty na maszynie 32-bitowej i 8 bajtów na maszynie 64-bitowej.

Uwaga, warto zauważyć, że lokalizacje 32-bitowych i 64-bitowych wersji Powershell są nieco mylące. 32-bitowy PowerShell znajduje się w C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, A 64-bitowy PowerShell znajduje się w C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, dzięki uprzejmości tego artykułu .

 75
Author: MagicAndi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:39

Możesz również użyć tego. Testowałem go na PowerShell w wersji 2.0 i 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';
}

Wartość $Arch będzie albo x86 albo amd64.

Fajną rzeczą w robieniu tego w ten sposób jest to, że możesz również określić inny identyfikator procesu, oprócz lokalnego ($PID), Aby określić architekturę innego procesu PowerShell.

 13
Author: Trevor Sullivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-19 16:29:54