このＰｏｗｅｒＳｈｅｌｌでＷｉｎｄｏｗｓにＵｐｄａｔｅを

マイクロソフトスクリプトセンターにある「PSWindowsUpdate」という
WindowsUpdateをPowerShellで行うための補助バッチを作成しました。

PSWindowsUpdate.cmd を実行すると
ダウンロード、解凍、モジュールの組込、WindowsUpdate実行、再起動を自動で行い
再起動の必要が無くなるまでUpdateと再起動を繰り返す事が出来ます。
WindowsUpdate終了後、メールを飛ばしたり、Ｗａｖを再生する事も出来ます。
WindowsUpdate完了後、モジュールを削除するのでキッティングに便利です。

サイレントも対応したので、PSWindowsUpdate.cmd内の環境変数に
必要な記述をしておけば、ダイアログの応答無しでWindowsUpdateが出来ます。

元ソースは、マイクロソフトテクニカルエバンジェリストの安納さんが公開された
スクリプトをちょっこし改造し、vbsやcmdで処理を補ってます。

Kirito1617 さんの紹介記事で辿り着いたのですが
PowerShell、vbs、Markdownのスキルがない私は壁にぶち当たり
母国語であるcmdに書き換える事で何とか使用可能になりました。

使用方法は
管理者でログオンし、管理者として実行をして下さい。
Windows10の監査モードならダブルクリックだけで実行可能です。
特にWindows8.1は、監査モードでWIndowsUpdateが出来ない仕様だそうで
このモジュールの使用価値は、十分あると思います。

WindowsUpdate実行・再起動→WindowsUpdate実行・再起動を連続で行いたい場合
自動ログオンを有効にしておいてください。

環境の作成方法は、適当なフォルダを作って
3個のvbs、1個のps1、1個のcmdを保存して下さい。

敵当なフォルダ
┣inputbox.vbs
┣msgbox.vbs
┣OpenFileDialog.ps1
┣PSWindowsUpdate.cmd
┗sendmail.vbs

適当なフォルダからPSWindowsUpdate.cmdを起動しますが
ログオンユーザーのDocumentsフォルダにモジュールを作成しますので
既にシステムフォルダにモジュールを作成されている場合は
移行かソースの変更で対応をお願いします。

---------------------------------------------------------

```inputbox.vbs
Option Explicit
REM ------------------------------------------------------
REM inputbox.vbs str1 , str2 [,mode]
REM     str1:入力するデータの説明文
REM     str2:inputboxのタイトル
REM     str3:既定の入力データ
REM （動作）
REM データの入力を行う為の入力ボックスを表示します。
REM 入力された文字列データを返します。
REM str1 中の 「crlf」という文字列は改行に変換します。
REM ------------------------------------------------------
Dim args, arg(99), v, cnt
Dim str1, str2, str3
Dim mode
Dim respond, eLevel
Dim CRLF
REM 改行符号を設定します。
CRLF = chr(13) & chr(10)
Set args = WScript.Arguments
cnt = 1
For Each v In args
    arg(cnt) = v
        cnt  = cnt + 1
Next
eLevel  = 0: REM エラーが発生したときに値を設定します。
respond = "": REM 呼び出し元への戻り値を設定します。
REM --------------------------------
REM 改行文字の置き換え
arg(1) = RepExAll (arg(1), "crlf", CRLF)
eLevel = 0
Select Case args.Count
    Case 0:    mode = InputBox ()
    Case 1:    mode = InputBox (arg(1))
    Case 2:    mode = InputBox (arg(1), arg(2))
    Case Else: mode = InputBox (arg(1), arg(2), arg(3))
End Select
respond = mode
REM --------------------------------
REM 結果の表示
WScript.Echo respond
WScript.Quit (eLevel)
REM ここからサブルーチン=========================================
REM 原稿文字列を正規文字列で検索し、一致する文字をすべて置換文字列に置き換えます。
REM s : 原文字列
REM t : 正規文字列
REM d : 置換文字列
Function RepExAll ( s , t , d )
    Dim regExpression, Matches                ' 変数を作成します。
    Set regExpression        = New RegExp     ' 正規表現を作成します。
    regExpression.Pattern    = t              ' パターンを設定します。
    regExpression.IgnoreCase = True           ' 大文字と小文字を区別しないように設定します。
    regExpression.Global     = True           ' 文字列全体を検索するように設定します。
    RepExAll = regExpression.Replace(s , d)   ' 置換を実行します。
End Function
```

---------------------------------------------------------

```msgbox.vbs
Option Explicit
REM ------------------------------------------------------
REM msgbox.vbs str1 , str2 [,mode]
REM     str1:表示するメッセージ
REM     num :表示するボタンの選択
REM     str2:メッセージボックスのタイトル
REM （動作）
REM メッセージボックスを表示し、クリックされたボタンを
REM 返します。
REM str1 中の 「crlf」という文字列は改行に変換します。
REM ･･･････････････････････････････････････････････････････
REM ボタンの表示選択と動作などの設定（ボタン表示や動作などの値を合計します。）
REM     0 [OK] ボタンのみを表示します。
REM     1 [OK] ボタンと [キャンセル] ボタンを表示します。
REM     2 [中止]、[再試行]、および [無視] の 3 つのボタンを表示します。
REM     3 [はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。
REM     4 [はい] ボタンと [いいえ] ボタンを表示します。
REM     5 [再試行] ボタンと [キャンセル] ボタンを表示します。
REM    16 警告メッセージ アイコンを表示します。
REM    32 問い合わせメッセージ アイコンを表示します。
REM    48 注意メッセージ アイコンを表示します。
REM    64 情報メッセージ アイコンを表示します。
REM     0 第 1 ボタンを標準ボタンにします。
REM   256 第 2 ボタンを標準ボタンにします。
REM   512 第 3 ボタンを標準ボタンにします。
REM   768 第 4 ボタンを標準ボタンにします。
REM     0 アプリケーション モーダルに設定します。
REM       メッセージ ボックスに応答するまで、現在選択中のアプリケーションの実行を継続できません。
REM  4096 システム モーダルに設定します。
REM       メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。
REM ･･･････････････････････････････････････････････････････
REM 戻り値となる文字列
REM   ボタンの名前     -> respondの戻り値
REM     [OK]           -> Ok
REM     [キャンセル]   -> Cancel
REM     [中止]         -> Stop
REM     [再試行]       -> Retry
REM     [無視]         -> Ignore
REM     [はい]         -> Yes
REM     [いいえ]       -> No
REM ------------------------------------------------------
Dim args, arg(99), v, cnt
Dim str1, str2
Dim mode
Dim respond, eLevel
Dim CRLF
REM 改行符号を設定します。
CRLF = chr(13) & chr(10)
Set args = WScript.Arguments
cnt = 1
For Each v In args
    arg(cnt) = v
    cnt = cnt + 1
Next
REM 改行文字の置き換え
arg(1) = RepExAll (arg(1), "crlf", CRLF)
eLevel = 0
Select Case args.Count
    Case 0:    mode = 0: eLevel = 1
    Case 1:    mode = MsgBox (arg(1))
    Case 2:    mode = MsgBox (arg(1), arg(2))
    Case Else: mode = MsgBox (arg(1), arg(2), arg(3))
End Select
Select Case mode
    Case 0: respond = ""
    Case 1: respond = "Ok"
    Case 2: respond = "Cancel"
    Case 3: respond = "Stop"
    Case 4: respond = "Retry"
    Case 5: respond = "Ignore"
    Case 6: respond = "Yes"
    Case 7: respond = "No"
End Select
REM 結果の表示
WScript.Echo respond
WScript.Quit (eLevel)
REM ここからサブルーチン=========================================
REM 原稿文字列を正規文字列で検索し、一致する文字をすべて置換文字列に置き換えます。
REM s : 原文字列
REM t : 正規文字列
REM d : 置換文字列
Function RepExAll ( s , t , d )
    Dim regExpression, Matches                ' 変数を作成します。
    Set regExpression = New RegExp            ' 正規表現を作成します。
    regExpression.Pattern    = t              ' パターンを設定します。
    regExpression.IgnoreCase = True           ' 大文字と小文字を区別しないように設定します。
    regExpression.Global     = True           ' 文字列全体を検索するように設定します。
    RepExAll = regExpression.Replace(s , d)   ' 置換を実行します。
End Function
```

---------------------------------------------------------

```OpenFileDialog.ps1
Set-StrictMode -version Latest

#.NET Frameworkのダイアログ関連オブジェクトの取り込み
Add-Type -assemblyName System.Windows.Forms

#ファイル選択ダイアログのオブジェクト取得
$dialog   = New-Object System.Windows.Forms.OpenFileDialog

#タイトルの設定
$dialog.Title = "WindowsUpdate 完了時に再生する Wave サウンドを選択して下さい"

#フィルタ条件の設定
$dialog.Filter = 'Waveサウンド|*.wav'

#デフォルト選択ディレクトリの設定
$dialog.InitialDirectory = '.'

if ($dialog.ShowDialog() -eq "OK") {
    '"' + $dialog.FileName + '"'
  } else {
    '未選択'
}
```

---------------------------------------------------------

```PSWindowsUpdate.cmd
@ECHO OFF
SetLocal EnableDelayedExpansion

Title PowerShell Module で Windows Update ・・・ %date% %time:~0,-3% から開始

cls

rem /;
rem /; 対話・サイレントモード指定方法
rem /;
rem /; PSWindowsUpdate.cmd をダブルクリック     → 対話形式
rem /;          〃         にファイルをドロップ → サイレントモード
rem /;          〃         /sairento で起動     → サイレントモード ※ バッチのパラメタ文字列は任意
rem /;
rem /; SET サイレント=1 に変更して起動          → サイレントモード
rem /;

SET                                                サイレント=%1

rem /;
rem /; 適用除外ＫＢ
rem /;
rem /; KB2267602  Windows Defender の定義の更新
rem /; KB2876229  Skype for Windows デスクトップ 7.3 のオプションのアップデート
rem /; KB4023307  Microsoft Silverlight
rem /; KB3186539  x64 用 Windows 8.1 および Windows Server 2012 R2 の、Microsoft .NET Framework 4.7
rem /; KB3186606  x64 用 Windows 8.1 および Windows Server 2012 R2 の、Microsoft .NET Framework 4.7 言語パック
rem /;

SET    適用除外ＫＢ=\""KB2267602\"",\""KB2876229\"",\""KB4023307\"",\""KB3186539\"",\""KB3186606\""

rem /;
rem /; サイレントモード時のデフォルト動作設定
rem /;

SET             WindowsUpdateの実行回数【１回／複数回】=１回
SET         WindowsUpdate完了時に♪再生【する／しない】=しない
SET                                      ｗａｖファイル="%windir%\Media\tada.wav"
SET                                                    ｗａｖファイル名=tada.wav
SET     WindowsUpdate完了時にメール送信【する／しない】=しない
SET                                      メールアドレス=fmeiru@yofuu.com
SET                                      メールサーバー=mail.saba
SET WindowsUpdate完了時にダイアログ表示【する／しない】=しない

rem /;
rem /; web_file : ダウンロードする PSWindowsUpdate.zip ファイルをフルパスで指定
rem /;
rem /; sav_file : 保存時の保存先とファイル名を指定。保存先は、バッチファイルのフォルダ
rem /; sav_fldr : PSWindowsUpdate の展開先（バッチファイルのフォルダ + zipファイル内のフォルダ名）
rem /;
rem /; Working  : PSWindowsUpdate のモジュール格納先 ※ Documents フォルダ内
rem /;
rem /; ※ 通常、ファイルは Set file="a.txt" または Set "file=a.txt" のように指定するが
rem /;
rem /;    バッチから PowerShell を呼び出す際、区切り文字の違いがあるので Set file=\""a.txt\"" のように記述する
rem /;

Set   web_file=\""http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc/file/41459/28/PSWindowsUpdate.zip\""

Set   sav_file=%~dp0PSWindowsUpdate.zip
Set   sav_fldr=%~dp0PSWindowsUpdate

Set                      Powerfldr=%USERPROFILE%\Documents\WindowsPowerShell
Set             Modules=%Powerfldr%\Modules
Set    Working=%Modules%\PSWindowsUpdate

SET L=^


SET         PowerShellcmd=-NoProfile -ExecutionPolicy unrestricted -Command

rem /;
ECHO;  [1/9] PSWindowsupdate が 組み込まれているかを判定
rem /;
rem /; 組み込まれていたら：●ＷｉｎｄｏｗｓＵｐｄａｔｅして自動再起動する
rem /;
rem /; 組み込まれていない：ダウンロード・解凍（展開）・組み込み後、ＷｉｎｄｏｗｓＵｐｄａｔｅして自動再起動する
rem /;
Powershell %PowerShellcmd% "Get-Command -Module PSWindowsupdate" | FIND /I "PSWindowsupdate" > nul && goto :●ＷｉｎｄｏｗｓＵｐｄａｔｅして自動再起動する

rem /;
rem /; サイレントモード時、入力ダイアログを表示しない
rem /;

if      DEFINED サイレント goto :_◆サイレントモード時、入力ダイアログを表示しない◆_

SET タイトル=WindowsUpdate実行前確認

for /f "usebackq tokens=* delims=" %%0 in (`call CSCRIPT //NOLOGO "%~dp0MSGBOX.VBS" "WindowsUpdateを実行します。crlfcrlfアップデート後、再起動する場合がありますのでcrlfcrlf開始前に起動中のアプリは全て終了して下さい。crlfcrlfcrlf【 はい 】  をクリックすると、オプションの選択が始まります。crlfcrlf全てのオプション選択後、処理開始の選択画面が出ます。crlfcrlfcrlf処理を止める場合は  【いいえ 】  をクリックして下さい。" 4 "%タイトル%"`) do SET 開始=%%0
if      "!開始!"=="No" goto :EOF

SET メッセージ="★　WindowsUpdateの実行回数を指定して下さいcrlfcrlf　　 １回だけ　　　　　　　　   →　【はい】crlfcrlf　　 再起動しなくなるまで繰り返す  →　【いいえ】crlfcrlf※　監査モードでログオンされているかcrlfcrlf　　自動ログオン設定されている場合crlfcrlf　　【いいえ】 がお勧めです"
for /f "usebackq tokens=* delims=" %%0 in (`call cscript //Nologo "%~dp0msgbox.vbs"   %メッセージ%   4 %タイトル%`) do SET 答え=%%0
if      "!答え!"=="Yes"   SET      WindowsUpdateの実行回数【１回／複数回】=１回
if      "!答え!"=="No"    SET      WindowsUpdateの実行回数【１回／複数回】=複数回

SET メッセージ="　☆実行回数設定：!WindowsUpdateの実行回数【１回／複数回】!crlfcrlfcrlf★　Update完了時、♪wav再生しますか？crlfcrlf　　 再生する　 →　【はい】crlfcrlf　　 無音　　  →　【いいえ】"
for /f "usebackq tokens=* delims=" %%0 in (`call cscript //Nologo "%~dp0msgbox.vbs"   %メッセージ%   4 %タイトル%`) do SET 答え=%%0
if      "!答え!"=="Yes" (
            SET   WindowsUpdate完了時に♪再生【する／しない】=する
    for /f "delims=" %%0 in ('Powershell -NoProfile -ExecutionPolicy unrestricted -f "%~dp0OpenFileDialog.ps1"') do (
        if  not "未選択"=="%%0" (
            set   ｗａｖファイル=%%0
            set   ｗａｖファイル名=%%~nx0
          ) else (
            set   WindowsUpdate完了時に♪再生【する／しない】=しない
        )
    )
  ) else (
            SET   WindowsUpdate完了時に♪再生【する／しない】=しない
)

for /f "usebackq tokens=* delims=" %%0 in (`call CSCRIPT //NOLOGO "%~dp0INPUTBOX.VBS" "　☆実行回数設定：!WindowsUpdateの実行回数【１回／複数回】!crlfcrlf　☆♪再生設定♪：!WindowsUpdate完了時に♪再生【する／しない】!crlfcrlfcrlf★　Update完了時、メール送信しますか？crlfcrlfcrlf● メール送信を行う場合、識別名を入力後crlfcrlf　 【ＯＫ】をクリックして下さいcrlfcrlf　 メールの件名に【識別名】が表示されますcrlfcrlf● メール送信をしない場合、crlfcrlf　 そのまま【ＯＫ】をクリックして下さい" "%タイトル%" ""`) do SET 識別名=%%0
if      DEFINED 識別名 (
    SET    WindowsUpdate完了時にメール送信【する／しない】=する
    for /f "usebackq tokens=* delims=" %%0 in (`call CSCRIPT //NOLOGO "%~dp0INPUTBOX.VBS" "　☆実行回数設定：!WindowsUpdateの実行回数【１回／複数回】!crlfcrlf　☆♪再生設定♪：!WindowsUpdate完了時に♪再生【する／しない】!crlfcrlf　☆識別名設定：!識別名!crlfcrlfcrlf★　完了メールの通知先アドレスを入力後、crlfcrlf　　【ＯＫ】をクリックして下さいcrlfcrlf※ Ctrl + ← で @ より前から入力出来ます" "%タイトル%" "%メールアドレス%"`) do SET メール宛先=%%0
  ) else (
    SET    WindowsUpdate完了時にメール送信【する／しない】=しない
)

SET メッセージ="　☆実行回数設定：!WindowsUpdateの実行回数【１回／複数回】!crlfcrlf　☆♪再生設定♪：!WindowsUpdate完了時に♪再生【する／しない】!crlfcrlf　☆〒送信設定〒：!WindowsUpdate完了時にメール送信【する／しない】!crlfcrlfcrlf★　Update完了時、ダイアログを表示しますか？crlfcrlf　　 する　   →　【はい】crlfcrlf　　 しない    →　【いいえ】"
for /f "usebackq tokens=* delims=" %%0 in (`call cscript //Nologo "%~dp0msgbox.vbs"   %メッセージ%   4 %タイトル%`) do SET 答え=%%0
if      "!答え!"=="Yes"   SET      WindowsUpdate完了時にダイアログ表示【する／しない】=する
if      "!答え!"=="No"    SET      WindowsUpdate完了時にダイアログ表示【する／しない】=しない

SET メッセージ="　☆実行回数設定：!WindowsUpdateの実行回数【１回／複数回】!crlfcrlf　☆♪再生設定♪：!WindowsUpdate完了時に♪再生【する／しない】!crlfcrlf　☆〒送信設定〒：!WindowsUpdate完了時にメール送信【する／しない】!crlfcrlf　☆完了時にダイアログ表示：!WindowsUpdate完了時にダイアログ表示【する／しない】!crlfcrlfcrlfWindowsUpdateを実行します。crlfcrlf【 はい 】  をクリックすると、処理を開始します。crlfcrlf処理を止める場合は  【いいえ 】  をクリックして下さい。"
for /f "usebackq tokens=* delims=" %%0 in (`call cscript //Nologo "%~dp0msgbox.vbs"   %メッセージ%   4 %タイトル%`) do SET 開始=%%0
if      "!開始!"=="No" goto :EOF

:_◆サイレントモード時、入力ダイアログを表示しない◆_

rem /; ---------------------------------
rem /; 組み込まれていない：ダウンロード、解凍（展開）、組み込み後に●ＷｉｎｄｏｗｓＵｐｄａｔｅして自動再起動する

rem /;
rem /; サイレントモード時、疎通確認を行わない
rem /;

if      DEFINED サイレント goto :_☆_ネット接続確認成功_☆_

rem /;
rem /; 疎通確認
rem /;

SET   ぐぐ～る=google.co.jp

ping %ぐぐ～る% > nul &&   goto :_☆_ネット接続確認成功_☆_

:-★-ネット接続確認失敗-★-
MSG console /w /time:0 "ネットに接続出来ません!L!!L!接続準備が出来たら【ＯＫ】をクリックして下さい!L!!L!※ キャンセルする場合、黒い画面を閉じてから【ＯＫ】をクリック"
PING %ぐぐ～る% > nul ||   goto :-★-ネット接続確認失敗-★-

:_☆_ネット接続確認成功_☆_

rem /; ---------------------------------
ECHO;  [2/9] PSWindowsUpdate.zip を ダウンロード
rem /;
DEL /F                                                                                                     "%sav_file%"      > nul 2>nul
Powershell %PowerShellcmd% "$web = New-Object System.Net.WebClient; $web.DownloadFile(  %web_file%   ,   \""%sav_file%\"" )"

rem /; ---------------------------------
ECHO;  [3/9] PSWindowsUpdate.zip を 解凍（展開）後、削除
rem /;
RD /S /Q                                                                                                                                                                           "%sav_fldr%" > nul 2>nul
Powershell %PowerShellcmd% "Add-Type -AssemblyName System.IO.Compression.FileSystem; $ZipFile = Get-Item \""%sav_file%\""; [IO.Compression.ZipFile]::ExtractToDirectory( $ZipFile, '%~dp0' )"
DEL /F                                                                                                     "%sav_file%"

rem /; ---------------------------------
ECHO;  [4/9] PSWindowsUpdate\*.* の ブロックの解除と再起動用ファイルのセット
rem /;
Powershell %PowerShellcmd% "Unblock-File \""%sav_fldr%\*.*\"""

copy /y   "%~dp0sendmail.vbs"                                                       "%sav_fldr%" > nul

if      DEFINED サイレント                                              TYPE NUL>   "%sav_fldr%\サイレント.TXT"

if                  "%WindowsUpdateの実行回数【１回／複数回】%"=="１回" TYPE NUL>   "%sav_fldr%\１回.TXT"

if      "%WindowsUpdate完了時にダイアログ表示【する／しない】%"=="する" TYPE NUL>   "%sav_fldr%\ＭＳＧ.TXT"
if          "%WindowsUpdate完了時にメール送信【する／しない】%"=="する" TYPE NUL>   "%sav_fldr%\メール.TXT"
if              "%WindowsUpdate完了時に♪再生【する／しない】%"=="する" (
    if      EXIST %ｗａｖファイル% (
                                                                        TYPE NUL>   "%sav_fldr%\♪♪♪.TXT"
        copy /y   %ｗａｖファイル%                                                  "%sav_fldr%" > nul
      ) else (
        SET           WindowsUpdate完了時に♪再生【する／しない】=しない
    )
)

echo;PowerShell  %PowerShellcmd% "Start-Process %Working%\Get-WUInstall.cmd -Verb runas">                                   "%sav_fldr%\RunOnce.cmd"

echo;@ECHO OFF>                                                                                                                                                                                        "%sav_fldr%\Get-WUInstall.cmd"
echo;SetLocal EnableDelayedExpansion>>                                                                                                                                                                 "%sav_fldr%\Get-WUInstall.cmd"
echo;>>                                                                                                                                                                                                "%sav_fldr%\Get-WUInstall.cmd"
echo;Title PowerShell で WindowsUpdate 実行中 ・・・ 初回起動 %date% %time:~0,-3%  今回開始 %%date%% %%time:~0,-3%%>>                                                                                  "%sav_fldr%\Get-WUInstall.cmd"
echo;>>                                                                                                                                                                                                "%sav_fldr%\Get-WUInstall.cmd"
echo;SET L=^^>>                                                                                                                                                                                        "%sav_fldr%\Get-WUInstall.cmd"
echo;>>                                                                                                                                                                                                "%sav_fldr%\Get-WUInstall.cmd"
echo;>>                                                                                                                                                                                                "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0１回.txt"         goto :_▲１回指定時、更新を行わない▲_>>                                                                                                                   "%sav_fldr%\Get-WUInstall.cmd"
echo;reg add     "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /f /v "PSWindowsUpdate_Get-WUInstall" /t REG_SZ /d "%Working%\RunOnce.cmd" ^> nul 2^>nul>>                                   "%sav_fldr%\Get-WUInstall.cmd"
echo;Powershell  %PowerShellcmd% "$KBList = !適用除外ＫＢ!; Get-WUInstall -NotKBArticleID $KBList -AcceptAll -AutoReboot">>                                                                            "%sav_fldr%\Get-WUInstall.cmd"
echo;for /f "delims=" %%%%0 in ('Powershell %PowerShellcmd% "Get-WURebootStatus -Silent"') do if      "%%%%0"=="True" goto :EOF>>                                                                      "%sav_fldr%\Get-WUInstall.cmd"
echo;ping -n 60 localhost ^> nul>>                                                                                                                                                                     "%sav_fldr%\Get-WUInstall.cmd"
echo;reg delete  "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /f /v "PSWindowsUpdate_Get-WUInstall" ^> nul 2^>nul>>                                                                        "%sav_fldr%\Get-WUInstall.cmd"
echo;:_▲１回指定時、更新を行わない▲_>>                                                                                                                                                               "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0メール.txt"       CALL CSCRIPT    //NOLOGO "%%~dp0sendmail.VBS" "WindowsUpdate" "%メール宛先%" "%識別名%" "WindowsUpdate" "%メールサーバー%">>                               "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0サイレント.txt"   goto :_◆サイレント時、これらの作業をしない◆_>>                                                                                                           "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0♪♪♪.txt"            PowerShell "(New-Object Media.SoundPlayer('%%~dp0!ｗａｖファイル名!')).PlaySync()">>                                                                  "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0ＭＳＧ.txt"            MSG        console /w /time:0 "Ｗｉｎｄｏｗｓ Ｕｐｄａｔｅ 完了しました。^!L^!^!L^!【ＯＫ】をクリックすると PSWindowsUpdate を削除して終了します。">> "%sav_fldr%\Get-WUInstall.cmd"
echo;:_◆サイレント時、これらの作業をしない◆_>>                                                                                                                                                       "%sav_fldr%\Get-WUInstall.cmd"
echo;Powershell %PowerShellcmd% "Get-Command -Module PSWindowsupdate; $Module = Get-Module PSWindowsupdate; Remove-Module $Module.Name" ^> nul>>                                                       "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0Powerfldr消す.TXT" cmd /c,RD /S /Q "%Powerfldr%">>                                                                                                                           "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0Modules消す.TXT"   cmd /c,RD /S /Q "%Modules%">>                                                                                                                             "%sav_fldr%\Get-WUInstall.cmd"
echo;if      EXIST "%%~dp0PSWin消す.TXT"     cmd /c,RD /S /Q "%Working%">>                                                                                                                             "%sav_fldr%\Get-WUInstall.cmd"

rem /; ---------------------------------
ECHO;  [5/9] PSWindowsUpdate の モジュールを Documents 内へ配置
rem /;

if  not EXIST "%Powerfldr%"          MD       "%Modules%" &             TYPE NUL> "%sav_fldr%\Powerfldr消す.TXT"
if  not EXIST "%Modules%"            MD       "%Modules%" &             TYPE NUL> "%sav_fldr%\Modules消す.TXT"
                                                                        TYPE NUL> "%sav_fldr%\PSWin消す.TXT"

RD /S /Q                                            "%Working%"    > nul 2>nul
Powershell %PowerShellcmd% "Move \""%sav_fldr%\"" \""%Modules%\"""

rem /; ---------------------------------
ECHO;  [6/9] PSWindowsUpdate の モジュールを読み込み
rem /;
Powershell %PowerShellcmd% "Import-Module PSWindowsupdate"

rem /;
ECHO;  [7/9] Windows Defender 定義ファイルの削除と更新
rem /;
"%ProgramFiles%\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -ALL > nul
"%ProgramFiles%\Windows Defender\MpCmdRun.exe" -SignatureUpdate -MMPC  > nul

rem /;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

:●ＷｉｎｄｏｗｓＵｐｄａｔｅして自動再起動する

rem /;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

rem /;
rem /; 再起動後、ＷｉｎｄｏｗｓＵｐｄａｔｅを行う様に設定
rem /;

reg add     "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /f /v "PSWindowsUpdate_Get-WUInstall" /t REG_SZ    /d "%Working%\RunOnce.cmd" > nul 2>nul

rem /; ---------------------------------
ECHO;  [8/9] Windows Update 実行
ECHO;        オプション「アップデートをすべて受け入れる」
ECHO;        オプション「アップデート後、自動的に再起動する」
ECHO;  適用除外ＫＢ %適用除外ＫＢ:\"=%
rem /;
Powershell %PowerShellcmd% "$KBList = !適用除外ＫＢ!; Get-WUInstall -NotKBArticleID $KBList -AcceptAll -AutoReboot"

rem /;★★★★★★★ここから先は-AutoReboot指定時、再起動が行われなかった時に実行される★★★★★★★

for /f "delims=" %%0 in ('Powershell %PowerShellcmd% "Get-WURebootStatus -Silent"') do if      "%%0"=="True" goto :EOF

ping -n 60 localhost > nul

rem /;
rem /; 再起動後、ＷｉｎｄｏｗｓＵｐｄａｔｅを行う様にした設定を解除
rem /;
reg delete  "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /f /v "PSWindowsUpdate_Get-WUInstall" > nul 2>nul

rem /;
rem /; 完了後、指定の通知を実行
rem /;
if      EXIST "%Working%\メール.txt"         CALL CSCRIPT    //NOLOGO "%Working%\sendmail.VBS" "WindowsUpdate" "%%メール宛先%%" "%%識別名%%" "WindowsUpdate" "%%メールサーバー%%"

if      EXIST "%Working%\サイレント.txt"     goto :_◆サイレント時、これらの作業をしない◆_
IF      EXIST "%Working%\♪♪♪.txt"              PowerShell "(New-Object Media.SoundPlayer('%Working%\%ｗａｖファイル名%')).PlaySync()"
IF      EXIST "%Working%\ＭＳＧ.txt"              MSG        console /w /time:0 "Ｗｉｎｄｏｗｓ Ｕｐｄａｔｅ 完了しました。!L!!L!【ＯＫ】をクリックすると PSWindowsUpdate を削除して終了します。"
:_◆サイレント時、これらの作業をしない◆_

rem /; ---------------------------------
ECHO;  [9/9] PSWindowsUpdate を削除
rem /;
Powershell %PowerShellcmd% "Get-Command -Module PSWindowsupdate; $Module = Get-Module PSWindowsupdate; Remove-Module $Module.Name" > nul

if      EXIST "%Working%\Powerfldr消す.TXT" cmd /c,RD /S /Q "%Powerfldr%"
if      EXIST "%Working%\Modules消す.TXT"   cmd /c,RD /S /Q "%Modules%"
if      EXIST "%Working%\PSWin消す.TXT"     cmd /c,RD /S /Q "%Working%"
```

---------------------------------------------------------

```sendmail.vbs
Set  oMsg     = CreateObject("CDO.Message")

oMsg.From     = WScript.Arguments(0) & "完了送信タスク <dummy@dummy>"
oMsg.To       = WScript.Arguments(1)
oMsg.Subject  = "【 " & WScript.Arguments(2) & " 】" & "の" & WScript.Arguments(0) & "が完了しました"
oMsg.TextBody = WScript.Arguments(3) & vblf & vblf & "次の作業を行って下さい"

oMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing")      = 2
oMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver")     = WScript.Arguments(4)
oMsg.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
oMsg.Configuration.Fields.Update
oMsg.Send
```

---------------------------------------------------------
---------------------------------------------------------
参考にしたサイト他

inputbox.vbsとmsgbox.vbsのサイトです。

* [バッチで使うVBscript](http://tsg21.com/vbs4bat.html)

「お疲れ様」のボイスサンプルがあります。
WindowsUpdateで待ちくたびれた方にお勧めです。
個人使用でどうぞ。

* [キャラクター利用ガイドライン、解説集 | クラウド ガール - MSDN - Microsoft](https://msdn.microsoft.com/ja-jp/claudia00_03.aspx)

* [PowerShellの使い方(OS設定編)](http://qiita.com/Kirito1617/items/aed439bcb66c63489337)

* [【Management】Windows Update Powershell Module (1)](https://blogs.technet.microsoft.com/junichia/2013/05/21/managementwindows-update-powershell-module-1/)

* [WINDOWS POWERSHELL によるWINDOWS SERVER 管理の自動化 V4.0 2014.03.13 更新版](
http://documentslide.com/technology/windows-powershell-windows-server-v40-20140313-.html)

324 ページ から