こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

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

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

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

投稿日時 - 2004-11-18 19:39:20

QNo.1090194

暇なときに回答ください

質問者が選んだベストアンサー

ラベルと 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

投稿日時 - 2004-11-18 20:49:05

お礼

ご返事ありがとうございます。
以下のようにすると上手くいきました。
sleepですが、ANo.5のご意見を参考に、pingを
記述したバッチをsystem32配下に置いて使いました。
するとCtrl + C で終了できました。

以下roop.batの内容----------------

@echo off
:label01
echo /************************************
echo テスト
echo ************************************/
call sleep 3
goto label01

-----------------------------------

なぜかはよくわかりませんが。
sleep.batを呼ぶときに、callを指定しないと
次のgoto文までいかずに処理が止まってしまいます。

投稿日時 - 2004-11-19 11:28:06

ANo.3

このQ&Aは役に立ちましたか?

17人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

No.3です。補足します。

> sleep.batを呼ぶときに、callを指定しないと
> 次のgoto文までいかずに処理が止まってしまいます。

DOS のバッチ機能は、UNIX のシェルと違って呼出しのネストは行われませんので、そういうものだと諦めて下さい。
(バッチからのバッチ呼出しは、Basic で言えば、GOSUB ではなく GOTO に相当します。)

したがって、別のバッチを呼び出した後元の所に戻ってくるためには、call が必要となります。

投稿日時 - 2004-11-19 12:40:33

ANo.5

sleep の代わりに、ping localhost を使う手もあります。
(どこかで知りました。)

他人のPCなど、インストールとかせずにsleepしたいときは便利かもしれません。
トリビア?としてもどうぞ。
当然ですが、0.1秒単位での正確さはないと思います。

<10秒ウェイト>
call sleep.bat 10

<sleep.bat>
@echo off
ping localhost -n 2 > nul
ping localhost -n %1 > nul

投稿日時 - 2004-11-18 21:26:09

お礼

ご返事ありがとうございます。
手軽にsleep機能を使えるかなり素敵な方法だと思います。

お蔭様でうまくいきました。

投稿日時 - 2004-11-19 11:34:16

ANo.4

'VBScriptでやってみました
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set wshShell = WScript.CreateObject("WScript.shell")
do while(1)
' 実行したいコマンド
wshShell.Run "ping 192.168.0.1",,true '"コマンドを記入",,終了を待つ

WScript.Sleep(10000) '数値はミリ秒
if fso.FileExists("QUIT.txt") then WScript.Quit '終了できる仕掛け、ファイルがあれば終了
loop
別ウィンドウになってしまうのが難点ですかね~

投稿日時 - 2004-11-18 21:12:29

ANo.2

ループさせたいのでしたらgotoですね。

ただし、sleepは#1の方の書かれたとおり、ありません。
wshなりNTのリソースキットなり、自分で作ったりフリーのものを探したりといったことが必要です。

投稿日時 - 2004-11-18 20:43:22

ANo.1

DOSプロンプトでのループは

for /?

でご確認を。(NT系のみ)

でも sleep コマンドはないので、そこだけ wsh(JScript や VBScript)になります。

そうなると、結局全部 wsh でやった方が楽かも。

投稿日時 - 2004-11-18 20:16:50

あなたにオススメの質問