Wie können Sie beim Ausführen eines PowerShell-Skripts auf einer x64-Bit-Betriebssystemplattform im Skript feststellen, auf welcher PowerShell-Version (32-Bit oder 64-Bit) das Skript ausgeführt wird?
Hintergrund
Sowohl 32-Bit- als auch 64-Bit-Versionen von PowerShell werden standardmäßig auf einer 64-Bit-Plattform wie Windows Server 2008 installiert. Dies kann zu Schwierigkeiten führen, wenn ein PowerShell-Skript ausgeführt wird, das auf eine bestimmte Architektur abzielen muss (z. B. 64-). Bit für ein Skript für SharePoint 2010, um die 64-Bit-Bibliotheken zu nutzen).
Verwandte Frage:
- Was ist der beste Weg, um gegen die x64 vs. x86-Variabilität von Powershell zu programmieren? Diese Frage befasst sich mit Code, der sowohl für 32-Bit- als auch für 64-Bit-Architekturen ausgeführt wird. Meine Frage befasst sich mit dem Fall, dass Sie sicherstellen möchten, dass das Skript nur mit der richtigen Version ausgeführt wird.
scripting
powershell
64-bit
32-bit
MagicAndi
quelle
quelle
Um in Ihrem Skript zu ermitteln , welche Version von Powershell Sie verwenden, können Sie die folgenden Hilfsfunktionen ( mit freundlicher Genehmigung von verwenden JaredPar die Antwort auf eine ähnliche Frage):
# 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 }
Die oben genannten Funktionen nutzen die Tatsache, dass die Größe von System.IntPtr plattformspezifisch ist. Auf einem 32-Bit-Computer sind es 4 Bytes und auf einem 64-Bit-Computer 8 Bytes.
Beachten Sie, dass die Speicherorte der 32-Bit- und 64-Bit-Versionen von Powershell etwas irreführend sind. Die 32-Bit-PowerShell finden Sie unter
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
und die 64-Bit-PowerShell unterC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
, mit freundlicher Genehmigung dieses Artikels .quelle
[IntPtr]::size * 8
. Das multipliziert 8 mit der Größe, was 32/64 ergibt, abhängig von der Architektur, zum Beispiel:"$([IntPtr]::size * 8)bit"
Sie können dies auch verwenden. Ich habe es auf PowerShell Version 2.0 und 4.0 getestet.
$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'; }
Der Wert von
$Arch
wird entwederx86
oder seinamd64
.Das Coole daran ist, dass Sie neben der lokalen (
$PID
) auch eine andere Prozess-ID angeben können , um die Architektur eines anderen PowerShell-Prozesses zu bestimmen.quelle
Process.StartInfo.EnvironmentVariables
Gibt immer die Umgebung des aktuellen Prozesses zurück, unabhängig davon, auf welchem Prozess Sie ihn ausführen. Verwenden$env:PROCESSOR_ARCHITECTURE
Sie diese Option nur, wenn Sie auf die aktuelle Umgebung zugreifen möchten. Dies ist PowerShell 1.0 bis AFAIK. Sicher 2.0. Sie können die Umgebung mit auflistenls env:
.Switch([IntPtr]::size * 8) { 32 { <#your 32 bit stuff#> ;break } 64 { <#your 64 bit stuff#> ;break } }
quelle
Da Windows selbst (und PowerShell) jetzt auf mehr Architekturen wie ARM64 unterstützt werden, reicht es möglicherweise nicht immer aus, zu überprüfen, ob die Anwendung 64-Bit ist.
[Environment]::Is64BitProcess
wird auchTrue
unter Windows zurückkehren, das unter ARM64 ausgeführt wird, sodass Sie sich nicht darauf verlassen können, wenn Sie wirklich wissen müssen, ob Sie unter ARM64 ausgeführt werdenAMD64
. Zu diesem Zweck können Sie unter Windows die folgende Umgebungsvariable verwenden:$Env:PROCESSOR_ARCHITECTURE
, Die Werte zurückgeben möchtenAMD64
,Arm64
oderx86
.quelle