ラベル WindowsUpdate の投稿を表示しています。 すべての投稿を表示
ラベル WindowsUpdate の投稿を表示しています。 すべての投稿を表示

2014-06-17

Windowsのバッチファイルで、ファイルの文字列監視を実現

Linuxだとtailコマンドを利用すれば良いのだけれど、Windowsの標準コマンドにはtailコマンドが存在しない

そこでラベルでtail処理を作成し、CALLで呼び出すことでサブルーチンとして実装している

wuaclt.exeでWindowsUpdateの更新を確認し、そのログにレポートの完了が出力されたら処理終了といった具合のバッチファイルだとこんな感じ

@echo off
wuauclt.exe /detectnow /reportnow

:LOOP
timeout 5
CALL TAIL "%windir%\WindowsUpdate.log" 1 | find "CWERReporter finishing event handling" && GOTO END || GOTO LOOP

:TAIL
for /F "tokens=1,2,3 USEBACKQ" %%A in (`find /V /C "" %1`) do set FL=%%C
set /A TAIL=%FL%-%2
more +%TAIL% %1
exit /b

:END
echo "Finish."

これを実行すると
0 秒待っています。続行するには何かキーを押してください ...

0 秒待っています。続行するには何かキーを押してください ...
2014-06-17      13:31:26:149     592    2274    Report  CWERReporter finishing event handling. (00000000)
"Finish."

な感じで正常に動いていることが確認できた


Windows7だとこの方法で実行できたが、Windows Server 2008だと

"バッチ スクリプト外でバッチ ラベルを呼び出すことはできません。"

という感じで怒られてしまった(´・ω・`)



そこで、tail処理は別のスクリプトとして実装してみた



tail.bat
@echo off
for /F "tokens=1,2,3 USEBACKQ" %%A in (`find /V /C "" %1`) do set FL=%%C
set /A TAIL=%FL%-%2
more +%TAIL% %1

@echo off
wuauclt.exe /detectnow /reportnow

:LOOP
timeout 5
cd /d %~dp0
CALL .\tail.bat "%windir%\WindowsUpdate.log" 1 | find "CWERReporter finishing event handling" && GOTO END || GOTO LOOP

:END
echo "Finish."

※cd /d %~dp0はこのスクリプトがあるディレクトリへワーキングディレクトリを移動するための処理

wuauclt.exeのスイッチ一覧

スイッチ意味
/DetectNowただちに検出を開始する
/ReportNowただちにWSUSへのレポートを実行する
/RunHandlerComServer
/RunStoreAsComServer
/ShowSettingsDialog更新プログラムのインストール方法を選択するダイアログを表示
/ResetAuthorization
/ResetEulas
/ShowWUWindowsUpdateのUIを表示する
/ShowWindowsUpdate上に同じ
/SelfUpdateManaged更新プログラムの確認を実行する?
/SelfUpdateUnmanaged更新プログラムの確認を実行する?
/UpdateNow
/ShowWUAutoScan更新プログラムの確認をWindowで実施
/ShowFeaturedUpdatesインストールする注目の更新プログラムを選択するWindowを表示
/ShowOptions更新プログラムをインストールする方法を選択するWindowを表示
/ShowFeaturedOptInDialog新しいソフトウェアに関する詳しい情報の通知を希望するか選択するダイアログを表示
/DemoUI