Podczas uruchamiania skryptu programu PowerShell na 64-bitowej platformie systemu operacyjnego, w jaki sposób można określić w skrypcie, na jakiej wersji programu PowerShell (32-bitowa lub 64-bitowa) działa skrypt?
Tło
Zarówno 32-bitowe, jak i 64-bitowe wersje programu PowerShell są instalowane domyślnie na platformie 64-bitowej, takiej jak Windows Server 2008. Może to prowadzić do trudności, gdy uruchamiany jest skrypt PowerShell, który musi być przeznaczony dla określonej architektury (tj. Przy użyciu 64- bit dla skryptu dla SharePoint 2010, w celu wykorzystania bibliotek 64-bitowych).
Powiązane pytanie:
- Jaki jest najlepszy sposób programowania w porównaniu ze zmiennością x64 vs x86 w PowerShell? To pytanie dotyczy kodu działającego na architekturach 32-bitowych i 64-bitowych. Moje pytanie dotyczy przypadku, gdy chcesz mieć pewność, że skrypt działa tylko w poprawnej wersji.
scripting
powershell
64-bit
32-bit
MagicAndi
źródło
źródło
Aby ustalić, w jakiej wersji skryptu PowerShell używasz, można użyć następujących funkcji pomocniczych (dzięki uprzejmości JaredPar za odpowiedź na pytanie powiązanych)
# 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 System.IntPtr jest zależny od platformy. Jest to 4 bajty na komputerze 32-bitowym i 8 bajtów na komputerze 64-bitowym.
Warto zauważyć, że lokalizacje 32-bitowych i 64-bitowych wersji programu Powershell są nieco mylące. 32-bitowy program PowerShell znajduje się pod adresem
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
, a 64-bitowy program PowerShell pod adresemC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
, dzięki uprzejmości tego artykułu .źródło
[IntPtr]::size * 8
. To pomnoży 8 przez rozmiar, dając 32/64 w zależności od architektury, na przykład:"$([IntPtr]::size * 8)bit"
Możesz również tego użyć. Przetestowałem to 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 albox86
alboamd64
.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.źródło
Process.StartInfo.EnvironmentVariables
zawsze zwraca środowisko bieżącego procesu, bez względu na to, w którym procesie go wykonujesz. Po prostu użyj,$env:PROCESSOR_ARCHITECTURE
jeśli chcesz uzyskać dostęp do bieżącego środowiska - to jest PowerShell 1.0 w górę AFAIK. Z pewnością 2.0. Możesz wyświetlić listę środowiska zls env:
.Ponieważ sam system Windows (i PowerShell) są teraz obsługiwane na większej liczbie architektur, takich jak ARM64, nie zawsze wystarczy sprawdzić, czy aplikacja jest 64-bitowa.
[Environment]::Is64BitProcess
powróci równieżTrue
w systemie Windows działającym na ARM64, więc nie możesz na nim polegać, jeśli naprawdę musisz wiedzieć, czy używaszAMD64
. Aby to zrobić, w systemie Windows możesz użyć następującej zmiennej środowiskowej:$Env:PROCESSOR_ARCHITECTURE
, Która zwraca wartości podobaAMD64
,Arm64
albox86
.źródło
Switch([IntPtr]::size * 8) { 32 { <#your 32 bit stuff#> ;break } 64 { <#your 64 bit stuff#> ;break } }
źródło