ログイン中のQiita Team
ログイン中のチームがありません

Qiita Team にログイン
コミュニティ
OrganizationイベントアドベントカレンダーQiitadon (β)
サービス
Qiita JobsQiita ZineQiita Blog
bat
バッチファイル
3
どのような問題がありますか?

この記事は最終更新日から3年以上が経過しています。

Organization

【バッチ】時刻を比較して処理を終了させる

こんにちは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. まとめ

ということで、今回はバッチファイル作成時にハマったポイントについて忘備録的な意味も込めて書いてみました。やっぱり癖が強いように思いますね。そしてデバックが難しい・・・でも、手軽に使えて、便利なので使っちゃってます。
今後も使う機会がありそうなので、なにかハマったことがあったら記載したいと思います。

何かご指摘等ありましたら、コメントいただければ幸いです。
よろしくお願いします。('◇')ゞ

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
tsuttie
「木村さんって普段何してるんですか?」に対して、即答出来ない感じで開発してます。
genbasupport
建設業を支えるコミュニケーション&マネジメントのサービスを開発・運営するエンジニアチーム

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
Azure Kubernetes Serviceに関する記事を投稿しよう!
~
3
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
この機能を利用するにはログインする必要があります。ログインするとさらに便利にQiitaを利用できます。
この機能を利用するにはログインする必要があります。ログインするとさらに便利にQiitaを利用できます。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ストックするカテゴリー