Al ejecutar un script de PowerShell en una plataforma de sistema operativo x64 bits, ¿cómo puede determinar en el script en qué versión de PowerShell (32 bits o 64 bits) se está ejecutando el script?
Antecedentes
Tanto las versiones de 32 bits como las de 64 bits de PowerShell se instalan de forma predeterminada en una plataforma de 64 bits como Windows Server 2008. Esto puede generar dificultades cuando se ejecuta un script de PowerShell que debe apuntar a una arquitectura específica (es decir, utilizando 64 bits). bit para un script para SharePoint 2010, con el fin de consumir las bibliotecas de 64 bits).
Pregunta relacionada:
- ¿Cuál es la mejor manera de programar contra la variabilidad x64 frente a x86 de powershell? Esta pregunta trata sobre el código que se ejecuta en arquitecturas de 32 y 64 bits. Mi pregunta trata sobre el caso en el que desea asegurarse de que el script solo se ejecute en la versión correcta.
scripting
powershell
64-bit
32-bit
MagicAndi
fuente
fuente
Para determinar en su secuencia de comandos qué versión de PowerShell está usando, puede usar las siguientes funciones auxiliares (cortesía de la respuesta de JaredPar 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. Tiene 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 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á enC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
, cortesía de este artículo .fuente
[IntPtr]::size * 8
. Eso multiplicará 8 por el tamaño que le da 32/64 dependiendo de la arquitectura, por ejemplo:"$([IntPtr]::size * 8)bit"
También puedes usar esto. 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
oamd64
.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.fuente
Process.StartInfo.EnvironmentVariables
siempre devuelve el entorno del proceso actual, sin importar en qué proceso lo ejecute. Solo utilícelo$env:PROCESSOR_ARCHITECTURE
si desea acceder al entorno actual: este es PowerShell 1.0 hasta AFAIK. Ciertamente 2.0. Puede enumerar el entorno conls env:
.Con el propio Windows (y PowerShell) ahora compatible con más arquitecturas, como ARM64, es posible que no siempre sea suficiente para verificar si la aplicación es de 64 bits.
[Environment]::Is64BitProcess
también volveráTrue
a Windows que se ejecuta en ARM64, por lo que no puede confiar en él si lo que realmente necesita saber es si está ejecutandoAMD64
. Para hacer esto, en Windows puede usar la siguiente variable de entorno:$Env:PROCESSOR_ARCHITECTURE
, Que devuelve valores comoAMD64
,Arm64
ox86
.fuente
Switch([IntPtr]::size * 8) { 32 { <#your 32 bit stuff#> ;break } 64 { <#your 64 bit stuff#> ;break } }
fuente