こんにちはtsuttieです(*'▽')
今回はバッチファイルで時刻の比較をしたときにハマったポイントを記載します。
#1. なにをしたのか
バッチファイルは手軽で好きなのですが、如何せん癖が強くてあんまり得意ではありません・・・
今回、時間が来たら処理を終了するバッチファイルを作成するときにも少しハマりましたので書いていきたいと思います。
#2. サンプルコード
結論から書いてしまいます。
私は以下のサンプルコードを作成しました。
■処理の流れ
for文で何らかの処理を実行 (今回は適当に15秒待機にしています)
↓
所定の時間(12時)を過ぎているか比較
↓
過ぎている場合には処理を終了 (そうでない場合は繰り返し)
@echo off
rem 終了時刻
set STOPTIME="12:00:00.00"
rem 実行
setlocal ENABLEDELAYEDEXPANSION
for /L %%a in (1,1,100) do (
echo %%a
timeout /T 15
echo !TIME!
echo %STOPTIME%
rem 時刻が過ぎていれば処理終了(下記に追記)
if "!TIME!" gtr %STOPTIME% (
echo timeover
exit
)
)
endlocal
pause
一見簡単そうなのですが(いや、簡単でした)ちょっとしたハマりポイントがありましたので
下に記載しておきます。
#3. ハマったポイント
ハマったポイントは2点です。
■ 遅延環境変数
はじめ、現在時刻を取得するために%TIME%
を使っていたのですが、
更新がされない、という問題が発生しました。
ちょっと調べたところ遅延環境変数の展開をしないといけないとか。
変数を反映させて処理を実行していくには何かしらの処理を実施しなければならないということですね。
この対応にあたるのが以下の部分になります。
引用:for文の中で値を変化させたい場合はfor文全体を、「setlocal enabledelayedexpansion」と「endlocal」で挟みます。また、for文内で使用する変数は「%」ではなく「!」で囲みます。
つまりサンプルコードではfor文を囲んでTIMEを処理時の時刻として扱いたい場合には以下のように記載します。
setlocal ENABLEDELAYEDEXPANSION
for {繰り返し処理内容} (
--------------------------------
この間でTIMEを使用する場合には
%TIME%
ではなく
!TIME!
と表記する。
--------------------------------
)
endlocal
解説は以下です。
引用:「enabledelayedexpansion」は「遅延環境変数の展開」であり、「変数に値が代入されるのが遅延させる(遅らせる)」という意味でした。すなわち、同時に変数を代入するのではなく、変数の代入をコマンドを一行ずつ読み込んでいく時に遅らせるのです。
参考:知識ゼロからのwindowsバッチファイル超入門:forループの中で値を変化させる
これで環境変数の問題は解決しました(^^♪
■ 時刻の比較
ひとまず、時刻を処理時の時刻にすることは出来ましたが、今度はif文で時刻の正しい比較ができない。という問題が出てきました。
終了設定時刻を過ぎていたらバッチ処理を終了。なので以下のように記載していましたがうまく動きません。
if !TIME! gtr 12:00:00.00 {処理}
うーむ・・・
色々悩みましたが、↓の記事を見つけました。
参考:バッチファイル内で時刻の大小を比較する
バッチファイル内では時刻は文字列として大小を比較しないときちんと比較してくれないとのこと
つまり↓のように書けばいいんですね。
if "!TIME!" gtr "12:00:00.00" {処理}
こんな感じです。これで時刻の比較もばっちり出来ました(^^)/
#4. まとめ
ということで、今回はバッチファイル作成時にハマったポイントについて忘備録的な意味も込めて書いてみました。やっぱり癖が強いように思いますね。そしてデバックが難しい・・・でも、手軽に使えて、便利なので使っちゃってます。
今後も使う機会がありそうなので、なにかハマったことがあったら記載したいと思います。
何かご指摘等ありましたら、コメントいただければ幸いです。
よろしくお願いします。('◇')ゞ