プロが教える店舗&オフィスのセキュリティ対策術

DOSコマンドのループ内のTIMEコマンド

ループの中で、少し時間のかかる処理を連続的に行ない、さらに時刻表示を行い
1回あたりの時間が分かるように表示したいと思っています。
下記のソースのイメージです。(極めてシンプルにしました)

しかし、ループ内で実行するtimeコマンドがすべて同じ
時刻になってしまい、意図通りの動きになりません。


ループ内で、ループごとに異なる時刻を表示することは可能でしょうか?
もしできるのであればその方法を教えてください。
よろしくお願いします。


@echo start◆%time%

@FOR /L %%I IN (0, 1, 3) DO @(
@echo %%I【%time%】
@ping localhost -n 2 > nul
)

@echo end ◆%time%

pause

A 回答 (3件)

ループの前に


setlocal enabledelayedexpansion
と書いておいて、ループの中では
%time%の代わりに!time!を使いましょう。
    • good
    • 5
この回答へのお礼

「setlocal enabledelayedexpansion」
これはさっぱり分かりませんでした。なんか長いし。

しかし言われるがままに修正したら意図通りに動きました。
非常にびっくりしました。


とりあえず調べてみたところ、遅延展開云々
という仕様があることをはじめて知りました。

これは経験の差ですね。非常に助かりました。
質問して本当によかったです。
ありがとうございました。

お礼日時:2010/02/02 16:38

#1の回答のようにするか



コマンドプロンプトを起動する際に /V:ON を追加して !time!を使ってみましょう
    • good
    • 0
この回答へのお礼

そういう方法もあるのですね。
いろいろ勉強になりました。
ありがとうございました。

お礼日時:2010/02/02 17:22

forループの中ではforコマンド起動時の時刻しか帰らないようですね。


1つの方法としては、以下のようにcallで飛ばしてやるという方法があります。

@echo start◆%time%
@FOR /L %%I IN (0, 1, 3) DO @call :sub
@echo end ◆%time%
pause
@goto :eof

:sub
@echo %%I【%time%】
@ping localhost -n 2 > nul
@exit /b
    • good
    • 1
この回答へのお礼

ご提示していただいた方法ですと、
たしかにtimeコマンドは意図通り動くのですが、
subの処理はループと無関係と判断されてしまう為に
ループのインデックスの表示は出来ないようです…。

しかし、遅延展開問題の回避方法の1つとして
サブルーチン(?)を使えばいいということがわかりました。

またそもそも、DOSバッチにサブルーチンがあることを
知らなかったのでその点でも参考になりました。
ありがとうございました。

お礼日時:2010/02/02 16:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A