web-dev-qa-db-fra.com

Déterminer si le processus PowerShell actuel est 32 bits ou 64 bits?

Lorsque vous exécutez un script PowerShell sur une plate-forme de système d'exploitation x64 bits, comment pouvez-vous déterminer dans le script quelle version de PowerShell (32 bits ou 64 bits) exécute le script?

Arrière-plan
Les versions 32 bits et 64 bits de PowerShell sont installées par défaut sur une plate-forme 64 bits telle que Windows Server 2008. Cela peut entraîner des difficultés lors de l'exécution d'un script PowerShell qui doit cibler une architecture spécifique ( c'est-à-dire utiliser 64 bits pour un script pour SharePoint 2010, afin de consommer les bibliothèques 64 bits).

Question connexe:

76
MagicAndi

Si votre environnement fonctionne sous .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True
131
Shay Levy

Pour déterminer dans votre script quelle version de PowerShell vous utilisez, vous pouvez utiliser les fonctions d'assistance suivantes (avec la permission de JaredPar'sréponse à une question connexe):

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

Les fonctions ci-dessus utilisent le fait que taille de System.IntPtr est spécifique à la plate-forme. Il s'agit de 4 octets sur une machine 32 bits et de 8 octets sur une machine 64 bits.

Notez que les emplacements des versions 32 bits et 64 bits de Powershell sont quelque peu trompeurs. Le PowerShell 32 bits se trouve à l'adresse C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, et le PowerShell 64 bits est à C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, avec la permission de this article .

80
MagicAndi

Vous pouvez aussi l'utiliser. Je l'ai testé sur les versions 2.0 et 4.0 de PowerShell.

$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';
}

La valeur de $Arch sera soit x86 ou AMD64.

La bonne chose à faire de cette façon est que vous pouvez également spécifier un ID de processus différent, en plus du nom local ($PID), pour déterminer l’architecture d’un processus PowerShell différent.

14
Trevor Sullivan
Switch([IntPtr]::size * 8) {

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

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

}
1
Fluxnull