簡體   English   中英

批處理腳本循環

[英]Batch script loop

我需要執行一個命令 100-200 次,到目前為止,我的研究表明我要么必須復制/粘貼 100 個該命令的副本,要么使用for循環,但for循環需要一個項目列表,因此我將需要 200 個文件來操作,或 200 個項目的列表,這與這一點無關。

我寧願不必編寫 C 程序和 go 來記錄為什么我必須編寫另一個程序來執行我的程序以進行測試。 修改我的程序本身也不是一種選擇。

那么,給定一個命令a ,我將如何通過批處理腳本執行它N次?

注意:我不想要無限循環

例如,這是 Javascript 中的樣子:

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

在 Windows 上運行的批處理腳本中會是什么樣子?

for /l是你的朋友:

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

從 1 開始,一步一步,到 100 結束。

如果它在批處理文件中,請使用兩個% s

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是循環變量
(起始值,值的增量,結束條件[包括])

並迭代目錄的文件:

@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 只會解釋變量一次(在它進入循環之前),而不是每次程序循環時。

一個簡單但計數的循環的模板:

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

你也可以試試這個而不是for循環:

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

它很小,是我一直使用的。

您可以對以下效果做一些事情來避免 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

或者,您可以按要循環的次數遞減/遞增變量:

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是高速公路,這是需要更長的時間的后街,但它會到達相同的目的地。

您可以在沒有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

使用標簽在 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
)

DOS 沒有為此提供非常優雅的機制,但我認為您仍然可以通過合理的努力為 100 或 200 次迭代編寫循環。 雖然沒有數字for循環,但您可以使用字符串作為“循環變量”。

使用 GOTO 對循環進行編碼,對於每次迭代,使用SET X=%X%@將另一個@符號添加到環境變量 X; 並退出循環,將 X 的值與 100(或 200) @符號的字符串進行比較。

我從來沒有說過這很優雅,但它應該有效!

不確定是否已經提交了這樣的答案,但您可以嘗試以下操作:

@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% 將增加 1,直到它達到 100,然后程序輸出它已完成執行。 同樣,不確定是否已提交或類似的內容,但我認為它可能是最緊湊的。

我用這個。 它與其他東西幾乎相同,但它只是另一種編寫方式。

@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

答案實際上取決於您對批處理的熟悉程度,如果您沒有經驗,我建議您增加一個循環變量:

@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]

在for循環中使用seq

for i in `seq 1 100`
do 
   echo $i
done

您可以設置以下命令並嘗試一下嗎?

@echo off
:start
echo Run Program : 
%USERPROFILE%\Desktop\Copy.bat
echo 120 time waiting..
choice /d y /t 120 > nul
echo End..Reload Command..

:loop
goto start
goto loop

如果您有多個命令,請向您自己復制循環。

這是我將使用的模板腳本。

@echo off
goto Loop

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

exit

它的作用是當它開始時它關閉回聲然后它運行“循環”但在那個地方它繼續進入“循環”(我希望這會有所幫助。)

一個完全完美的循環

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

您可以通過將第 5 行中的 10 更改為任意數字來編輯它,以表示您希望它循環多少次。

使用 FOR /l 並確保使用 %% 而不是 % 它會省去你的麻煩。

並嘗試設置循環

這是一個非常簡單的代碼:
@echo 關閉
設置 a=1
設置 b=0
:1
如果 %b% gtr 3 轉到:2
回聲%b%
超時 /t 3 /nobreak >nul
設置 /ab=%a%+%b%
分類
轉到:1
:2
msg * 任務完成!
出口

(已編輯)我做到了,所以它在 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”以使其運行速度超快。

我需要執行一次命令100-200次,到目前為止,我的研究表明我要么必須復制/粘貼該命令的100個副本,要么使用for循環,但是for循環需要項列表,因此我將需要200個文件進行操作,或者需要200個項目的列表才能達到目的。

我寧願不必編寫C程序,也不必花大量時間記錄為什么我必須編寫另一個程序來執行我的程序以進行測試。 修改程序本身也不是一種選擇。

因此,給定命令a ,我如何通過批處理腳本執行N次?

注意:我不要無限循環

例如,這是Javascript中的樣子:

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

在Windows上運行的批處理腳本中會是什么樣?

我有 2 個答案方法 1:將Javascript 插入批處理

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

:: batch portion

@ECHO OFF

cscript /e:jscript "%~f0"


:: JScript portion */

Input Javascript here

(我對 JavaScript 了解不多)

方法二:批量循環

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

(感謝 FluorescentGreen5)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM