2014-06-17

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

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

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

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

  1. @echo off  
  2. wuauclt.exe /detectnow /reportnow  
  3.   
  4. :LOOP  
  5. timeout 5  
  6. CALL TAIL "%windir%\WindowsUpdate.log" 1 | find "CWERReporter finishing event handling" && GOTO END || GOTO LOOP  
  7.   
  8. :TAIL  
  9. for /F "tokens=1,2,3 USEBACKQ" %%A in (`find /V /C "" %1`) do set FL=%%C  
  10. set /A TAIL=%FL%-%2  
  11. more +%TAIL% %1  
  12. exit /b  
  13.   
  14. :END  
  15. echo "Finish."  

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

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


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

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

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



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



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

  1. @echo off  
  2. wuauclt.exe /detectnow /reportnow  
  3.   
  4. :LOOP  
  5. timeout 5  
  6. cd /d %~dp0  
  7. CALL .\tail.bat "%windir%\WindowsUpdate.log" 1 | find "CWERReporter finishing event handling" && GOTO END || GOTO LOOP  
  8.   
  9. :END  
  10. echo "Finish."  

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

0 件のコメント:

コメントを投稿