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:
Si votre environnement fonctionne sous .NET 4.0 (PowerShell 3.0):
PS> [Environment]::Is64BitProcess
True
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 .
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.
Switch([IntPtr]::size * 8) {
32 { <#your 32 bit stuff#> ;break }
64 { <#your 64 bit stuff#> ;break }
}