Determine if current PowerShell Process is 32
When running a PowerShell script on a x64-bit OS platform, how can you determine in the script what version of PowerShell (32-bit or 64-bit) the script is running on?
Background
Both 32-bit and 64-bit versions of PowerShell are installed by default on a 64-bit platform such as Windows Server 2008. This can lead to difficulties when a PowerShell script is ran that must target a specific architecture (ie using 64-bit for a script for SharePoint 2010, in order to consume the 64-bit libraries).
Related question:
如果你的shell在.NET 4.0(PowerShell 3.0)上运行:
PS> [Environment]::Is64BitProcess
True
To determine in your script what version of PowerShell you're using, you can use the following helper functions (courtesy of JaredPar's answer to an related question):
# 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
}
The above functions make use of the fact that the size of System.IntPtr is platform specific. It is 4 bytes on a 32-bit machine and 8 bytes on a 64-bit machine.
Note, it is worth noting that the locations of the 32-bit and 64-bit versions of Powershell are somewhat misleading. The 32-bit PowerShell is found at C:WindowsSysWOW64WindowsPowerShellv1.0powershell.exe
, and the 64-bit PowerShell is at C:WindowsSystem32WindowsPowerShellv1.0powershell.exe
, courtesy of this article.
You can use this as well. I tested it on PowerShell version 2.0 and 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';
}
The value of $Arch
will either be x86
or amd64
.
The cool thing about doing it this way is that you can also specify a different process ID, besides the local one ( $PID
), to determine the architecture of a different PowerShell process.
上一篇: 使用PowerShell进行递归文件搜索