Windowsの更新プログラムにて、不要な更新プログラムがあった場合は、コントロールパネルから手動でアンインストールをする必要がありますが、複数の更新プログラムを1つ1つをアンインストールするのは時間がかかります。
そこで、コマンドプロンプトのバッチファイルで適用すれば、複数のセキュリティ更新プログラムを一括でアンインストールができ効率的です。
今回は、前回登場したDISMコマンドを利用したバッチファイルを作成します。
バッチファイルにて実現したいこと
バッチファイルにて実現したいことは、以下の3点になります。
更新プログラムをインストールするバッチファイル
作成したバッチファイルは、以下の通りになります。
@echo off @chcp 65001 @set str1=開始: @set str2=終了: @set log=C:\WindowsUninstallDism\Log\ @set list=C:\WindowsUninstallDism\PatchList.txt @echo %str1% %DATE% %TIME% > %log%\UnistallUpdateDism.txt @systeminfo >> %log%\UnistallUpdateDism.txt @for /f %%a in (%list%) do ( dism /online /Remove-Package /PackageName:%%a /Quiet /NoRestart ) @echo %str2% %DATE% %TIME% >> %log%\UnistallUpdateDism.txt @systeminfo >> %log%\UnistallUpdateDism.txt
コマンドの説明
コマンドについて、上から順番に説明します。
@echo off
@echo offは、バッチファイルにコマンドが表示されないようにするためのコマンドです。
それぞれの頭に@を付与することにより、表示されないようになります。
逆に表示されるするには、@をつけないと表示されます。
デフォルトでは、@echo onになっていますので、表示されます。
@chcp 65001
バッチファイルはコマンドプロンプトで動作するので、Shift-JISになっていると文字化けの原因になりますので、UTF-8にして文字化けを起こさないようにしてます。
他の人達の環境にもよりますが、私の環境では、文字化けをしてしまったので、記載してます。
@set str1 / str2
setは、変数を定義するコマンドになります。
@set str1=開始:は、str1という変数名の箱の中に、開始:という文字を格納しています。
@set str2=終了:も、str2という変数名の箱の中に、終了:という文字を格納しています。
また、変数を呼び出す時は、%変数名%で呼び出すことができます。
例えば、開始:を呼び出したい場合は、%str1%になります。
@set log / list
@set log=C:\WindowsUninstallDism\Log\は、ログを格納するフォルダパスを変数 logに格納してます。
@set list=C:\WindowsUninstallDism\PatchList.txtは、パッケージIDをが記載されたテキストファイルのフォルダパスを変数 listに格納してます。
@echo %str1% %DATE% %TIME% > %log%\UnistallUpdateDism.txt
%str1%には、開始:が格納してます。
%DATE%には、今日の日付が格納してます。
%TIME%には、時分秒が格納しています。
つなぎ合わせると、開始:年月日時分秒のテキストが生成されます。
これを、>%log%\UnistallUpdateDism.txtにて、開始:年月日時分秒のテキストをUnistallUpdateDism.txtに上書きで挿入してます。
これが、バッチ開始の時間になります。
@systeminfo >> %log%\UnistallUpdateDism.txt
アンインストール前と後に比較ができるように、UnistallUpdateDism.txtに追記で、アンインストール前に、systeminfoの結果を追記で出力します。
確認する箇所は、ホットフィックス覧にて、アンインストール対象のKB番号があることです。
@for文
@for /f %%a in (%list%)
では、for文は繰り返しの処理が行われます。/fオプションは、ファイルまたはコマンドの実行結果を行単位で変数に読み込み繰り返し処理を行えます。
%%aは、任意の変数名を指定して、繰り返し行えるようにします。
(%list%)は、PatchList.txtに記載したパッケージIDを読み込んでますので、%%aには、PatchList.txtに記載したパッケージIDの一行目が格納されてます。そして、一行目のパッケージIDのアンインストールが完了したら、二行目、三行目、・・・という感じで、すべてのパッチファイルの行を読み込まれるまで処理が繰り返されます。
実行処理はdo(~)の中に記載します。
do (
dism /online /Remove-Package /PackageName:%%a /Quiet /NoRestart
)
更新プログラムをインストールするためのコマンドにて、dism /online /Remove-Package /PackageName:%%aとなっています。%%aには、パッケージIDを記載したファイル名を書き出したテキストファイルを参照してます。
こちらを参照して、一行目のファイル名を読み込んでます。
例えば、10個のパッケージIDを格納したら、10個のパッケージIDがパッチリストに書き出されて、一行目のパッケージIDを読み込んで、インストールして、次に二行目のパッケージIDを読み込んで、インストールしたら、次に、3行目・・・のように、テキストファイルのパッケージIDをすべて読み込んで、アンインストールをするまで繰り返します。
以降のコマンドは、前回の記事で記載しておりますので、省略させていただきます。
@echo %str2% %DATE% %TIME% >> %log%\UnistallUpdateDism.txt
%str2%には、終了:が格納してます。
%DATE%には、今日の日付が格納してます。
%TIME%には、時分秒が格納しています。
つなぎ合わせると、開始:年月日時分秒のテキストが生成されます。
これを、>%log%\UnistallUpdateDism.txtにて、終了:年月日時分秒のテキストをUnistallUpdateDism.txtに追記で挿入してます。
これが、バッチ終了の時間になります。
@systeminfo >> %log%\UnistallUpdateDism.txt
アンインストールが完了したかどうかを確認するために、UnistallUpdateDism.txtの最後に、systeminfoの結果を追記で出力します。ホットフィックス覧にて、アンインストールしたKB番号がなければ、完了です。
次の記事で、設定方法とバッチ試験を記載していますので、是非、参照をお願いします。