批处理脚本循环

Tom*_*ell 258 windows batch-file

我需要执行100-200次命令,到目前为止我的研究表明我要么必须复制/粘贴此命令的100个副本,要么使用for循环,但for循环需要一个项目列表,因此我需要要操作的200个文件,或200个项目的列表,都会失败.

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

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

Jon*_*Jon 496

for /l 是你的朋友:

for /l %x in (1, 1, 100) do echo %x
Run Code Online (Sandbox Code Playgroud)

从1开始,一步一步,结束于100.

%如果它在批处理文件中,请使用两个

for /l %%x in (1, 1, 100) do echo %%x
Run Code Online (Sandbox Code Playgroud)

(这是我真正讨厌Windows脚本的事情之一)

如果循环的每次迭代都有多个命令,请执行以下操作:

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

或者在批处理文件中

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

键:
/l表示for命令将以数字方式运行,而不是对一组文件进行操作
%x是循环变量
(起始值,值的增量,结束条件[包括])

  • 通过在(1,1,100)中运行`for/l%x来做echo%x`我得到"x not expected". (17认同)
  • 你能解释一下这究竟意味着什么吗?例如,什么是'%x`?`\ l`? (12认同)
  • @Imray`%x`是循环变量,`/ l`(不是`\ l``)意味着for命令将以数字方式运行,而不是在一组文件上运行. (7认同)
  • 最后一个循环中的%x应为%% x. (6认同)
  • @Pacerier我不知道,你不得不问微软. (4认同)
  • 这取决于我们对“DOS”引用的字面意思。最新版本的 MS-DOS 7.1 可以追溯到 1997 年,AFAIK 没有这些扩展。另一方面,Windows 提供的命令外壳当然可以。 (2认同)
  • @user193655 阅读答案的其余部分,如果您在批处理文件中执行此操作,则需要将 %s 加倍。 (2认同)
  • @Jon,如果使用批处理文件,为什么需要两个“%”? (2认同)
  • @wildpointercs取决于它是否在批处理文件中... (2认同)

Oli*_*eux 61

并迭代目录的文件:

@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!
)
Run Code Online (Sandbox Code Playgroud)

你必须使用"enableDelayedExpansion"和!FILENAME!而不是$ FILENAME $.在第二种情况下,DOS将只解释变量一次(在它进入循环之前),而不是每次程序循环.

  • 感谢发布这个 - 我知道这不是OP所要求的,但是当我到达这里时,这就是我正在寻找的东西. (18认同)

Flu*_*en5 20

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

set loopcount=[Number of times]
:loop
[Commands you want to repeat]
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop
Run Code Online (Sandbox Code Playgroud)

示例:说"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
Run Code Online (Sandbox Code Playgroud)

这个例子将输出:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

  • 如果它写得更好,没有错 (2认同)
  • 在你的例子中,我会添加`set/p loopcount ="多少个循环?"`这样你就可以用用户输入来运行它.它更实用. (2认同)

小智 7

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

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

它非常小,这是我一直使用的.


Mec*_*ash 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
Run Code Online (Sandbox Code Playgroud)

显然,使用FOR /L是高速公路,这是后街需要更长的时间,但它到达同一个目的地.


小智 6

您可以对以下效果做一些事情来避免 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
Run Code Online (Sandbox Code Playgroud)