2011-12-21 40 views
64

Al ejecutar un script de PowerShell en una plataforma de sistema operativo x64-bit, ¿cómo puede determinar en el script en qué versión de PowerShell (32 bits o 64 bits) se está ejecutando el script?Determine si el proceso actual de PowerShell es de 32 bits o de 64 bits.

Antecedentes
Ambas versiones de 32 bits y 64 bits de PowerShell se instalan de forma predeterminada en una plataforma de 64 bits, como Windows Server 2008. Esto puede conducir a dificultades cuando un script PowerShell es RAN que debe apuntar una arquitectura específica (es decir, utilizando 64 bits para una secuencia de comandos para SharePoint 2010, con el fin de consumir las bibliotecas de 64 bits).

pregunta relacionada:

Respuesta

106

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

PS> [Environment]::Is64BitProcess 
True 
+0

Shay, gracias por compartir un fragmento de código muy útil. +1 Lamentablemente, me estoy ejecutando en PowerShell v2, pero estoy feliz de aceptar esto como la respuesta. – MagicAndi

+4

Gracias por aceptar esto como la respuesta, pero debe dársela a @MagicAndi, su respuesta funciona independientemente de la versión. –

73

Para determinar la secuencia de comandos en la versión de PowerShell que está usando, puede utilizar las siguientes funciones de ayuda (cortesía de JaredPar'sanswer 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 size of 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 la ubicación de las versiones de 32 bits y 64 bits de Powershell es algo engañosa. PowerShell de 32 bits se encuentra en C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, y PowerShell de 64 bits está en C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, cortesía de este article.

+1

esto fue de una ayuda increíble, bien hecho. –

+0

basado en esta respuesta, encontré que la forma más útil para usar 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 "' – Sebastian

13

Se puede usar esta 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 o bien será x86 o amd64.

Lo bueno de hacerlo de esta manera es que también se puede especificar un ID de proceso diferente, además de la local ($PID), para determinar la arquitectura de un proceso de PowerShell diferente.

+0

Muchas gracias. La secuencia de comandos anterior me ayudó a resolver el problema :) –

+3

'Process.StartInfo.EnvironmentVariables' siempre devuelve el entorno del proceso actual, sin importar en qué proceso lo ejecute. Simplemente use '$ env: PROCESSOR_ARCHITECTURE' si desea acceder al entorno actual: esto es PowerShell 1.0 up AFAIK. Ciertamente 2.0. Puede enumerar el entorno con 'ls env:'. –

+0

$ Is64bit = $ env: PROCESSOR_ARCHITECTURE -eq 'AMD64' –

Cuestiones relacionadas