努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:windows:batch:batch-011

インストールアプリ一覧をcsvファイルに出力するバッチ例

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コマンドを使い以下レジストリキーから取得します。

  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
    32bitアプリケーションの情報
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    64bitアプリケーションの情報

抽出したインストール情報は空白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 <ファイル名>
documents/windows/batch/batch-011.txt · 最終更新: 2024/01/11 01:42 by k896951

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki