Bestimmen Sie, ob der aktuelle PowerShell-Prozess 32-Bit oder 64-Bit ist?

81

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:

MagicAndi
quelle

Antworten:

140

Wenn Ihre Shell unter .NET 4.0 (PowerShell 3.0) ausgeführt wird:

PS> [Environment]::Is64BitProcess
True
Shay Levy
quelle
Shay, danke, dass du ein sehr nützliches Code-Snippet geteilt hast. +1 Leider verwende ich PowerShell v2, aber ich akzeptiere dies gerne als Antwort.
MagicAndi
5
Vielen Dank, dass Sie dies als Antwort akzeptiert haben, aber Sie sollten es @MagicAndi geben. Seine Antwort funktioniert unabhängig von der Version.
Shay Levy
2
@ShayLevy Nein, definitiv besser, die zu akzeptieren, die noch lange in der Zukunft anwendbar sein wird. Im Jahr 2018 ist PowerShell 2 viel weniger relevant.
jpmc26
83

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.exeund die 64-Bit-PowerShell unter C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, mit freundlicher Genehmigung dieses Artikels .

MagicAndi
quelle
Basierend auf dieser Antwort fand ich, dass der nützlichste Weg, um den Wert in string zu verwenden, ist : [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"
Sebastian
2
Um einen 64-Bit-Prozess über eine 32-Bit-Befehlszeile zu starten, ersetzen Sie "System32" durch "sysnative". C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ Powershell.exe "[IntPtr] :: size"
JohnP2
14

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 $Archwird entweder x86oder sein amd64.

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.

Trevor Sullivan
quelle
Danke vielmals. Das obige Skript hat mir geholfen, das Problem zu lösen :)
Santosh Kumar Patro 19.
4
Process.StartInfo.EnvironmentVariablesGibt immer die Umgebung des aktuellen Prozesses zurück, unabhängig davon, auf welchem ​​Prozess Sie ihn ausführen. Verwenden $env:PROCESSOR_ARCHITECTURESie 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 auflisten ls env:.
JT.
$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64'
Nathan Hartley
1
Switch([IntPtr]::size * 8) {

32 { <#your 32 bit stuff#> ;break }

64 { <#your 64 bit stuff#> ;break }

}
Fluxnull
quelle
1

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]::Is64BitProcesswird auch Trueunter 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 werden AMD64. Zu diesem Zweck können Sie unter Windows die folgende Umgebungsvariable verwenden:

$Env:PROCESSOR_ARCHITECTURE, Die Werte zurückgeben möchten AMD64, Arm64oder x86.

Knelis
quelle