(0)目次&概説
今回はWindowsマシンのCドライブ空き容量をチェックし、閾値との比較によってアラートメッセージを出したりするバッチプログラムの作成について紹介します。このバッチを使ってタスクスケジューラーの設定等をすれば「一定時間おき」等の定期監視も可能になります。
(1) バッチプログラムの動作イメージ
(2) サンプルプログラム紹介
(2-1) ソースコード
(2-2) 実行結果
(3) サンプルプログラム解説
(3-1) 前半部:Cドライブ空き容量取得
(3-2) 後半部:閾値比較~ポップアップ表示
(1) バッチプログラムの動作イメージ
バッチプログラムの動作イメージですが、実行されるとCドライブの空き容量をGBで割り出して、閾値との比較によりアラートメッセージかOKメッセージをポップアップで出力します。最終的にはタスクスケジューラを使って、自動で定期チェックを行う事も出来ます。
(図1)アウトプットイメージ
(図2)処理の概要
(2) サンプルプログラム紹介
(2-1) ソースコード
上記の目的を達成するためのサンプルプログラムのソースコードを紹介します。
(図3)
setlocal ENABLEDELAYEDEXPANSION for /F "tokens=2 delims=: " %%a in ('fsutil volume diskfree c: ^| find /i "空きバイト総数"') do ( set bytes=%%a set bytes1=!bytes:,=! echo ****Value Check 1**** !bytes1! set /A bytes2=!bytes1:~0,-3! echo ****Value Check 2**** !bytes2! rem 3連続で1024除算すると0になってしまうので途中で1000を掛けておく set /A GB=!bytes2!/1024/1024*1000/1024 echo ****Value Check 3**** !GB! ) set quo=' rem ' set msg0=Cドライブの容量が残り80GB未満です(残り: set msg1=!GB! set msg2=GB) rem ***********やり方1*********** set final_msg1=!mst!!msg0!!msg1!!msg2! if !GB! LSS 80 ( echo msgbox "!final_msg1!",vbInformation,"Title Bar" > %TEMP%/msgboxtest.vbs & %TEMP%/msgboxtest.vbs ) else ( echo msgbox "Cドライブの容量が残り80GB以上です(OK)",vbInformation,"Title Bar" > %TEMP%/msgboxtest.vbs & %TEMP%/msgboxtest.vbs ) rem ***********やり方2********** set final_msg2=!quo!!mst!!msg0!!msg1!!msg2!!quo! powershell "if((New-Object -com WScript.Shell).Popup(%final_msg2%,0) -ne 1){throw;};" > nul if not %ERRORLEVEL% == 0 ( echo ****** Process Canceled ****** exit /B ) else ( echo ****** Process Accepted ****** ) endlocal
(2-2) 実行結果
(図6)
(図7)
(3) サンプルプログラム解説
(3-1) 前半部:Cドライブ空き容量取得
プログラムの前半部分(~16行目)までの解説です。
(図4)
setlocal ENABLEDELAYEDEXPANSION
■解説
(1) 遅延環境変数をセットしています。これをセットする事で、for文の処理を待たせて(遅延させて)、echoの処理が完了したら次のforの処理に移るように制御をします。これが無いとechoする前に次のforループに入ってしまい、変数が空になった状態でechoしてしまうため何も表示されない事象が起きてしまう。
(2) 【重要!】遅延環境を用いる時は通常の変数とは異なり「!!」で変数を囲みます。なので「%temp%」ではなく「!temp!」となります。
for /F "tokens=2 delims=: " %%a in ('fsutil volume diskfree c: ^| find /i "空きバイト総数"') do (
■解説
(1) 「for /F %変数 in (‘[コマンド]’) do ([コマンド])」 forに「/F」オプションを付与する事で、in句内で指定したコマンドの実行結果を変数(%変数)に格納しています。しかし単独の%は消滅するため、%でエスケープをして「%%a」としています。
(2) “tokens=2 delims=: ” 指定したデリミタ(上記例の場合「:」)を区切り文字とした際に、tokensで指定した列数目の情報を取得する。今回の場合は2列目なのでCドライブの空きバイト数の数値を取得します。
(3) in句内のコマンド Cドライブの容量をチェックしています。2つのコマンドをパイプで繋いでおり、前半でCドライブの各種空き容量情報を出力し、後半の「find /i ~」で必要な情報に絞っています。
set bytes=%%a set bytes1=!bytes:,=! echo ****Value Check 1**** !bytes1! set /A bytes2=!bytes1:~0,-3! echo ****Value Check 2**** !bytes2!
■解説
(1) 1行目でforループで取得したCドライブの空き容量(%%a)を変数「bytes」に代入しています
(2) 2行目で「bytes」に対して文字列置換をしています。「:」の後の「,=」が処理の内容で、「,」を「」(空白)に置き換えています。これを行う事でカンマ付の数字も数式で処理できる形に加工しています。
(空白だと分かりにくいですが、例えば「,=/」だと「,」を「/」に置き換えるという意味になります)
(3) 3行目と5行目はデバッグ目的のechoです(処理とは無関係)。普通にechoすると値が表示されないため、先頭に記載の遅延環境変数「setlocal ENABLEDELAYEDEXPANSION」を用いてその事象を回避します。
(4) 4行目で変数「bytes」について、0文字目から末尾の3文字を切り取る⇒つまり単に末尾から3文字を切り取ると同義。その結果を変数「bytes2」に代入しています。「set /A」で変数に数式の結果(int型とか)を代入しています。数式で扱える桁数の上限に抵触しないための下処理。
rem 3連続で1024除算すると0になってしまうので途中で1000を掛けておく set /A GB=!bytes2!/1024/1024*1000/1024 echo ****Value Check 3**** !GB!
■解説
(1) 1行目は「rem」はコメント行です。
(2) 2行目は「bytes2」はバイト数3連続で1024除算すると0になってしまうので途中で1000を掛けておく
(3) 3行目のechoはデバッグのための出力。
(3-2) 後半部:閾値比較~ポップアップ表示
プログラムの後半部分(17行目~)の解説です。
(図5)
set quo=' set msg0=Cドライブの容量が残り80GB未満です(残り: set msg1=!GB! set msg2=GB)
■解説
(1) メッセージボックスに表示する文字列の部品を定義しています。先の例では最終的に次のような文字列を作成しようとしています(XXには計算したCドライブの残容量が入る) 「Cドライブの容量が残り80GB未満です(残り:XXGB)」
rem ***********やり方1*********** set final_msg1=!mst!!msg0!!msg1!!msg2! if !GB! LSS 80 ( echo msgbox "!final_msg1!",vbInformation,"Title Bar" > %TEMP%/msgboxtest.vbs & %TEMP%/msgboxtest.vbs ) else ( echo msgbox "Cドライブの容量が残り80GB以上です(OK)",vbInformation,"Title Bar" > %TEMP%/msgboxtest.vbs & %TEMP%/msgboxtest.vbs )
■解説
今回は2通りのやり方でメッセージボックスを出力していますが、そのうちの1つ目のやり方の解説です。
(1) 1行目のremはコメント
(2) 2行目は最終的にポップアップに出す文言を文字列結合で組み立てています。
(3) 3行目~4行目のif文で「もしGBの値が80以下なら」つまりCドライブの空きが80GB以下なら、”echo msgbox~”でポップアップを出力しています。文言は上記で組み立てた”final_msg1″を出力しています。
(4) 5行目~6行目のelse文ではCドライブが空き80GB以上の場合にOKのメッセージを出力しています。
rem ***********やり方2********** set final_msg2=!quo!!mst!!msg0!!msg1!!msg2!!quo! powershell "if((New-Object -com WScript.Shell).Popup(%final_msg2%,0) -ne 1){throw;};" > nul
■解説
今回は2通りのやり方でメッセージボックスを出力していますが、そのうちの2つ目のやり方(powershell利用)の解説です。
(1) 1行目のremはコメント
(2) 2行目の「set final_msg2~」でポップアップに出力する文言を組み立てています。「やり方1」との違いは、シングルクォーテーションで文字列を囲っている点です。
if not %ERRORLEVEL% == 0 ( echo ****** Process Canceled ****** exit /B ) else ( echo ****** Process Accepted ****** )
■解説
終了コード(直前の処理の終了ステータス)の取得をして、それに応じてメッセージを出力しています。
endlocal
■解説
最初の「遅延環境変数」を利用時の「setlocal」と対応しており、ここでローカル変数の使用を終了しています。