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

Mag*_*ndi 78 powershell scripting 64-bit 32-bit

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

背景
默认情况下,32位和64位版本的PowerShell都安装在64位平台(如Windows Server 2008)上.这可能会导致运行必须针对特定体系结构的PowerShell脚本时遇到困难(即使用64-用于SharePoint 2010脚本的位,以便使用64位库).

相关问题:

Sha*_*evy 134

如果你的shell运行在.NET 4.0(PowerShell 3.0)上:

PS> [Environment]::Is64BitProcess
True
Run Code Online (Sandbox Code Playgroud)

  • 感谢你接受这个作为答案,但你应该把它交给@MagicAndi,无论版本如何,他的回答都是有效的. (5认同)
  • @ShayLevy不,绝对可以接受将来会适用的方案。在2018年,PowerShell 2的相关性大大降低。 (2认同)

Mag*_*ndi 82

要在脚本中确定您正在使用的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
}
Run Code Online (Sandbox Code Playgroud)

上述函数利用了System.IntPtr大小是特定于平台的事实.它在32位机器上是4个字节,在64位机器上是8个字节.

请注意,值得注意的是,32位和64位版本的Powershell的位置有些误导.32位PowerShell是在发现C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe,和64位PowerShell是在C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe,这礼貌文章.

  • 基于这个答案,我发现使用字符串中的值的最有用的方法是:`[IntPtr]::size * 8`。根据架构,这将乘以 8 得到 32/64 的大小,例如: `"$([IntPtr]::size * 8)bit"` (2认同)
  • 仅供参考,要从 32 位命令行启动 64 位进程,请将“System32”替换为“sysnative”。C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe "[IntPtr]::size" (2认同)

Tre*_*van 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';
}
Run Code Online (Sandbox Code Playgroud)

$Arch将是x86或的值amd64.

这样做很酷的一点是,除了本地one($PID)之外,您还可以指定不同的进程ID ,以确定不同PowerShell进程的体系结构.

  • `Process.StartInfo.EnvironmentVariables`总是返回当前进程的环境,无论你在哪个进程上执行它.如果你想访问当前环境,只需使用`$ env:PROCESSOR_ARCHITECTURE` - 这是PowerShell 1.0 up AFAIK.当然2.0.您可以使用`ls env:`列出环境. (4认同)