Windows
コマンドプロンプトでインストールソフト一覧を取得する(64bitOS対応版)
ヤス
更新日:2022/05/09
はじめまして、ヤスです。
調べるのに時間がかかった情報や(英語サイトしか情報がない情報など)、情報がないので自作したモノなどを紹介していきます。
※動作検証環境:Microsoft Windows 64bit [Version 6.1.7601]
WindowsPCのインストールソフトを取得したい
Windowsマシンのインストールソフトの一覧を取得する必要があったので、コマンドプロンプト(バッチファイル)で対応しようと思い調べたところ、regコマンド(reg query)でレジスト内のUninstall情報から取得できることがわかりました。
Uninstall情報のあるレジストリパス
・HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
OSが64bit版の場合は、Uninstall情報のあるレジストリパスはもう一箇所あるので注意!
上記のレジストリパスから情報を取得して、実際にインストールされているソフトと比較した所、なぜかソフトの数が合わない・・・。
調べた結果、どうやらOSが64bit版の場合、上記のパスは64bit対応のソフト情報のみ格納されてようです。
32bit対応のソフト情報は別の箇所に保存されているので、追加で情報を取得する必要があります。
32bit対応のUninstall情報のあるレジストリパス
・HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
インストールソフト取得バッチファイル
64bitOSに対応したインストールソフトを取得するバッチファイル(.bat形式で保存)は以下になります。
ソースコード説明
・reg queryで取得できる情報のなか、ソフト名の記載されているDisplayNameの項目のみ取得しています
・セキュリティ用の更新ソフトは不要なので、「更新、修正、KB」などが含まれている場合は無視しています
・64bitと32bitの両方に対応している場合、ソフト名が重複するので削除しています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@echo off rem ソフトウェアの一覧情報のパスを指定(64bit版用にWow6432Node)を追加 echo "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" > registry_path.txt echo "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" >> registry_path.txt rem ソフトウェア名をファイルに出力(DisplayNameで開始している行のみ、セキュリティの更新ソフトは無視) for /F "delims=" %%A IN (registry_path.txt) DO ( for /F "tokens=2,*" %%I in ('reg query %%A /s ^| findstr "\<DisplayName" ^| findstr /V "更新 修正 (KB"') do ( echo %%J >> install_list.txt ) ) rem ソフトウェア名の昇順で並び替え sort install_list.txt > install_sort_list.txt rem 重複しているソフトウェア名があるので、重複データを削除 type nul > install_list.txt for /f "delims=" %%I in (install_sort_list.txt) do findstr /X /C:"%%I" install_list.txt >NUL || (echo;%%I) >> install_list.txt rem 不要なファイルの削除 del registry_path.txt del install_sort_list.txt |