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

Posted

技术标签:

【中文标题】确定当前的 PowerShell 进程是 32 位还是 64 位?【英文标题】:Determine if current PowerShell Process is 32-bit or 64-bit? 【发布时间】:2012-01-25 05:08:24 【问题描述】:

在 x64 位操作系统平台上运行 PowerShell 脚本时,您如何在脚本中确定脚本在哪个版本的 PowerShell(32 位或 64 位)上运行?

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

相关问题:

What is the best way to program against powershell's x64 vs. x86 variability? 这个问题涉及在 32 位和 64 位架构上运行的代码。我的问题涉及您希望确保脚本仅针对正确版本运行的情况。

【问题讨论】:

【参考方案1】:

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

PS> [Environment]::Is64BitProcess
True

【讨论】:

Shay,感谢分享一个非常有用的代码 sn-p。 +1 不幸的是,我在 PowerShell v2 上运行,但我很高兴接受这个作为答案。 感谢您接受此作为答案,但您应该将其提供给@MagicAndi,无论版本如何,他的答案都有效。 @ShayLevy 不,肯定会更好地接受将在未来很长一段时间内适用的那个。在 2018 年,PowerShell 2 的相关性大大降低。【参考方案2】:

要在您的脚本中确定您正在使用哪个版本的 PowerShell,您可以使用以下帮助函数(由JaredPar's answer 提供相关问题):

# 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

上述函数利用了size of 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,感谢 article。

【讨论】:

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

您也可以使用它。我在 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

编辑:

需要注意的是,Process.StartInfo.EnvironmentVariables 始终返回当前进程的环境,无论您在哪个进程上执行它。

【讨论】:

非常感谢。上面的脚本帮助我解决了这个问题:) Process.StartInfo.EnvironmentVariables 始终返回当前进程的环境,无论您在哪个进程上执行它。如果您想访问当前环境,只需使用 $env:PROCESSOR_ARCHITECTURE - 这是 PowerShell 1.0 up AFAIK。当然是2.0。您可以使用ls env: 列出环境。 $Is64bit = $env:PROCESSOR_ARCHITECTURE -eq 'AMD64'【参考方案4】:

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

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

$Env:PROCESSOR_ARCHITECTURE,返回值如AMD64Arm64x86

【讨论】:

【参考方案5】:
Switch([IntPtr]::size * 8) 

32  <#your 32 bit stuff#> ;break 

64  <#your 64 bit stuff#> ;break 


【讨论】:

以上是关于确定当前的 PowerShell 进程是 32 位还是 64 位?的主要内容,如果未能解决你的问题,请参考以下文章

检查正在运行的进程是 32 位还是 64 位

64 位 PowerShell 调用 32 位 DLL

确定当前 PowerShell 脚本位置的最佳方法是啥?

在 64 位机器上捕获的 32 位进程的调试转储

高 CPU 使用率的 32 位进程的 Process Dump 分析

如何在 C# 中确定当前关注的进程名称和版本