¿Determinar si el proceso de PowerShell actual es de 32 bits o de 64 bits?

82

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:

MagicAndi
fuente

Respuestas:

140

Si su shell se ejecuta en .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True
Shay Levy
fuente
Shay, gracias por compartir un fragmento de código muy útil. +1 Desafortunadamente, estoy usando PowerShell v2, pero estoy feliz de aceptar esto como la respuesta.
MagicAndi
5
Gracias por aceptar esto como la respuesta, pero debes dárselo a @MagicAndi, su respuesta funciona independientemente de la versión.
Shay Levy
2
@ShayLevy No, definitivamente es mejor aceptar el que será aplicable en el futuro. En 2018, PowerShell 2 es mucho menos relevante.
jpmc26
83

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á en C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, cortesía de este artículo .

MagicAndi
fuente
en base a esta respuesta me encontré con que la forma más útil con el fin de utilizar el valor en la cadena es: [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"
Sebastián
2
Para su información, para iniciar un proceso de 64 bits desde una línea de comando de 32 bits, reemplace "System32" por "sysnative". C: \ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: tamaño"
JohnP2
14

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 $Archserá x86o 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.

Trevor Sullivan
fuente
Muchas gracias. El guión anterior me ayudó a resolver el problema :)
santosh kumar patro
4
Process.StartInfo.EnvironmentVariablessiempre devuelve el entorno del proceso actual, sin importar en qué proceso lo ejecute. Solo utilícelo $env:PROCESSOR_ARCHITECTUREsi desea acceder al entorno actual: este es PowerShell 1.0 hasta AFAIK. Ciertamente 2.0. Puede enumerar el entorno con ls env:.
JT.
$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64'
Nathan Hartley
2

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]::Is64BitProcesstambién volverá Truea Windows que se ejecuta en ARM64, por lo que no puede confiar en él si lo que realmente necesita saber es si está ejecutando AMD64. Para hacer esto, en Windows puede usar la siguiente variable de entorno:

$Env:PROCESSOR_ARCHITECTURE, Que devuelve valores como AMD64, Arm64o x86.

Knelis
fuente
1
Switch([IntPtr]::size * 8) {

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

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

}
Fluxnull
fuente