scripting - Determine si el proceso actual de PowerShell es de 32 bits o de 64 bits.
64bit 32-bit (3)
Para determinar en su secuencia de comandos qué versión de PowerShell está utilizando, puede usar las siguientes funciones de ayuda (cortesía de JaredPar''s answer de JaredPar''s a una pregunta relacionada):
# 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
}
Las funciones anteriores hacen uso del hecho de que el tamaño de System.IntPtr es específico de la plataforma. Es 4 bytes en una máquina de 32 bits y 8 bytes en una máquina de 64 bits.
Tenga en cuenta que vale la pena señalar que las ubicaciones de las versiones de 32 bits y 64 bits de Powershell son algo engañosas. El PowerShell de 32 bits se encuentra en C:/Windows/SysWOW64/WindowsPowerShell/v1.0/powershell.exe
, y el PowerShell de 64 bits está en C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
. cortesía de este article .
Al ejecutar un script de PowerShell en una plataforma de sistema operativo x64-bit, ¿cómo puede determinar en el script qué versión de PowerShell (32 bits o 64 bits) ejecuta el script?
Fondo
Ambas versiones de 32 bits y 64 bits de PowerShell están instaladas por defecto en una plataforma de 64 bits como Windows Server 2008. Esto puede provocar dificultades cuando se ejecuta un script de PowerShell que debe estar dirigido a una arquitectura específica (es decir, utilizando 64 bits para un script para SharePoint 2010, para consumir las bibliotecas de 64 bits).
Pregunta relacionada:
- ¿Cuál es la mejor forma de programar contra la variabilidad x64 vs. x86 de powershell? Esta pregunta se refiere al código que se ejecuta tanto en arquitecturas de 32 bits como de 64 bits. Mi pregunta se refiere al caso cuando desea asegurarse de que el script solo se ejecute en la versión correcta.
Puedes usar esto también. Lo probé en PowerShell versión 2.0 y 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'';
}
El valor de $Arch
será x86
o amd64
.
Lo bueno de hacerlo de esta manera es que también puede especificar un ID de proceso diferente, además del local ( $PID
), para determinar la arquitectura de un proceso de PowerShell diferente.
Si su shell se ejecuta en .NET 4.0 (PowerShell 3.0):
PS> [Environment]::Is64BitProcess
True