0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

品質機能更新プログラム(QU)の削除スクリプト

Last updated at Posted at 2020-09-29

#コマンドベースで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オプションをつけて、コマンドベースの削除を行っておりました。

しかし自分の環境ではなぜか動かず。。最近仕様が変わったのかもしれません。
同じような環境にいる方は参考にしてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?