确定当前的PowerShell进程是32位还是64位?


82

在x64位OS平台上运行PowerShell脚本时,如何确定该脚本在哪个版本的PowerShell(32位或64位)上运行?

背景信息
默认情况下,在64位平台(例如Windows Server 2008)上安装了32位和64位版本的PowerShell。这在运行必须针对特定体系结构的PowerShell脚本(即使用64位位,用于SharePoint 2010的脚本,以使用64位库)。

相关问题:

Answers:


140

如果您的Shell在.NET 4.0(PowerShell 3.0)上运行:

PS> [Environment]::Is64BitProcess
True

谢伊,感谢您分享一个非常有用的代码段。+1不幸的是,我在PowerShell v2上运行,但很高兴接受此作为答案。
MagicAndi 2011年

5
感谢您接受此答案,但是您应该将其发送给@MagicAndi,无论版本如何,他的答案都适用。
谢伊·利维

2
@ShayLevy不,绝对可以接受将来会适用的方案。在2018年,PowerShell 2的相关性大大降低。
jpmc26

83

要确定脚本中使用的PowerShell版本,可以使用以下帮助器功能(由JaredPar 对相关问题解答提供):

# 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
}

上面的函数利用了System.IntPtr大小是特定于平台的事实。在32位计算机上为4字节,在64位计算机上为8字节。

请注意,值得注意的是Powershell的32位和64位版本的位置有些误导。本文提供了32位PowerShellC:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe和64位PowerShellC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe信息


基于此答案,我发现使用字符串中的值最有用的方法是:[IntPtr]::size * 8。这将乘以8乘以32/64的大小,具体取决于架构,例如:"$([IntPtr]::size * 8)bit"
Sebastian

2
仅供参考,要从32位命令行启动64位进程,请将“ System32”替换为“ sysnative”。C:\ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe“ [IntPtr] :: size”
JohnP2,18年

14

您也可以使用它。我在PowerShell版本2.0和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';
}

的值$Arch将为x86amd64

用这种方法做的很酷的事情是,除了本地一个($PID)外,您还可以指定一个不同的进程ID ,以确定另一个PowerShell进程的体系结构。


非常感谢。上面的脚本帮助我解决了问题:)
santosh kumar patro 2014年

4
Process.StartInfo.EnvironmentVariables无论您在哪个进程上执行它,总是返回当前进程的环境。仅$env:PROCESSOR_ARCHITECTURE当您要访问当前环境时才使用-这是PowerShell 1.0 up AFAIK。当然是2.0。您可以使用列出环境ls env:
JT。

$ Is64bit = $ ENV:PROCESSOR_ARCHITECTURE当量'AMD64'
弥敦道哈特利

2

由于Windows本身(和PowerShell)现在在更多架构(例如ARM64)上受支持,因此检查应用程序是否为64位可能并不总是足够的。

[Environment]::Is64BitProcess也会True在运行于ARM64的Windows上返回,因此如果您真正需要知道的是您是否正在运行,则不能依赖它AMD64。为此,在Windows上,您可以使用以下环境变量:

$Env:PROCESSOR_ARCHITECTURE,其返回值喜欢AMD64Arm64x86


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

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

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

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.