欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

cmd中for的用法

程序员文章站 2023-01-16 11:31:06
在cmd窗口输入for /?后的原文,被我自己“翻译”了一下,更像人话了。 推荐去https://www.cnblogs.com/cbugs/p/8992059.html这篇部落格里去看看,讲的更好。 在cmd窗口输入for /?后 原文“翻译” 对一组文件中的每一个文件执行某个特定命令。 基本格式 ......

在cmd窗口输入for /?后的原文,被我自己“翻译”了一下,更像人话了。

推荐去这篇部落格里去看看,讲的更好。

 

在cmd窗口输入for /?后

cmd中for的用法

 

原文“翻译”

对一组文件中的每一个文件执行某个特定命令。

 

基本格式:

for %variable in (set) do command [command-parameters]

指令

含义

%variable

指定一个单一字母可替换的参数。

(set)    

指定一个或一组文件。可以使用通配符。

command

指定对每个文件执行的命令。

command-parameters

为特定命令指定参数或命令行开关。

   

注意:

在批处理程序中使用 for 命令时,指定变量请使用 %%variablem,而不要用 %variable。

此外,变量名称是区分大小写的,所以 %i 不同于 %i.

 

 for 命令支持以下形式:

 

/d 目录

for /d %variable in (set) do command [command-parameters]

 只搜索当前目录而非文件,可以指定通配符。

 

/r 递归

for /r [[drive:]path] %variable in (set) do command [command-parameters]

以 [drive:]path 为根,对每个目录执行for语句。

如果在 /r 后没有指定目录规范,则使用当前目录。

如果集仅为一个单点(.)字符,则枚举该目录树。

 

/l 增量序列

for /l %variable in (start,step,end) do command [command-parameters]

该集表示以增量形式从开始到结束的一个数字序列。

因此,(1,1,5)将产生序列1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

 

/f 文本、命令分析

for /f ["options"] %variable in (file-set) do command [command-parameters]

for /f ["options"] %variable in ("string") do command [command-parameters]

for /f ["options"] %variable in ('command') do command [command-parameters]

 

如果有 usebackq 选项就要写成以下格式:

for /f ["options"] %variable in ("file-set") do command [command-parameters]
for /f ["options"] %variable in ('string') do command [command-parameters]
for /f ["options"] %variable in (`command`) do command [command-parameters]

 

fileset 解析一个或多个文件名。

string 解析字符串

conmmand 解析一个命令的结果,可以和tokens连用以用来获取制定命令结果的指定行。

 

fileset 中的每份文件都被打开、读取并经过处理。

处理时读取文件,将其分成一行行的文字, 然后将每行解析成零或更多的符号。

最后用已找到的符号字符串变量值调用 for 循环。 

 

默认情况下,/f 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。

可以在/f后面添加字符串,其内容及意义如下:

"options"的内容

意义

eol=c  

指定一个行注释字符的结尾(就一个)。例如eol=;--忽略以分号打头的那些行。

skip=n   

指定在文件开始时忽略的行数。例如skip=2 --忽略2行

delims=xxx

指定分隔符,可以有多个。

tokens=x,y,m-n

指每行的哪一个符号被传递到每个迭代 的 for 本身。这会导致额外变量名称的分配。

可以使用m-n指定一个范围的变量。

若指定的最后一个字符是星号,那额外的变量将会分配到最后一个变量解析之后该行剩余的文本。

usebackq

若指定的文件名称有空格,则需要对其进行转义。

但使用‘’或“”会被理解为字符串或命令。

所以添加该参数以指定新的转义方式。

 

 

例:

for /f "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

 

分析 myfile.txt中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for 函数体,指定分隔符为“,”或空格。

此 for 函数体的语句引用 %i 来获得第二个符号,引用 %j 来获得第三个符号,引用 %k来获得第三个符号后的所有剩余符号。

对于带有空格的文件名,你需要用双引号将文件名括起来,为了用这种方式来使用双引号,还需要使用 usebackq 选项。

否则,双引号会被理解成是用作定义某个要分析的字符串的。

 

%i 在 for 语句中显式声明,%j 和 %k 是通过tokens= 选项隐式声明的。

可以通过 tokens= 一行指定最多 26 个符号,不要试图声明一个高于字母 "z" 或"z" 的变量。

请记住,for 变量是单一字母、分大小写和全局的变量;而且,不能同时使用超过 52 个。

 

例:

for /f "usebackq" %i in ('abc') do echo %i

打印abc

 

 

还可以在相邻字符串上使用 for /f 分析逻辑,方法是,用单引号将括号之间的 file-set 括起来。

这样,该字符串会被当作一个文件中的一个单一输入行进行解析。

 

可以用 for /f 命令来分析命令的输出。

方法是,使用反引号括起字符串,则该字符串会被当作命令行,其命令结果会输出到内存中并被当作文件分析。

 

例:

for /f "usebackq delims==" %i in (`set`) do @echo %i

枚举当前环境中的环境变量名称。

 

另外,for 变量参照的替换已被增强。你现在可以使用下列

选项语法:

 

     %~i          - 删除任何引号("),扩展 %i

     %~fi        - 将 %i 扩展到一个完全合格的路径名

     %~di        - 仅将 %i 扩展到一个驱动器号

     %~pi        - 仅将 %i 扩展到一个路径

     %~ni        - 仅将 %i 扩展到一个文件名

     %~xi        - 仅将 %i 扩展到一个文件扩展名

     %~si        - 扩展的路径只含有短名

     %~ai        - 将 %i 扩展到文件的文件属性

     %~ti        - 将 %i 扩展到文件的日期/时间

     %~zi        - 将 %i 扩展到文件的大小

     %~$path:i   - 查找列在路径环境变量的目录,并将 %i 扩展

                   到找到的第一个完全合格的名称。如果环境变量名

                   未被定义,或者没有找到文件,此组合键会扩展到

                   空字符串

 

可以组合修饰符来得到多重结果:

 

     %~dpi       - 仅将 %i 扩展到一个驱动器号和路径

     %~nxi       - 仅将 %i 扩展到一个文件名和扩展名

     %~fsi       - 仅将 %i 扩展到一个带有短名的完整路径名

     %~dp$path:i - 搜索列在路径环境变量的目录,并将 %i 扩展

                   到找到的第一个驱动器号和路径。

     %~ftzai     - 将 %i 扩展到类似输出线路的 dir

 

在以上例子中,%i 和 path 可用其他有效数值代替。%~ 语法

用一个有效的 for 变量名终止。选取类似 %i 的大写变量名

比较易读,而且避免与不分大小写的组合键混淆。