确定当前 PowerShell 进程是 32 位还是 64 位?

发布于 2024-12-22 15:47:56 字数 532 浏览 0 评论 0原文

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

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

相关问题:

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 (i.e. using 64-bit for a script for SharePoint 2010, in order to consume the 64-bit libraries).

Related question:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

超可爱的懒熊 2024-12-29 15:47:56

如果您的 shell 在 .NET 4.0 (PowerShell 3.0) 上运行:

PS> [Environment]::Is64BitProcess
True

If you're shell is running on .NET 4.0 (PowerShell 3.0):

PS> [Environment]::Is64BitProcess
True
狼性发作 2024-12-29 15:47:56

要确定在脚本中使用的 PowerShell 版本,您可以使用以下辅助函数(由 JaredPar 的提供<一个href="https://stackoverflow.com/questions/602060/what-is-the-best-way-to-program-against-powershells-x64-vs-x86-variability/602275#602275">答案 到一个相关问题):

# 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字节。

请注意,值得注意的是,32 位和 64 位版本的 Powershell 的位置有些误导。 32 位 PowerShell 位于 C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe,64 位 PowerShell 位于 C:\Windows\System32\ WindowsPowerShell\v1.0\powershell.exe,由此 文章< /a>.

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:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe, and the 64-bit PowerShell is at C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe, courtesy of this article.

深居我梦 2024-12-29 15:47:56

您也可以使用这个。我在 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 始终返回当前进程的环境,无论您在哪个进程上执行它。

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.

EDIT:

The caveat is that Process.StartInfo.EnvironmentVariables always returns the environment of the current process, no matter which process you execute it on.

〆凄凉。 2024-12-29 15:47:56

随着 Windows 本身(和 PowerShell)现在支持更多架构(例如 ARM64),检查应用程序是否是 64 位可能并不总是足够。

在 ARM64 上运行的 Windows 上,[Environment]::Is64BitProcess 也会返回 True,因此,如果您真正需要知道的是您是否正在运行,则不能依赖它AMD64。为此,在 Windows 上,您可以使用以下环境变量:

$Env:PROCESSOR_ARCHITECTURE,它返回诸如 AMD64Arm64 或 <代码>x86。

With Windows itself (and PowerShell) now supported on more architectures, like ARM64, it might not always be enough to check whether the application is 64-bit.

[Environment]::Is64BitProcess will also return True on Windows running on ARM64, so you cannot rely on it if what you really need to know is whether you're running on AMD64. To do this, on Windows you can use the following environment variable:

$Env:PROCESSOR_ARCHITECTURE, which returns values like AMD64, Arm64, or x86.

一向肩并 2024-12-29 15:47:56
Switch([IntPtr]::size * 8) {

32 { <#your 32 bit stuff#> ;break }

64 { <#your 64 bit stuff#> ;break }

}
Switch([IntPtr]::size * 8) {

32 { <#your 32 bit stuff#> ;break }

64 { <#your 64 bit stuff#> ;break }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文