2024-01-11
作業で作成する事があったのでメモ
こんな感じのCSVファイルを出力するバッチファイル。
@echo off setlocal enabledelayedexpansion set regexport32=apinstalled32.txt set regexport64=apinstalled64.txt set summaryfile32=apsummary32.txt set summaryfile64=apsummary64.txt set reportfile=installreport.csv set temp1=aptemp1.txt set temp2=aptemp2.txt set temp3=aptemp3.txt echo ===== レジストリ情報抽出 実行中 ===== reg query HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall /s >%regexport32% reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /s >%regexport64% echo ===== レジストリ情報集約(32ビット) 実行中 ===== call :SummaryProcess %regexport32% %summaryfile32% 32 echo ===== レジストリ情報集約(64ビット) 実行中 ===== call :SummaryProcess %regexport64% %summaryfile64% 64 echo ===== インストール情報レポート生成 実行中 ===== copy %summaryfile32% /A + %summaryfile64% /A %temp3% /A echo title,prodguid,version,publisher,arch,location >%reportfile% sort /unique %temp3% >>%reportfile% del %temp3% del %summaryfile32% del %summaryfile64% echo ===== 処理終了 ===== exit /b 0 rem *** レジストリ情報集約処理 :SummaryProcess echo == レジストリ情報整形 実行中 == type nul >%temp1% for /F "delims=" %%a IN (%1) DO ( set L=%%a echo !L: = ! >>%temp1% ) echo == レジストリ情報集約 実行中 == set apname= set versionnumber= set prodguid= set publisher= set localtion= type nul >%temp2% for /F "tokens=1,2,3 delims= " %%a IN (%temp1%) DO ( if /I "%%a" NEQ "" ( if /I "%%b" EQU "" ( if /I "%%c" EQU "" ( echo "!apname!","!prodguid!","!versionnumber!","!publisher!","%3","!localtion!" >>%temp2% set apname= set versionnumber= set prodguid= set publisher= set localtion= ) ) ) if "DisplayName"=="%%a" (set apname=%%c) else if "DisplayVersion"=="%%a" (set versionnumber=%%c) else if "InstallLocation"=="%%a" (set localtion=%%c) else if "ProductGuid"=="%%a" (set prodguid=%%c) else if "Publisher"=="%%a" (set publisher=%%c) ) echo "!apname!","!prodguid!","!versionnumber!","!publisher!","%3","!localtion!" >>%temp2% echo == 重複情報削除 生成中 == sort /unique %temp2% > %2 del %temp1% del %temp2% exit /b
64bit版のOSでの実行を想定しています。インストール情報はREGコマンドを使い以下レジストリキーから取得します。
抽出したインストール情報は空白4つで区切りとしているように見えるので、空白4つをタブに置換えます。
以下は定義された環境変数Lの内容で空白4つの部分をタブに置換える記述です。
echo %L:<空白4文字>=<タブ1文字>%
ただし、for文の中で遅延環境変数による問題が起きるので%Lではなく!Lで操作しています。
echo !L:<空白4文字>=<タブ1文字>!
指定ファイルの1行をタブ区切りで分解します。分解結果は
この記述だと1番目が%%a、2番目が%%b、3番目が%%cに格納されます。
%%xとした場合は1番目が%%x、2番目が%%y、3番目が%%zに格納されます。
%%z以降は展開されないので分解して取り出す個数には注意してください。
for /F "tokens=1,2,3 delims=<タブ1文字>" %%a IN (<ファイル名>) DO ( … … )
SORTコマンドにはマニュアルやヘルプに無いオプションがあります。オプション /unique を指定するとソートした上で重複行があれば1行に集約します。
sort /unique <ファイル名>