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

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

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

相关问题:

【问题讨论】:

    标签: scripting powershell 64-bit 32-bit


    【解决方案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 }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-04
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        相关资源
        最近更新 更多