PowerShellで32bit / 64bitアプリを判別する方法は、レジストリ・実行ファイル・インストール情報のいずれかを確認すれば正確に判別できます。特にレジストリの「Uninstall」キーをPowerShellで取得する方法が最も実用的で、管理者権限が不要なケースも多く、スクリプト化にも向いています。本記事では、現場でそのまま使える判別方法を、具体的なPowerShellコマンド付きで解説します。
Windows環境では、同じアプリ名でも32bit版と64bit版が存在することがあります。トラブルシューティングや資産管理、配布スクリプト作成時に、どちらがインストールされているかを判別できないと誤動作の原因になります。PowerShellを使えば、GUIを開かずに正確に判定できます。
32bit版と64bit版の違いを簡単に整理
Windowsではアプリのビット数によって保存場所やレジストリの場所が異なります。
| 項目 | 32bitアプリ | 64bitアプリ |
|---|---|---|
| 既定のインストール先 | C:\Program Files (x86) | C:\Program Files |
| レジストリの場所 | Wow6432Node 配下 | 通常の Uninstall 配下 |
| 使用可能なメモリ | 最大約4GB | OS制限まで使用可能 |
この違いを利用してPowerShellで判別します。
方法1:レジストリからインストール済みアプリのビット数を判別する
最も一般的で正確な方法です。以下の2つのレジストリキーを参照します。
64bitアプリ
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
32bitアプリ
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
PowerShellで一覧取得する例です。
|
1 2 3 4 5 |
$apps64 = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion $apps32 = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion |
この結果を比較すれば、どちらに登録されているかで32bitか64bitかを判別できます。
特定のアプリを調べる場合は、次のようにします。
|
1 2 3 4 5 6 7 8 9 |
$target = "Google Chrome" Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_.DisplayName -like "*$target*" } | Select-Object DisplayName, DisplayVersion, PSChildName Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_.DisplayName -like "*$target*" } | Select-Object DisplayName, DisplayVersion, PSChildName |
64bit側でヒットすれば64bit版、32bit側でヒットすれば32bit版です。
本記事で紹介しているレジストリ取得方法を応用すれば、インストール済みソフトの一覧作成も可能です。詳しい手順は以下をご参照ください。
方法2:実行ファイルからビット数を判別する
exeファイルのヘッダ情報を調べる方法です。インストール先が不明な場合や、ポータブルアプリにも使えます。
|
1 2 3 4 5 6 |
Get-Item "C:\Program Files\App\App.exe" | Select-Object Name, @{Name="Platform";Expression={ if ([System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.FullName).FileDescription) { if ($_ -is [System.IO.FileInfo]) { "確認対象" } } }} |
より正確に調べる方法は、CorFlagsツールやdumpbinを使いますが、標準PowerShellだけで行うなら、インストール先フォルダでの判別が現実的です。
例:
C:\Program Files → 64bit
C:\Program Files (x86) → 32bit
|
1 2 3 4 5 6 7 |
$path = "C:\Program Files (x86)\SampleApp\app.exe" if ($path -like "*Program Files (x86)*") { "32bitアプリです" } elseif ($path -like "*Program Files*") { "64bitアプリです" } |
方法3:インストール済みアプリを一覧で32bit/64bit分類する
両方のレジストリを統合して一覧表示する方法です。
|
1 2 3 4 5 6 7 8 9 10 |
$apps64 = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_.DisplayName } | Select-Object DisplayName, DisplayVersion, @{Name="Bit";Expression={"64bit"}} $apps32 = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_.DisplayName } | Select-Object DisplayName, DisplayVersion, @{Name="Bit";Expression={"32bit"}} $apps = $apps64 + $apps32 $apps | Sort-Object DisplayName |
この方法を使えば、管理台帳作成や棚卸しにそのまま利用できます。
方法4:PowerShell自体のビット数を確認する
参考として、PowerShellが32bitか64bitかを確認する方法です。アプリ判別とは別ですが、スクリプト挙動に影響するため重要です。
|
1 |
[Environment]::Is64BitProcess |
Trueなら64bit版PowerShell、Falseなら32bit版PowerShellです。
判別方法の使い分け
| 状況 | 推奨方法 |
|---|---|
| インストール済みアプリを調べたい | レジストリ確認 |
| exeファイル単体を調べたい | インストール先パス |
| 一覧化したい | レジストリ統合スクリプト |
| PowerShell環境を確認したい | Is64BitProcess |
よくある質問(Q & A)
- コントロールパネルでは32bitか64bitか分からないのですか?
-
基本的には表示されません。Program Files (x86)にあれば32bitと判断できますが、確実なのはレジストリ確認です。
- 同じアプリが32bitと64bit両方インストールされることはありますか?
-
あります。特にJavaやODBCドライバなどは両方必要なケースがあります。その場合、レジストリ両方に登録されます。
- 管理者権限は必要ですか?
-
参照だけであれば通常は不要です。ただし、レジストリ制限環境では管理者権限が必要になる場合があります。
- PowerShellスクリプトで自動判別して処理を分けられますか?
-
可能です。32bit版検出時のみ特定のインストーラーを実行する、といった分岐処理が実装できます。
まとめ
PowerShellで32bit / 64bitアプリを判別するには、レジストリのUninstallキーを参照する方法が最も確実です。実行ファイルの場所による判定は補助的に使い、一覧化する場合は両レジストリを統合して表示すると管理が容易になります。運用スクリプトや資産管理に組み込むことで、アプリのビット数違いによるトラブルを未然に防ぐことができます。



