ChatGPT解决这个技术问题 Extra ChatGPT

批处理脚本循环

我需要执行一个命令 100-200 次,到目前为止,我的研究表明我要么必须复制/粘贴 100 个该命令的副本,要么使用 for 循环,但 for 循环需要一个列表项目,因此我需要 200 个文件来操作,或者一个包含 200 个项目的列表,这违背了这一点。

我宁愿不必编写 C 程序,也不想写那么多篇幅来记录为什么我必须编写另一个程序来执行我的程序以进行测试。修改我的程序本身也不是一种选择。

那么,给定命令 a,我将如何通过批处理脚本执行 N 次?

注意:我不想要无限循环

例如,下面是它在 Javascript 中的样子:

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

在 Windows 上运行的批处理脚本会是什么样子?


T
Top-Master

for /l 是您的朋友:

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

从 1 开始,一步一步,在 100 结束。

警告:如果它在批处理文件中,请使用 %% 而不是 %,例如:

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 是循环变量
(起始值,值增量, 结束条件[含] )


这取决于我们对“DOS”引用的字面意思。 MS-DOS 的最新版本 7.1 可以追溯到 1997 年,AFAIK 没有这些扩展。另一方面,随 Windows 提供的命令 shell 当然可以。
@Imray %x 是循环变量,/l(不是 \l)意味着 for 命令将以数字方式操作,而不是对一组文件进行操作。
通过运行 for /l %x in (1, 1, 100) do echo %x 我得到“x not expected”。
@ user193655 阅读其余答案,如果您在批处理文件中执行此操作,则需要将 %s 加倍。
@Jon,如果使用批处理文件,为什么需要两个 %
O
Olivier Faucheux

并迭代目录的文件:

@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$。在第二种情况下,DOS 将只解释一次变量(在它进入循环之前),而不是每次程序循环时。


感谢您发布此内容-我知道这不是 OP 所要求的,但这是我最终来到这里时正在寻找的内容。
F
FluorescentGreen5

一个简单但计数循环的模板:

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 电脑上使用的唯一循环代码。通过谷歌搜索找到的所有其他人都不起作用。
在您的示例中,我将添加 set /p loopcount="How many loops? " 以便您可以使用用户输入运行它。它更实用。
P
Peter Mortensen

您也可以试试这个而不是 for 循环:

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

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


这与 Marcus Culver's answer 基本相同。请不要发布不添加任何新内容的答案。谢谢!
Ups sry 没有看到,只是飞扔了它,只是看到了循环......我很抱歉 :)
M
Marcus Culver

你可以做一些事情来避免 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

P
Peter Mortensen

或者,您可以根据要循环的次数减少/增加变量:

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 是高速公路,这是需要更长时间的后街,但它会到达相同的目的地。


R
Rakesh Chaudhari

使用标签在 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
)

P
Peter Mortensen

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


你不需要在这里延迟扩展。
C
Carl Smotricz

DOS 没有为此提供非常优雅的机制,但我认为您仍然可以通过合理的努力编写一个循环进行 100 或 200 次迭代。虽然没有数字 for 循环,但您可以将字符串用作“循环变量”。

使用 GOTO 对循环进行编码,并为每次迭代使用 SET X=%X%@ 将另一个 @ 符号添加到环境变量 X;并退出循环,将 X 的值与 100(或 200)个 @ 符号的字符串进行比较。

我从来没有说过这很优雅,但它应该工作!


SET 命令的 /a 选项将计算右侧值的数值表达式。请参阅 SET 的文档。没有必要使用连接技巧。
对于 DOS,它必要的,因为在 DOS 中没有 set /a。幸运的是 qeustion 是针对 cmd... (在回答这个问题时,问题标题是“DOS 批处理脚本循环”
J
Josh Girouard

不确定是否已经提交了这样的答案,但你可以尝试这样的事情:

@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,然后程序输出它已完成执行。同样,不确定这是否已提交或类似的东西,但我认为它可能是最紧凑的。


J
Jordan B

我用这个。它与其他的几乎相同,但它只是另一种编写方式。

@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

D
Dr. Hugh Jarse

答案真的取决于你对批处理的熟悉程度,如果你不是那么有经验,我建议增加一个循环变量:

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

g
guest257351

完美无瑕的循环

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

您可以通过将第 5 行中的 10 更改为任意数字来对其进行编辑,以表示您希望它循环多少次。


这将不起作用,除非您在第二个 set 命令中指定 /a 参数,如下所示:set /a num=%num%+1。没有这个,它不会执行算术运算,而只是将“+1”作为字符串添加到原始值,最后会得到“0+1+1+1+1+1...”字符串。
谢谢,我忘记了,我的错。开始使用 python 并习惯于不需要不同的参数。
H
Hamed

使用 FOR /l 并确保使用 %% 而不是 % 它会让您头疼。

并尝试设置循环。


感谢您的参与,但这个答案并没有为 12 岁的已接受答案添加任何有用的信息,因此只会增加噪音并可能会吸引反对票和关闭/删除请求。
M
Manny

(已编辑)我做到了,所以它在 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 秒 100 次生成 4 个随机数。去掉“timeout 1 /nobreak>nul”,让它变得超级快。


问题是“100 - 200 次”,而不是“无限循环”。
C
Cocos Nucifera

我有 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)


我们感谢您做出贡献的尝试,但逐字重复五年前的答案并没有多大帮助,只会增加噪音。