Ustal, czy bieżący proces programu PowerShell jest 32-bitowy czy 64-bitowy?

83

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:

MagicAndi
źródło

Odpowiedzi:

142

Jeśli Twoja powłoka działa na .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True
Shay Levy
źródło
Shay, dziękuję za udostępnienie bardzo przydatnego fragmentu kodu. +1 Niestety, korzystam z PowerShell v2, ale z przyjemnością przyjmuję to jako odpowiedź.
MagicAndi,
5
Dziękuję, że zaakceptowałeś to jako odpowiedź, ale powinieneś dać ją @MagicAndi, on odpowiedź działa niezależnie od wersji.
Shay Levy
2
@ShayLevy Nie, zdecydowanie lepiej zaakceptować ten, który będzie miał zastosowanie jeszcze długo w przyszłości. W 2018 roku PowerShell 2 jest o wiele mniej istotny.
jpmc26
83

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 adresem C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, dzięki uprzejmości tego artykułu .

MagicAndi
źródło
na podstawie tej odpowiedzi okazało się, że najbardziej skutecznym sposobem, aby wykorzystać wartość w ciąg jest: [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"
Sebastian
2
FYI, aby uruchomić proces 64-bitowy z 32-bitowego wiersza poleceń, zamień „System32” na „sysnative”. C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: size"
JohnP2
14

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ść $Archbędzie albo x86albo 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.

Trevor Sullivan
źródło
Wielkie dzięki. Powyższy skrypt pomógł mi rozwiązać problem :)
santosh kumar patro
4
Process.StartInfo.EnvironmentVariableszawsze zwraca środowisko bieżącego procesu, bez względu na to, w którym procesie go wykonujesz. Po prostu użyj, $env:PROCESSOR_ARCHITECTUREjeś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 z ls env:.
JT.
$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64'
Nathan Hartley
2

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]::Is64BitProcesspowróci również Truew systemie Windows działającym na ARM64, więc nie możesz na nim polegać, jeśli naprawdę musisz wiedzieć, czy używasz AMD64. Aby to zrobić, w systemie Windows możesz użyć następującej zmiennej środowiskowej:

$Env:PROCESSOR_ARCHITECTURE, Która zwraca wartości podoba AMD64, Arm64albo x86.

Knelis
źródło
1
Switch([IntPtr]::size * 8) {

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

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

}
Fluxnull
źródło