バッチスクリプトループ


275

コマンドを100〜200回実行する必要があります。これまでのところ、私の研究では、このコマンドのコピーを100コピー/貼り付ける必要があるか、forループを使用forする必要がありますが、ループはアイテムのリストを想定しているため、操作する200個のファイル、または200個のアイテムのリストで、ポイントを無効にします。

テスト目的でプログラムを実行するために別のプログラムを作成しなければならない理由を文書化して、Cプログラムを作成する必要はありません。プログラム自体の変更もオプションではありません。

それで、コマンドが与えられたa場合N、バッチスクリプトを使用してそれをどのように実行しますか?

注:無限ループは必要ありません

たとえば、JavaScriptでは次のようになります。

var i;
for (i = 0; i < 100; i++) {
  console.log( i );
} 

Windowsで実行されているバッチスクリプトではどのように見えますか?


回答:


524

for /l あなたの友だちです:

for /l %x in (1, 1, 100) do echo %x

1から始まり、1つずつ進み、100で終わります。

%バッチファイル内にある場合は2つのを使用します

for /l %%x in (1, 1, 100) do echo %%x

(これは、Windowsスクリプトについて私が本当に嫌いなことの1つです)

ループの反復ごとに複数のコマンドがある場合は、次のようにします。

for /l %x in (1, 1, 100) do (
   echo %x
   copy %x.txt z:\whatever\etc
)

またはバッチファイルで

for /l %%x in (1, 1, 100) do (
   echo %%x
   copy %%x.txt z:\whatever\etc
)

キー:一連のファイルではなく数値でコマンドが動作する
/lことを示しforます
%x。ループ変数は、ループ変数です
(開始値、値の増分、終了条件[含む])。


2
それは、文字通り「DOS」参照をどのように取るかによって異なります。MS-DOSの最新バージョン7.1は1997年に遡り、AFAIKにはこれらの拡張機能はありません。一方、Windowsで提供されているコマンドシェルはもちろん使用できます。
Carl Smotricz、2010

8
@Imray %xはループ変数であり/l(ではなく\l)、forコマンドが一連のファイルではなく数値で動作することを意味します。
Jon

19
実行for /l %x in (1, 1, 100) do echo %xすると、「xは予期されません」が表示されます。
ラブラッカ2015年

2
@ user193655残りの回答を読んでください。これをバッチファイルで行う場合は、%sを2倍にする必要があります。
Jon

7
最後のループの%xは%% xでなければなりません。
wildpointercs 2015年

63

そして、ディレクトリのファイルを反復するには:

@echo off 
setlocal enableDelayedExpansion 

set MYDIR=C:\something
for /F %%x in ('dir /B/D %MYDIR%') do (
  set FILENAME=%MYDIR%\%%x\log\IL_ERROR.log
  echo ===========================  Search in !FILENAME! ===========================
  c:\utils\grep motiv !FILENAME!
)

「enableDelayedExpansion」と!FILENAME!を使用する必要があります。$ FILENAME $の代わりに。2番目のケースでは、DOSは変数を(ループに入る前に)1回だけ解釈し、プログラムがループするたびには解釈しません。


19
これを投稿してくれてありがとう-OPが求めていたものではないことはわかっていますが、結局ここで私が探していたものです。
BrainSlugs83 2013年

24

単純だがカウントされたループのテンプレート:

set loopcount=[Number of times]
:loop
[Commands you want to repeat]
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop

例:「Hello World!」と言います 5回:

@echo off
set loopcount=5
:loop
echo Hello World!
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop
pause

この例は出力します:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .

これは、Win7 PCで使用できた唯一のループコードです。グーグルで見つけた他のすべては動作しません。
LaBracca 2015年

2
あなたの例では、set /p loopcount="How many loops? "ユーザー入力で実行できるように追加します。より実用的です。
1934286 2017

8

forループの代わりにこれを試すこともできます:

set count=0
:loop
set /a count=%count%+1
(Commands here)
if %count% neq 100 goto loop
(Commands after loop)

それはかなり小さく、私がいつも使用しているものです。


1
これは基本的にマーカスカルバーの回答と同じです。新しいものを追加しない回答を投稿しないでください。ありがとうございました!
Fabioはモニカ

Ups sryはそれを認識しませんでした。ただ投げてループを確認しただけです...ごめんなさい:)
BlazeLP 2016年

6

または、ループしたい回数だけ変数をデクリメント/インクリメントできます。

SETLOCAL ENABLEDELAYEDEXPANSION
SET counter=200
:Beginning
IF %counter% NEQ 0 (
echo %x
copy %x.txt z:\whatever\etc
SET /A counter=%counter%-1
GOTO Beginning
) ELSE (
ENDLOCAL
SET counter=
GOTO:eof

明らかに、使用FOR /Lは高速道路であり、これは長い時間がかかる裏通りですが、同じ目的地に到達します。


5

FORループを回避して、次の効果に対して何かを行うことができます。

set counter=0
:loop
echo "input commands here"
SET /A counter=%counter%+1
if %counter% GTR 200
(GOTO exit) else (GOTO loop)
:exit
exit

2

これはforステートメントなしで実行できます^。^:

@echo off
:SPINNER
SET COUNTP1=1

:1
CLS
 :: YOUR COMMAND GOES HERE
IF !COUNTP1! EQU 200 goto 2

SET COUNTP1=1
) ELSE (
SET /A COUNTP1+=1
)
goto 1

:2
:: COMMAND HAS FINISHED RUNNING 200 TIMES

基本的な理解があります。ただそれをテストしてください。:P


1
ここで拡張を遅らせる必要はありません。
Stephan

2

ラベルを使用してcmdプログラミングでループを実装する非常に基本的な方法

@echo off
SET /A "index=1"
SET /A "count=5"
:while
if %index% leq %count% (
   echo The value of index is %index%
   SET /A "index=index + 1"
   goto :while
)

1

DOSはこれに対して非常に洗練されたメカニズムを提供していませんが、妥当な労力で100または200反復のループをコーディングできると思います。数値はありませんがforループはありませんが、文字列を「ループ変数」として使用できます。

GOTOを使用してループをコーディングし、反復ごとに使用SET X=%X%@@て、環境変数Xにさらに別の符号を追加します。ループを終了するには、Xの値を100(または200)@記号の文字列と比較します。

エレガントだとは言っていませんが、うまくいくはずです。


1
コマンドの/aオプションは、SET右側の値の数値式を評価します。SETのドキュメントを参照してください。連結トリックを行う必要はありません。
Adam Porad

2
DOSのために、それはありません何があるとして、neccessary set /aDOSで。幸いなことに、この質問はcmd...(この回答の時点では、質問のタイトルは "DOSバッチスクリプトループ"でした
ステファン

0

このような回答がすでに送信されているかどうかはわかりませんが、次のようなことを試すことができます。

@echo off
:start
set /a var+=1
if %var% EQU 100 goto end
:: Code you want to run goes here
goto start

:end
echo var has reached %var%.
pause
exit

変数%var%は、プログラムが実行を終了したことを出力する100に達するまで1ずつ増加します。繰り返しになりますが、これが提出されたかどうか、またはそのようなものかどうかはわかりませんが、最もコンパクトなものになると思います。


0

私はこれを使います。それは他のものとほとんど同じですが、それを書くための単なる別の方法です。

@ECHO off
set count=0
:Loop
if %count%==[how many times to loop] goto end
::[Commands to execute here]
set count=%count%+1
goto Loop
:end

0

答えは本当にバッチにどの程度慣れているかによって異なります。あまり経験がない場合は、ループ変数をインクリメントすることをお勧めします。

@echo off
set /a loop=1
:repeat
echo Hello World!
set /a loop=%loop%+1
if %loop%==<no. of times to repeat> (
goto escapedfromrepeat
)
goto repeat
:escapedfromrepeat
echo You have come out of the loop
pause

ただし、バッチの経験が豊富な場合は、より実用的for /l %loop in (1, 1, 10) do echo %loopな方法を選択することをお勧めします。

             (start at 1, go up in 1's, end at 10)
for /l %[your choice] (start, step, end) do [command of your choice]

0

これが私が使用するテンプレートスクリプトです。

@echo off
goto Loop

:Loop
<EXTRA SCRIPTING HERE!!!!>
goto Loop

exit

これは、開始時にエコーをオフにし、その後「ループ」を実行しますが、その場所では引き続き「ループ」になります(これが役立つことを願っています)。


0

完全に完璧なループ

set num=0
:loop
:: insert code
set num=%num%+1
if %num% neq 10 goto loop
::insert after code code

5行目の10を任意の数に変更して、ループする回数を表すことで編集できます。


-2

(編集済み)100回後に停止するように作成しました

@echo off
goto actual
set /a loopcount=0
:actual
set /a loopcount=%loopcount% + 1
echo %random% %random% %random% %random%
timeout 1 /nobreak>nul
if %loopcount%== 100 goto stop
goto actual
:stop
exit

これにより、1秒ごとに4つの乱数が100回生成されます。「timeout 1 / nobreak> nul」を取り出して、超高速にします。


3
問題は「無限ループ」ではなく「100-200回」でした。
ステファン

-2

たぶんgoto likeを使う

@echo off
:Whatever
echo hello world
pause
echo TEST
goto Whatever

これはinf(無限)ループを実行します。


まあ、infinite要求されたよりかなり大きいので、100-200 timesこれは質問に答えません。
ステファン

実際、一定回数ループできるようにしたかったので、コマンドを何度もコピーして貼り付ける必要はありませんでした
Tom J Nowell

-2

私は2つの答えがあります方法1: バッチにJavascriptを挿入する

@if (@a==@b) @end /*

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(私はJavaScriptについてあまり知りません)

方法2: バッチでループ

   @echo off
    set loopcount=5
    :loop
    echo Hello World!
    set /a loopcount=loopcount-1
    if %loopcount%==0 goto exitloop
    goto loop
    :exitloop
    pause

(ありがとうFluorescentGreen5)


1
貢献していただきありがとうございます。5年前の回答を逐語的に繰り返しても効果はありません。
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.