在Windows批处理文件中如何循环?

194

在Windows批处理文件中,FOR循环的语法是什么?


https://ss64.com/nt/for.html - bobobobo
9个回答

256

如果你想做某事x次,你可以这样做:

例如(x = 200):

FOR /L %%A IN (1,1,200) DO (
  ECHO %%A
)

1,1,200 的意思是:

  • 起始值为 1
  • 每步增加 1
  • 结束值为 200

17
谢谢添加。如果您在示例中将起始值更改为不同于增��的值,可能会更清晰易懂。 - Warren Stevens
7
最终值是包含在内的。 - Roland Pihlakas
FYI,这个语法在MS-DOS中不起作用。 - KERR

140
FOR %%A IN (list) DO command parameters

list 是由空格、逗号或分号分隔的任意元素列表。

command 可以是任何内部或外部命令、批处理文件,甚至在 OS/2 和 NT 中可以是一系列命令。

parameters 包含 command 的命令行参数。 在这个例子中,command 将针对列表中的每个元素执行一次,如果指定了参数,则使用参数执行。

一种特殊类型的参数(或甚至是命令)是 %%A,它将被连续地替换为列表中的每个元素。

来自FOR 循环


3
我可以将范围(1到100)列在列表中吗? - Pradeep
38
FOR /L %x IN (1,1,100) DO ... - Joey
如果您想在 for 循环中包含多行,请在 [参数] 周围放置括号。 - Frank Bryce
1
@aaiezza,我赞同你的观点。我现在正在与这些可恶的循环作斗争,它们的工作完全出乎意料,而且通过输出我也不知道什么在控制着任何东西。这是可怕的东西。虽然有用,但真的很可怕。 - RockDoctor

55

类型:

for /?

然后你会得到几页帮助文本。


9
我更喜欢这个答案,因为它处理了不同版本的DOS / Windows。多年来,“for”已经得到了显着增强,而问题并未说明针对哪个版本或场景进行尝试。 - Mattias Andersson
这值得一条评论,但不值得一个答案。 - BsAxUbx5KoQDEpCAqSffwGy554PSah

46
有条件地执行多次命令。
  • syntax-FOR-Files

    FOR %%parameter IN (set) DO command 
    
  • syntax-FOR-Files-Rooted at Path

    FOR /R [[drive:]path] %%parameter IN (set) DO command 
    
  • syntax-FOR-Folders

    FOR /D %%parameter IN (folder_set) DO command 
    
  • syntax-FOR-List of numbers

    FOR /L %%parameter IN (start,step,end) DO command 
    
  • syntax-FOR-File contents

    FOR /F ["options"] %%parameter IN (filenameset) DO command 
    

    or

    FOR /F ["options"] %%parameter IN ("Text string to process") DO command
    
  • syntax-FOR-Command Results

    FOR /F ["options"] %%parameter IN ('command to process') DO command
    

IT

  • 获取一组数据
  • 将 FOR 参数 %%G 设置为该数据的某个部分
  • 执行一个命令(可以选择使用参数作为命令的一部分)。
  • --> 重复每个数据项

如果您在命令行中使用 FOR 命令而不是在批处理程序中使用,请只使用一个百分号:%G 而不是 %%G

FOR 参数

  • 第一个参数必须使用单个字符定义,例如字母 G。

  • FOR %%G IN ...

    在 FOR 循环的每次迭代中,IN (....) 子句被评估,并将 %%G 设置为不同的值。

    如果此子句导致单个值,则将 %%G 设置为该值并执行命令。

    如果该子句导致多个值,则会隐式定义额外的参数以保存每个值。这些参数将按字母顺序自动分配 %%H %%I %%J ...(隐式参数定义)

    如果参数引用文件,则可以使用增强的变量引用来提取文件名/路径/日期/大小。

    当然,除了 %%G 之外,您当然可以选择字母表中的任何字母。但是它是一个很好的选择,因为它不会与任何路径名格式字母(a、d、f、n、p、s、t、x)冲突,并提供最长的非冲突字母序列以用作隐式参数。


1
如何使用for循环进入先前设置的变量?我尝试了for /F "tokens=2 delims=," %%i in ( %a% ) do ( ….. 但是这不起作用。它失败并显示“此时未预期 (” 的错误信息。 - Shivani
你好。%a%是指一个普通文件的名称吗?这个格式让人很难帮助你。请阅读[ask]后,随时提出新问题。 - J. Chomel
2
@jumping_monkey,FOR命令创建参数变量,这些变量用字母而不是数字来标识(例如%%G)。路径格式参数扩展也可以应用于这些变量。为避免两组字母之间的混淆,请避免使用字母(a、d、f、n、p、s、t、x、z)作为FOR参数,或者选择一个大写的FOR参数字母。 - J. Chomel
嗨@J.Chomel,例如在引用中的%%~fG中,%%G是FOR参数,而~f是参数扩展。我明白了(在这里)[https://ss64.com/nt/syntax-args.html],感谢你。干杯,伙计。 - jumping_monkey

15

FOR命令可以为您提供关于FOR循环的任何信息,包括正确使用的示例。


13

尝试使用这段代码:

@echo off
color 02
set num1=0
set num2=1 
set terminator=5
:loop
set /a num1= %num1% + %num2%
if %num1%==%terminator% goto close
goto open
:close
echo %num1%
pause 
exit
:open
echo %num1%
goto loop

num1 是要递增的数字,num2 是要添加到 num1 上的值,terminator 是 num1 结束的值。在这个语句中,你可以指定不同的终止值 (if %num1%==%terminator% goto close)。如果布尔表达式为 true,则该过程为 goto close,如果布尔表达式为 false,则该过程为 goto open。


1
这是最容易理解的。其他答案几乎没有解释命令和标志的作用。对于只了解JavaScript的人来说,批处理文件一点也不直观。 - user1934286

5
@echo off
echo.
set /p num1=Enter Prelim:
echo.
set /p num2=Enter Midterm:
echo.
set /p num3=Enter Semi:
echo.
set /p num4=Enter Finals:
echo.
set /a ans=%num1%+%num2%+%num3%+%num4%
set /a avg=%ans%/4
ECHO %avg%
if %avg%>=`95` goto true
:true
echo The two numbers you entered were the same.
echo.
pause
exit

5

来自 FOR /? 帮助文档:

FOR %variable IN (set) DO command [command-parameters]

%variable 指定一个单个字母可替换的参数。
(set) 指定一个或多个文件的集合。可以使用通配符。 command 指定要针对每个文件执行的命令。
command-parameters
指定指定命令的参数或开关。

要在批处理程序中使用 FOR 命令,请指定 %%variable 而不是 %variable。变量名称区分大小写,因此 %i 与 %I 不同。

如果启用了命令扩展,则支持以下其他 FOR 命令形式:

FOR /D %variable IN (set) DO command [command-parameters]

If set contains wildcards, then specifies to match against directory  
names instead of file names.                                          

FOR /R [[驱动器:]路径] %变量 IN (集合) DO 命令 [命令参数]

该命令用于在指定路径下递归地执行命令。变量将被分配为路径中的所有文件名和文件夹名。

Walks the directory tree rooted at [drive:]path, executing the FOR    
statement in each directory of the tree.  If no directory             
specification is specified after /R then the current directory is     
assumed.  If set is just a single period (.) character then it        
will just enumerate the directory tree.                               

使用FOR /L命令可以迭代数字,%variable定义了一个可替换的参数,在每次迭代中,该参数被设置为从start到end以step为步长的下一个数字。当循环执行时,可以对每个数字执行一个命令。

The set is a sequence of numbers from start to end, by step amount.   
So (1,1,5) would generate the sequence 1 2 3 4 5 and (5,-1,1) would   
generate the sequence (5 4 3 2 1)                                     

0

这里也留下一个纯 MS-DOS 的示例。这是我找到的唯一可用的示例:

FOR %A in (1, 2, 3, 4, 5) DO ECHO %A

enter image description here

你也可以使用空格代替逗号。


请注意,此命令仅在命令提示符中直接运行,无法在批处理文件中运行。对于批处理文件,您应该将%符号加倍使用:FOR %%A in (1, 2, 3, 4, 5) DO ECHO %%A - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接