web-dev-qa-db-ja.com

バッチスクリプトループ

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

Cプログラムを書く必要はなく、テスト目的で自分のプログラムを実行するために別のプログラムを書かなければならない理由を文書化する必要はありません。私のプログラム自体の修正も選択肢にはなりません。

それでは、aというコマンドがあったとして、それをバッチスクリプトでどのようにN実行するのでしょうか。

236
Tom J Nowell

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スクリプティングについて嫌いなことの一つです)

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

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はloops変数です
(開始値、値の増分、終了条件[含む])

466
Jon

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

@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 $の代わりに。後者の場合、DOSは変数を1回だけ(ループに入る前に)解釈し、プログラムがループするたびには解釈しません。

56

単純だが数えられたループのためのテンプレート:

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 . . .
19

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

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

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

6
BlazeLP

あるいは、ループしたい回数だけ変数を増減することもできます。

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を使用するのが高速道路であり、これはより長い時間を要するバックストリートですが、同じ目的地に到達します。

6
Mechaflash

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
4
Marcus Culver

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

2
zask

DOSはこのための非常に洗練されたメカニズムを提供していません、しかし私はあなたがまだ合理的な努力で100または200回の繰り返しのためにループをコーディングすることができると思います。数値のforループはありませんが、文字列を「ループ変数」として使用できます。

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

私はこれがエレガントだと言ったことは一度もないが、うまくいくはずだ!

1
Carl Smotricz

ラベルを使用して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

答えは本当にあなたがバッチに慣れているかに依存します、あなたがそれほど経験がないならば、私はループ変数を増やすことをお勧めします:

@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
Dr. Hugh Jarse

Forループでseqを使用

for i in `seq 1 100`
do 
   echo $i
done
0
Dennis Djan

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

@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
Jordan B

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

@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
Josh Girouard