确定当前的PowerShell Process是32位还是64位?
在x64位操作系统平台上运行PowerShell脚本时,如何在脚本中确定运行脚本的PowerShell版本(32位或64位)?
背景
默认情况下,32位和64位版本的PowerShell都安装在64位平台(如Windows Server 2008)上。这可能会导致运行PowerShell脚本时遇到困难,而脚本必须针对特定体系结构(即使用64位对于SharePoint 2010的脚本,为了使用64位库)。
相关问题:
- 针对PowerShell的x64与x86变异编程的最佳方法是什么? 这个问题涉及针对32位和64位体系结构运行的代码。 我的问题处理的情况下,当你想确保脚本只运行在正确的版本。
如果你的shell运行在.NET 4.0(PowerShell 3.0)上:
PS> [Environment]::Is64BitProcess True
要在您的脚本中确定您正在使用的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位PowerShell位于C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
,而64位PowerShell位于C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
,礼貌这篇文章 。
你也可以使用这个。 我在PowerShell版本2.0和4.0上testing它。
$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
。
这样做很酷的事情是,你也可以指定一个不同的进程ID,除了本地的( $PID
),来确定一个不同的PowerShell进程的体系结构。