确定当前 PowerShell 进程是 32 位还是 64 位?
在 x64 位操作系统平台上运行 PowerShell 脚本时,如何在脚本中确定该脚本运行的 PowerShell 版本(32 位或 64 位)?
背景
默认情况下,32 位和 64 位版本的 PowerShell 均安装在 64 位平台(例如 Windows Server 2008)上。当运行必须针对特定体系结构(即使用 64 位)的 PowerShell 脚本时,这可能会导致困难。用于 SharePoint 2010 的脚本,以便使用 64 位库)。
相关问题:
- 什么是针对 powershell 的 x64 与 x86 可变性进行编程的最佳方法? 这个问题涉及针对 32 位和 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:
- 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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果您的 shell 在 .NET 4.0 (PowerShell 3.0) 上运行:
If you're shell is running on .NET 4.0 (PowerShell 3.0):
要确定在脚本中使用的 PowerShell 版本,您可以使用以下辅助函数(由 JaredPar 的提供<一个href="https://stackoverflow.com/questions/602060/what-is-the-best-way-to-program-against-powershells-x64-vs-x86-variability/602275#602275">答案 到一个相关问题):
上述函数利用了以下事实: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):
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 atC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
, courtesy of this article.您也可以使用这个。我在 PowerShell 2.0 和 4.0 版本上测试了它。
$Arch
的值将为x86
或amd64
。编辑:
需要注意的是
Process.StartInfo.EnvironmentVariables
始终返回当前进程的环境,无论您在哪个进程上执行它。You can use this as well. I tested it on PowerShell version 2.0 and 4.0.
The value of
$Arch
will either bex86
oramd64
.EDIT:
The caveat is that
Process.StartInfo.EnvironmentVariables
always returns the environment of the current process, no matter which process you execute it on.随着 Windows 本身(和 PowerShell)现在支持更多架构(例如 ARM64),检查应用程序是否是 64 位可能并不总是足够。
在 ARM64 上运行的 Windows 上,
[Environment]::Is64BitProcess
也会返回True
,因此,如果您真正需要知道的是您是否正在运行,则不能依赖它AMD64。为此,在 Windows 上,您可以使用以下环境变量:$Env:PROCESSOR_ARCHITECTURE
,它返回诸如AMD64
、Arm64
或 <代码>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 returnTrue
on Windows running on ARM64, so you cannot rely on it if what you really need to know is whether you're running onAMD64
. To do this, on Windows you can use the following environment variable:$Env:PROCESSOR_ARCHITECTURE
, which returns values likeAMD64
,Arm64
, orx86
.