#コマンドベースでWindowsの品質更新プログラム(QU)をアンインストールする方法
品質更新プログラム(以下QU)の削除には、wusaコマンドまたはdismコマンドを用いることが考えられます。
wusaコマンドのほうが簡単にkb番号を指定できて使いやすかったのですが、
この記事を記載した時点で/quietオプションと/uninstallオプションがなぜか両立できなかったため、
dismコマンドオプションを使用してスクリプトを作成します。
以下は自分で作成したスクリプトの備忘録になります。
#スクリプト内容
まずは変数定義部分になります。
削除するQU番号を引数で指定しています。
一例をあげると"18362.1082"といったOSビルド番号を指定します。
ここで指定した値が削除される処理となります。
その他はログファイル用の日付などを定義しています。
$OSbuildData_Current=$Args[0]
$ResultPackage_bef1=0
$ResultPackage_aft1=0
$QuPackage_work1=""
$QuPackage=""
$ReturnCheck=1
$ExecuteCheck=$true
$ExecutionDate=Get-Date -Format "yyyyMMddHHmm"
$CheckDate=Get-Date -Format "yyyyMMdd"
ログ出力を定義します。
Start-Transcript C:\Windows\QU_uninstall_$ExecutionDate.txt
引数で渡したOSビルド番号のQUが適用されているかをチェックします。
チェックにもdismコマンドが使用でき、/get-packagesオプションを指定します。/onlineオプションは情報取得先を今のOS領域に定めてます。
このスクリプトでは最初に引数で渡したQUのみを削除したいので、それが存在しない場合には処理を実行しません。
$ResultPackage_bef1=@(dism /get-packages /online | Where-Object { $_ -match $OSbuildData_Current -and $_ -match "RollupFix" }).count
if($ResultPackage_bef1 -ne $ReturnCheck){
echo "実行しない"
$ExecuteCheck=$false
}
dismコマンドで削除パッケージを指定内容は、get-packagesで取得できるパッケージ名をしっかり指定してあげる必要があります。
get-packagesで取得したデータはsplitで不要な内容を削除し、変数にパッケージ名のみが入るようにしてます。
またget-packagesでQUは、"Package_for_RollupFix~~~"と表示されるようです。
なので文字列抽出条件にそちらも入れておきます。
if($ExecuteCheck){
##dismで指定するパッケージIDを特定
$QuPackage_work1=dism /get-packages /online /format:table |Select-String $OSbuildData_Current |Select-String "RollupFix"
##スペース区切りで不要領域を除く
$QuPackage_work2=$QuPackage_work1 -split " "
$QuPackage=$QuPackage_work2[0]
ここが実際にQUがアンインストールされる個所になります。
/remove-package・・・パッケージを削除することを定義
/PackageName:・・・削除するパッケージ名を指定する。
この後に続く値は"Package_for_RollupFix~31bf3856ad364e35~amd64~~18362.1082.1.10"のような具体的なパッケージ名となります。
/online・・・現在のOS領域から削除します。
/Quiet・・・プロンプトを出さずに実行します。
/NoRestart・・・勝手に再起動されないようにします。
echo $QuPackage
echo "アンインストール処理開始"
dism /remove-package /PackageName:$QuPackage /online /Quiet /NoRestart
ここまでif文の中で書いているので、elseも記載しておきます。
}else{
"実行条件に合致しないため、実行しない"
}
削除後のチェックを行います。
正しくアンインストールされていれば、最初に検索した条件ではHITしないはずなので、その件数で比較を行います。
ちなみにdismコマンドを用いて削除すると、消したRollupFixが表示されなくなり、ひとつ前のRollupFixがインストール保留中で待機しています。
$ResultPackage_aft1=@(dism /get-packages /online | Where-Object { $_ -match $OSbuildData_Current -and $_ -match "RollupFix" }).count
if($ResultPackage_aft1 -lt $ReturnCheck){
echo "実施_削除成功"
}else{
echo "実施_削除失敗"
}
ログの出力を止めます。
Stop-Transcript
#総括
このスクリプトを作成する前にWEBで調査していたら、
たいていwusaコマンドに/uninstall /quiet /norestartオプションをつけて、コマンドベースの削除を行っておりました。
しかし自分の環境ではなぜか動かず。。最近仕様が変わったのかもしれません。
同じような環境にいる方は参考にしてください。