treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

WindowsUpdate履歴を簡単に確認するバッチファイル

久々にバッチファイルを作成してみたので、ご報告します。
Windows Updateの履歴をコマンドラインから確認したいとき、でも普段使わないからオプションとかコマンドを覚えていない、というそんなとき、使えるかも。

バッチファイルで簡単実行

以前に、コマンド「wmic qfe」でWindows Updateの適用履歴を一覧にする方法をご報告しておりました。

blog.treedown.net

これ、もうちょっとどうにかできないかと考えて、よく使いそうなオプションや別コマンドでのKB一覧表記を網羅してバッチファイル化してみました。

GUIがあるサーバなら特にこれを使う必要もないのですが、ServerCore環境やHyper-V Serverのようにコマンドプロンプトしか用意されていない環境では簡単操作で履歴確認ができるので、結構使えるのではないかと思いました。

あ、あと、Windows Updateの更新の履歴が正常動作していないOS上でも重宝しています。

使い方

まず簡単に使い方を。

バッチファイルを起動すると、

f:id:treedown:20200224171224p:plain
メニューが表示されます。ここで[1]を入力してEnter。

f:id:treedown:20200224171235p:plain
バッチファイルを実行したコンピュータで適用されている更新プログラムがKB順に一覧で表記されます。
メニューで[2]を選択(入力)してEnterしていると、

f:id:treedown:20200224171250p:plain
こんな感じで日付情報を含めたKB適用が一覧されます。
違いは純粋にKBだけ一覧されるかと、日付などの付加情報込みで一覧されるかの違い(使われているコマンドが違う)になります。

メニューで[3]を選択(入力)してEnterすると、次のメニュー(子メニュー)が表示されます。

f:id:treedown:20200224171306p:plain
ここで[1]を入力してEnterすると、

f:id:treedown:20200224171321p:plain
こんな具合に、KB番号を指定して、

f:id:treedown:20200224171334p:plain
入力したKB番号をもとにインストール済かどうかを確認できる画面を出します。(画面はKB4524244を確認したところ)

メニューで[2]を選択(入力)してEnterしていると、西暦で年を、次いで月の入力を促されるので入力していくと、

f:id:treedown:20200224171349p:plain
こういう感じになります。たとえば画面は2020年2月にインストールした更新プログラムを検索したところ。

最後にメニューで[3]を選択(入力)してEnterすると、

f:id:treedown:20200224171405p:plain
保存するファイル名と保存先が聞かれるので、適宜入力して処理を完了させると、HTML形式でインストール済の更新プログラムの一覧を出力できます。

ちなみに、保存場所をカレントディレクトリから変えることも出来るようにしてあって、

f:id:treedown:20200224171425p:plain
こんな感じで、カレントディレクトリに保存しないようにし、フルパスで保存先を入力すると、保存可能。(実体はコマンドなので、保存先をアクセス権のあるファイルサーバの共有フォルダでも可能、なはず)

保存されたHTML形式のファイルは、お好きなように使えます。

f:id:treedown:20200224171438p:plain
このような感じで、ちょっとした操作で更新プログラムの状況を情報収集可能なので、面倒なコマンドを覚えなくていい、というメリットがあるかなと。

バッチファイル

以下がバッチファイルになります。これをコピー&ペーストして、適当なファイル名.batで保存すると、実行可能になります。

::---------------------------------------------------------------------
::バッチファイル
::---------------------------------------------------------------------

@echo off
:startwulistmgr
set NUM=
set KBNUM=
set DMONTH=
set DYEAR=
set flname=
set dirname=
set Rtry=
set days=%date:~2,2%%date:~5,2%%date:~8,2%
CLS
echo ----------------メニュー----------------
echo [1] インストール済の更新プログラムを一覧
echo [2] インストール日を含め更新プログラム一覧表示
echo [3] 条件を指定し確認したいKBを表示する
echo [4] このバッチファイルの処理を終了する
echo -----------------------------------------
set /p NUM="実行する処理が記載された番号を入力してください >"
if "%NUM%"=="1" goto sysinfokblist
if "%NUM%"=="2" goto wmiqfelist
if "%NUM%"=="3" goto wmifndkb
if "%NUM%"=="4" goto endMsg
goto NoNumber

:NoNumber
echo ちゃんと指定された番号を入力してください。
goto startwulistmgr

:sysinfokblist
systeminfo | find "]: KB"
echo .
echo 必要な情報はメモ帳などに転記してください。
echo .
pause
goto end

:wmiqfelist
wmic qfe list | more
echo .
echo 必要な情報はメモ帳などに転記してください。
echo .
pause
goto end

:wmifndkb
CLS
echo ----------------メニュー----------------
echo [1] インストール済のKB番号を指定して表示
echo [2] インストール年-月を指定して表示
echo [3] 全ての更新プログラム一覧をHTML出力する
echo [4] 処理を終了(前のメニューに戻ります。)
echo -----------------------------------------
set /p NUM="実行する処理が記載された番号を入力してください >"
if "%NUM%"=="1" goto specifykb
if "%NUM%"=="2" goto specifyyandm
if "%NUM%"=="3" goto htmloutput
if "%NUM%"=="4" goto startwulistmgr
goto NoNumber2

:specifykb
echo 検索したいKB番号を入力するには KB0000000 とします。前方一致も可能です。
set /p KBNUM="検索条件を入力してください。 >"
echo -------------------------------------------------------------------------
echo "%KBNUM%"をキーワードとした更新プログラムの履歴一覧です。
echo -------------------------------------------------------------------------
echo Caption CSName Description FixComments HotFixID InstallDate InstalledBy InstalledOn Name ServicePackInEffect Status
wmic qfe list | find "%KBNUM%"
echo .
echo 画面がクリアされるので必要な情報はメモ帳などに転記してください。
echo メニューに戻ります。
echo .
pause
goto wmifndkb

:specifyyandm
rem echo インストール日時を条件とする場合には MM/DD/YYYY と指定します。
set /p DYEAR="インストール日を検索する年を西暦四桁<YYYY>で入力します。 >"
set /p DMONTH="インストール日を検索する月を入力します。 >"
:chkyandm
echo %DYEAR%年の%DMONTH%月にインストールされた更新プログラムの一覧を表示します。
set /p Rtry="実行は[Y]をキャンセルは[N]を入力しEnterキーを押下します。 >"
if /i %Rtry% == y (goto startcmd)
if /i %Rtry% == n (goto specifyyandm)
echo .
echo 正しく入力してください。
echo .
goto chkyandm

:startcmd
echo -------------------------------------------------------------------------
echo "%DYEAR%年の%DMONTH%月"適用履歴が記載された更新プログラムの履歴一覧です。
echo -------------------------------------------------------------------------
echo Caption CSName Description FixComments HotFixID InstallDate InstalledBy InstalledOn Name ServicePackInEffect Status
wmic qfe list | find " %DMONTH%/" | find "/%DYEAR%"
echo .
echo 画面がクリアされるので必要な情報はメモ帳などに転記してください。
echo メニューに戻ります。
echo .
pause
goto wmifndkb

:htmloutput
rem ファイル名=%flname% ディレクトリ名=%dirname% 日付=%days%
echo .
echo 指定するファイル名には末尾に自動的に生成日時と拡張子を付与します。
set /p flname="生成するHTMLファイルのファイル名を入力してください。 >"
:chkdir
echo .
echo ファイルの保存場所は現在のカレントディレクトリ"%CD%"に"%flname%%days%.htm"を保管します。
set /p Rtry="この場所でよければ[Y]を保存場所を変更する場合は[N]を入力しEnterキーを押下します。 >"
if /i %Rtry% == y (goto curhtmlfile)
if /i %Rtry% == n (goto mekehtmlfile)
echo 正しく入力してください。
goto chkdir

:curhtmlfile
wmic qfe list /format:htable > "%CD%\%flname%%days%.htm"
echo .
echo カレントディレクトリ"%CD%"に"%flname%%days%.htm"を保管しました。
echo メニューに戻ります。
echo .
pause
goto wmifndkb

:mekehtmlfile
set /p dirname="生成するファイル保管場所をフルパスで入力してください。 >"
:chkinputdir
echo .
echo ファイルの保存場所は"%dirname%"に"%flname%%days%.htm"を保管します。
set /p Rtry="この場所でよければ[Y]を保存場所を再入力する場合は[N]を入力しEnterキーを押下します。 >"
if /i %Rtry% == y (goto savehtmlf)
if /i %Rtry% == n (goto mekehtmlfile)
echo 正しく入力してください。
goto chkinputdir

:savehtmlf
wmic qfe list /format:htable > "%dirname%\%flname%%days%.htm"
echo .
echo 指定ディレクトリ"%dirname%"に"%flname%%days%.htm"を保存命令を出しました。
echo アクセス権やパスの実在有無によってファイルの保存がエラーになる場合もあります。
echo 実際に保存されたかどうかは目視で確認してください。
echo メニューに戻ります。
echo .
pause
goto wmifndkb

goto end

:NoNumber2
echo 選択した番号が違います。
goto wmifndkb

:end
rem もう一度処理をするかどうか確認し、処理しない場合終了します。
echo --------------------------------------------------------------
echo 別の更新プログラム適用履歴確認処理を実行する場合には[Y]を
set /p Rtry="この処理を終了するには[N]を入力しEnterキーを押下します。 >"
if /i %Rtry% == y (goto startwulistmgr)
if /i %Rtry% == n (goto endMsg)
goto endMsg

:endMsg
set NUM=
set KBNUM=
set DMONTH=
set DYEAR=
set flname=
set dirname=
set Rtry=
set days=
echo %0 の動作が完了しました。
::---------------------------------------------------------------------
::バッチファイルここまで
::---------------------------------------------------------------------

自分のなかでは、これ、なかなかいいんじゃない?と、バッチファイルを仕上げた直後に思ってたのですが、残念ながらボツになって使われなかった…、これは悲しい。

あまりに悲しいので、誰かの役に立てば幸いと思いました。