現在のPowerShellプロセスが32ビットか64ビットかを判断しますか?


83

x64ビットOSプラットフォームでPowerShellスクリプトを実行する場合、スクリプトで実行されているPowerShellのバージョン(32ビットまたは64ビット)をスクリプトでどのように判断できますか?

背景
32ビットバージョンと64ビットバージョンの両方のPowerShellは、Windows Server 2008などの64ビットプラットフォームにデフォルトでインストールされます。これにより、特定のアーキテクチャをターゲットにする必要があるPowerShellスクリプトを実行すると、問題が発生する可能性があります(つまり、64ビットを使用する)。 64ビットライブラリを使用するためのSharePoint2010のスクリプトのビット)。

関連する質問:

回答:


142

シェルが.NET4.0(PowerShell 3.0)で実行されている場合:

PS> [Environment]::Is64BitProcess
True

シェイ、非常に便利なコードスニペットを共有してくれてありがとう。+1残念ながら、私はPowerShell v2で実行していますが、これを答えとして受け入れて満足しています。
MagicAndi 2011

5
これを答えとして受け入れてくれてありがとう、しかしあなたはそれを@MagicAndiに与えるべきです、彼の答えはバージョンに関係なく機能します。
Shay Levy 2011

2
@ShayLevyいいえ、将来的に適用可能になるものを受け入れる方が間違いなく良いです。2018年には、PowerShell2の関連性は大幅に低下しました。
jpmc26 2018

83

スクリプトで使用しているPowerShellのバージョンを判別するには、次のヘルパー関数を使用できます(関連する質問に対するJaredParの 回答の提供)。

# 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あります


この回答に基づいて、文字列の値を使用するための最も便利な方法は次のとおり[IntPtr]::size * 8です。これは、8にサイズを掛けて、アーキテクチャに応じて32/64になります。例:"$([IntPtr]::size * 8)bit"
Sebastian

2
参考までに、32ビットのコマンドラインから64ビットのプロセスを起動するには、「System32」を「sysnative」に置き換えます。C:\ Windows \ sysnative \ WindowsPowerShell \ v1.0 \ powershell.exe "[IntPtr] :: size"
JohnP2 2018年

13

これも使えます。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どのプロセスで実行しても、常に現在のプロセスの環境を返すことです。


どうもありがとう。上記のスクリプトは、問題の解決に役立ちました:)
santosh kumar patro 2014

5
Process.StartInfo.EnvironmentVariablesどのプロセスで実行するかに関係なく、常に現在のプロセスの環境を返します。$env:PROCESSOR_ARCHITECTURE現在の環境にアクセスする場合にのみ使用します。これはPowerShell1.0 upAFAIKです。確かに2.0。で環境を一覧表示できますls env:
JT。

$ Is64bit = $ env:PROCESSOR_ARCHITECTURE -eq'AMD64 '
Nathan Hartley

2

Windows自体(およびPowerShell)がARM64などのより多くのアーキテクチャでサポートされるようになったため、アプリケーションが64ビットであるかどうかを確認するだけでは必ずしも十分ではない場合があります。

[Environment]::Is64BitProcessTrueARM64で実行されているWindowsでも返されるため、で実行されているかどうかを本当に知る必要がある場合は、信頼できませんAMD64。これを行うには、Windowsで次の環境変数を使用できます。

$Env:PROCESSOR_ARCHITECTURE、その戻り値は次のようにAMD64Arm64またはx86


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

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

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

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.