确定当前的 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
的值将是 x86
或 amd64
。
编辑:
需要注意的是,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
,返回值如AMD64
、Arm64
或x86
。
【讨论】:
【参考方案5】:Switch([IntPtr]::size * 8)
32 <#your 32 bit stuff#> ;break
64 <#your 64 bit stuff#> ;break
【讨论】:
以上是关于确定当前的 PowerShell 进程是 32 位还是 64 位?的主要内容,如果未能解决你的问题,请参考以下文章