外出自粛中でも楽しく過ごす!QAまとめ>>

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
    • 2
この回答へのお礼

「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と関連する良く見られている質問

Qバッチファイルで常に最新の現在時刻を表示したい

バッチファイルで最新の現在時刻を表示したいのですが、うまく行きません。

そのバッチファイル自体を実行した時刻ではなく、そのバッチファイル内のコマンド等を実行した時刻を表示させたいのです。つまりどんどん時間を最新に近いものに更新させていって欲しいのです。

タスクスケジューラのようなものをバッチファイルで作りたくて、現在時刻が○○時であればこのコマンドを実行する、といったことがしたい訳です。

バッチファイルは実行してすぐ終了するのではなく、そのまま常駐するような形を想定しています。

なにか良い方法はないでしょうか。


■ 5秒おきに現在時刻を表示するバッチファイルの例 (同じ時刻になってしまう)

@echo off
:start
set time=%time: =0%
echo .
echo .
echo .「現在時刻は%time:~-11,2%時%time:~-8,2%分%time:~-5,2%秒です。」
echo .
echo .
ping localhost -n 5
goto start

Aベストアンサー

>set time=%time: =0%

せっかく、動的な時刻を返してくれる time という環境変数があるのに、それを上書きしてしまっているからです。変数名を変えてください。
set t=%time: =0%
など。

set /? の後ろの方に説明があります。

>これらの変数の値は、変数の値が展開されるときに動的に計算されます。
>ユーザーがこれらの名前の変数を明示的に定義する場合、その定義は下記の動的な定義を無効にします。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Qバッチファイルの時刻

下記は、6秒待って時刻を表示するのを繰り返す記述ですが、
「開始」の時間と「終了」の時間が同じになってしまいます。

【コード】
--------------------------------------------------
:flg_check
if exist %FlgFile% (
echo %time% 開始
echo WScript.Sleep 6000 > %TmpFile%
cscript //NoLogo %TmpFile%
echo %time% 終了
goto flg_check
)
--------------------------------------------------
【結果】
--------------------------------------------------
10:26:14.30 開始
10:26:14.30 終了
10:26:20.41 開始
10:26:20.41 終了
--------------------------------------------------

開始時刻の6秒後の時刻が終了時刻にならないのですが、なぜでしょうか?

下記は、6秒待って時刻を表示するのを繰り返す記述ですが、
「開始」の時間と「終了」の時間が同じになってしまいます。

【コード】
--------------------------------------------------
:flg_check
if exist %FlgFile% (
echo %time% 開始
echo WScript.Sleep 6000 > %TmpFile%
cscript //NoLogo %TmpFile%
echo %time% 終了
goto flg_check
)
--------------------------------------------------
【結果】
--------------------------------------------------
10:26:14.30 開始
10:26:14.3...続きを読む

Aベストアンサー

setlocal ENABLEDELAYEDEXPANSION
は、setlocalという内部コマンドを、ENABLEDELAYEDEXPANSION という引数付きで
実行することです。

このことにより環境変数の値が勝手に変わることはありません。
%環境変数%の他に、!環境変数!と書いたときも
環境変数の内容の展開を行うようになり、
そのタイミングが、バッチファイルの読み込み時ではなく
その行実行時に行われるということだけです。

詳しくは
setlocal /?
ででてくるヘルプを参照してください。

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

Qping試験をコマンドプロンプトにて実行し、試験結果をtxtにて残したい。?

ping試験をコマンドプロンプトにて実行し、試験結果をtxtにて残したい。?
あらかじめ、作っておくホルダにtxtファイルにて、名前をつけて、
各試験結果を残したいのですが。試験方法までは、わかります。
その方法を教えて下さい。

Aベストアンサー

ping 123.123.123.123 > c:\tokutei\nantoka.txt

と フルパス指定してあげればいいのでは ないのでしょうか?

Qバッチファイルで昨日の日付を取得

すみません、どなたか教えて下さい。

バッチファイルの記述で、昨日の日付を取得する方法を教えて下さい。
今日の日付は下記のように取得しています。

rem 日時変数の取得
for /f "tokens=1-3 delims=/" %%a in ('echo %date:~-10%') do (set YYYYMMDD=%%a%%b%%c
)

Aベストアンサー

:: ----- prevdate.bat はじめ -----
@echo off
::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
echo 今日は、%yy%年%mm%月%dd%日です。

::1日前の日付を計算する
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30)
)
echo 昨日は、%yy%年%mm%月%dd%日です。

echo.
pause
:: ----- prevdate.bat おわり -----

参考URL:http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html

:: ----- prevdate.bat はじめ -----
@echo off
::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
echo 今日は、%yy%年%mm%月%dd%日です。

::1日前の日付を計算する
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if...続きを読む

QDirコマンドでフォルダ内ファイルの合計サイズをだすには?(コマンドプロンプトにて)

いろいろ調べましたが不明な点があり、質問します。

WindowsのDOSプロンプトでdirコマンドを打つとフォルダ・ファイルの一覧が表示されますが、その中にファイルサイズが表示されています。
このサイズを合計できるコマンドはありませんか?
DIRコマンドのオプションを調べましたがそれらしいものが見当たりません。
具体的には
C:\xxx\配下に50個程度のファイルがあります。
その50個の合計サイズを知りたいです。
xxxフォルダの親フォルダにはアクセス不可です。

ずーっと悩んでいます。よろしくお願いします。

なお、OSはWindowsNTか2000で使用予定です。

Aベストアンサー

カレントドライブ、カレントフォルダを
C:\xxx\
にした状態で、

dir /s /a-d

/sパラメータででサブディレクトリすべてを検索
/a-dパラメータでディレクトリ以外のファイル(つまり属性に関係なくすべてのファイル

これを実行すると最後にファイルの個数とファイルサイズの合計を表示します。

もし、隠し属性のファイルは合計しないのであれば、

dir /s

だけで良いと思われます。

Qバッチファイルで2つ以上の変数を連結し、1つの変数にしたい。

Windows2000でバッチファイルを作っています。
バッチファイルが受け取る2つのパラメータを %1 %2とすると、
それを連結して、新たな変数 A を作りたいのですが、どのようにすれば良いのでしょうか。

Aベストアンサー

SETで変数にパラメータをセットすればOKだと思います。

例)
SET A=%1%2
echo %A%

QDOSコマンドでの単純なループ処理

DOSコマンドで単純なループ処理を記述する方法を教えて下さい。

UNIXで下記のようにwhileコマンドを使用すると、

/export% While(1)
? ループ処理で実行させたいコマンドを記述
? echo ""
? sleep 3

3秒おきにコマンドの標準出力が表示されます。
Windowsで同じようなことができたらいいなと
思うのですが、簡単な方法を知っている方がいたら
教えて下さい。

Aベストアンサー

ラベルと goto を使っても、できますよ。(Windows98SE で確認)

3秒待たせるためのコマンド sleep.exe は、1番目の参考 URL から入手できます。

これを使って、以下のようなサンプルプログラムを組んでみました。

  @echo off
  :loop
  echo こんにちは
  sleep 3
  goto loop

これで、3秒おきに「こんにちは」と表示されます。

このプログラムの欠点は CTRL-C 等で中止できないことです。
これを解決するには、2番目の参考 URL から BU というツールを入手して、例えば次のようにすると良いでしょう。

  @echo off
  :loop
  echo こんにちは
  sleep 3
  bu ctrlkey
  if errorlevel 1 goto end
  goto loop
  :end

これなら、CTRL キーを押せばプログラムを停止できます。

参考URL:http://hp.vector.co.jp/authors/VA007219/,http://hp.vector.co.jp/authors/VA000007/bu.htm

ラベルと goto を使っても、できますよ。(Windows98SE で確認)

3秒待たせるためのコマンド sleep.exe は、1番目の参考 URL から入手できます。

これを使って、以下のようなサンプルプログラムを組んでみました。

  @echo off
  :loop
  echo こんにちは
  sleep 3
  goto loop

これで、3秒おきに「こんにちは」と表示されます。

このプログラムの欠点は CTRL-C 等で中止できないことです。
これを解決するには、2番目の参考 URL から BU というツールを入手して、例えば次の...続きを読む

Qnslookupを5分おきに実行するバッチファイルの作成

初めまして。
システムの運用・管理を行っている者です。
よろしくお願い致します。
このたび、windows上で動作するバッチファイルの作成を初めて行うのですが、ネット上で色々調べても解決へなかなか向かいません。
以下の内容のバッチファイルの作成です。

nslookupコマンドを5分間隔で実行する。

以上です。
バッチファイルの作成の仕方などはもちろんわかっているのですが、どのように記述すればよいのかわかりません。
ご教授下さい。よろしくお願い致します。

Aベストアンサー

標準のコマンドには、一定時間待つというコマンドがありません。
なので、そういうコマンドをインストールするか作る必要があります。
VBScript を使うとSleep というコマンドが使えますから、
バッチから呼び出すようにするか、
VBScript で「nslookupコマンドを5分間隔で実行する。」
とするようにすればいいと思います。

参考URL:http://okwave.jp/kotaeru.php3?qid=1573768


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

人気Q&Aランキング