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

lors de l'exécution d'un script PowerShell sur une plate-forme x64-bit OS, Comment Pouvez-vous déterminer dans le script quelle version de PowerShell (32-bit ou 64-bit) le script est en cours d'exécution?

arrière-plan

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

question connexe:

  • Quelle est la meilleure façon de programmer contre la variabilité x64 vs. x86 de powershell? cette question porte sur les architectures 32 bits et 64 bits. Ma question porte sur le cas où vous voulez vous assurer que le script ne tourne que contre version correcte.
69
demandé sur Community 2011-12-21 15:18:05

3 réponses

si votre shell tourne sur .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True
118
répondu Shay Levy 2011-12-21 12:13:10

pour déterminer dans votre script quelle version de PowerShell vous utilisez, vous pouvez utiliser les fonctions d'aide suivantes (courtoisie de Jaredpar's ré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 la taille du système.L'IntPtr est spécifique à la plate-forme. Il est de 4 octets sur une machine 32 bits et 8 octets sur une machine 64 bits.

Note, il est intéressant de noter que les emplacements des versions 32 bits et 64 bits de Powershell sont quelque peu trompeurs. La PowerShell 32 bits se trouve à C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe , et la PowerShell 64 bits est à C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe , gracieuseté de cet article .

75
répondu MagicAndi 2017-05-23 12:17:39

Vous pouvez l'utiliser ainsi. 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 soit amd64 .

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

13
répondu Trevor Sullivan 2014-06-19 16:29:54