PowerShellスクリプトをx64ビットOSプラットフォームで実行する場合、スクリプトでをどのように判断できますかスクリプトが実行されているPowerShellのバージョン(32ビットまたは64ビット) ?
背景
Windows Server 2008などの64ビットプラットフォームには、32ビット版と64ビット版の両方のPowerShellがデフォルトでインストールされます。これにより、特定のアーキテクチャを対象とするPowerShellスクリプトを実行するときに問題が発生する可能性があります(つまり、64ビットライブラリを使用するために、SharePoint 2010のスクリプトに64ビットを使用します。
関連する質問:
シェルが.NET 4.0(PowerShell 3.0)で実行されている場合:
PS> [Environment]::Is64BitProcess
True
使用しているPowerShellのバージョンをスクリプトで判断するには、次のヘルパー関数を使用できます(関連する質問に対して JaredPar'sanswer を提供):
# 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バイトです。
Powershellの32ビットバージョンと64ビットバージョンの場所が多少誤解を招く可能性があることに注意してください。 32ビットのPowerShellはC:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
にあり、64ビットのPowerShellはC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
にあります。これは 記事 のおかげです。
これも使用できます。 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
の値は、x86
またはAMD64
のいずれかになります。
この方法で行うことの素晴らしい点は、ローカルのプロセスID($PID
)に加えて別のプロセスIDを指定して、異なるPowerShellプロセスのアーキテクチャを決定できることです。
Switch([IntPtr]::size * 8) {
32 { <#your 32 bit stuff#> ;break }
64 { <#your 64 bit stuff#> ;break }
}