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:

  • What is the best way to program against powershell's x64 vs. x86 variability? This question deals with code running against both 32-bit and 64-bit architectures. My question deals with the case when you want to ensure the script only runs against the correct version.

  • 如果你的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.

    链接地址: http://www.djcxy.com/p/4950.html

    上一篇: 使用PowerShell进行递归文件搜索

    下一篇: 确定当前的PowerShell进程是否为32