CMD for用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMD for用法相关的知识,希望对你有一定的参考价值。

删除所有CMD名文件中的以数字开头的文件夹

为你找到了相应讲解,慢慢看吧...

在命令行窗口中,输入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]

如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

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)。

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]

filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前,每份文件都已被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:

eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n 格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset 中使用双引号扩起文件名称。

某些范例可能有助:

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 分析逻辑;方法是,用单引号将括号之间的 filenameset 括起来。这样,该字符串会被当作一个文件中的一个单一输入行。最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进内存,并被当作文件分析。因此,以下例子:

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 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
参考技术A 1:for命令及变量 基本格式:
FOR /参数 %variable IN (set) DO command [command_parameters] %variable:指定一个单一字母可替换的参数,如:%i ,而指定一个变量则用:%%i ,而调用变量时用:%i% ,变量是区分大小写的(%i 不等于 %I)。
批处理每次能处理的变量从%0—%9共10个,其中%0默认给批处理文件名使用,%1默认为使用此批处理时输入的的第一个值,同理:%2—%9指输入的第2-9个值;例:net use \\ip\ipc$ pass /user:user 中ip为%1,pass为%2 ,user为%3
(set):指定一个或一组文件,可使用通配符,如:(D:\user.txt)和(1 1 254)(1 -1 254), “(1 1 254)”第一个"1"指起始值,第二个"1"指增长量,第三个"254"指结束值,即:从1到254;“(1 -1 254)”说明:即从254到1
command:指定对第个文件执行的命令,如:net use命令;如要执行多个命令时,命令这间加:& 来隔开
command_parameters:为特定命令指定参数或命令行开关
IN (set):指在(set)中取值;DO command :指执行command
参数:/L 指用增量形式 (set)为增量形式时 ;/F 指从文件中不断取值,直到取完为止 (set)为文件时,如(d:\pass.txt)时 。
用法举例:
@echo off
echo 用法格式:test.bat *.*.* > test.txt
for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \\%1.%%G /user:***istrator | find "命令成功完成" >>test.txt
存为test.bat 说明:对指定的一个C类网段的254个IP依次试建立***istrator密码为空的IPC$连接,如果成功就把该IP存在test.txt中。
/L指用增量形式(即从1-254或254-1);输入的IP前面三位:*.*.*为批处理默认的 %1;%%G 为变量(ip的最后一位);& 用来隔开echo 和net use 这二个命令;| 指建立了ipc$后,在结果中用find查看是否有"命令成功完成"信息;%1.%%G 为完整的IP地址;(1 1 254) 指起始值,增长量,结止值。
@echo off
echo 用法格式:ok.bat ip
FOR /F %%i IN (D:\user.dic) DO smb.exe %1 %%i D:\pass.dic 200
存为:ok.exe 说明:输入一个IP后,用字典文件d:\pass.dic来暴解d:\user.dic中的用户密码,直到文件中值取完为止。%%i为用户名;%1为输入的IP地址(默认)。
for 命令 /f 参数
假设a.txt某一行的内容是 111,222.333 444/555
for /f "skip=1 tokens=1,2* delims= " %%a in (a.txt) do echo %%a %%b %%c
skip= tokens= delims=
这三项是用的最多的,根据需要.可以不用,可以一起使用,也可以只使用一个或两个.
但是不管使用几个都要用引号将它们扩起来.当然不使用时,自然就不需要引号了.
skip=
for循环文本内容是以行为单位,从上至下进行的,skip=1意识就是跳过文本的第一行,即不循环第一行
那么skip=2 自然就是跳过前两行了,依次类推.........
delims=
delims=后面的字符是将文本每一行的内容以delims=后面的字符分割成若干列.
for /f "tokens=1-5 delims=,./ " %%a in (a.txt) do echo %%a %%b %%c %%d %%e
显示结果是 111 222 333 444 555
解释:
意识就是把111,222.333 444/555以,./和空格(不分先后)分成了5列.注意代码中/和"后面有个空格,
使用中要注意空格要放到最后,如"delims=,. /" 这样就不行了.
那如果我们不使用逗号来分割会如何呢?如: "delims=./ "那么就会分割成111,222 333 444 555
看出区别了吗?delims=后面可以是多个字符,可以是空格,也可以什么都没有.
什么都没有代表什么呢?就是不以任何东西为分割符,也是整行的内容了.
因为for默认是以,;和空格作分割符的,所以一般要取得整行内容通常会用"delims="这样的形式来取消for
的默认分割符.
tokens=
tokens=1-5
1-5很好理解就1至5,前面我们用delims=后面的字符为分割符,将文本内容分成了多列,那么你需要的是哪
些列呢?
如上例:
通过dilims=,./ 将文本分成了111 222 333 444 555 五列.
注意代码中前面有个%%a 这里的%%a就是代表第一列,第二列就是%%b,第三列就是%%c 依此类推.....
那么我们如果把echo %%a %%b %%c %%d %%e 改为 echo %%e %%d %%c %%b %%a 会如何呢?
当然.会显示 555 444 333 222 111
如果是:echo %%b %%d 又会显示222 444
若是第一个%%a把它改为%%i也是一样,那么第二列就是%%j...%%k...依此类推....
明白了?就是按英文字母的顺序依此类推的.
如果用tokens=1,2* 有什么区别呢?
其实差不多-号代表从几至几而逗号代表单一的,如 tokens=1,5就是代表第一列和第五列,而不是1至5列.
*号代表剩下的所有的列.如:tokens=1,2*代表%%a为第一列,%%b为第二列,%%c代表后面所有的列.
for /f 不但可以循环文本内容还可以循环字符窜,如:
for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
只要将()里的字符串用引号扩起来,for就会把它当字符串来循环,而不是文本.
for /f "tokens=1,3* delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
按分隔符将字符串分段后,取第1、3、4-5三段分别作为%%a %%b %%c
for /f "tokens=1,3* delims=,./ " %a in ("111,222.333 444/555") do echo %a %b %c %d %e
结果显示111 333 444/555 %d %e
请问如何单独取出文本中某一行含有IP的的"[ ]"之间的内容
<title> 您的IP地址 </title>
</head>
<body style="margin:0px"><center>您的IP地址是:[124.88.120.123] </center></body></html>
[mode/]
代码
@echo off
for /f "tokens=2 delims=[]" %%a in ('findstr "您的IP地址是:" ip.asp') do (
echo %%a
)
pause

for %%i in (1 2 3 4 5) do echo %%i
带参数 /L 的for (这里的 参数/L 可以理解为 "list" 的意思,代表一个数列)
for /l %%i in (1 1 5) do echo %%i
然后运行,可以发现屏幕上显示1 2 3 4 5(每字一行)
/D参数(常用来查询 当前目录 或者 指定目录的文件夹)
如:查询F盘根目录下的文件夹
for /d %%i in (f:\*) do echo %%i
如果省略 括号中的 "f:\",则会直接查询 批处理 所在目录的文件夹
2> /r参数
基本用法:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树中,所有符合(set)的文件或者文件夹。如果在 /R 后没有指定目录,则使用当前目录。
for /r f:\ %%i in (*) do echo %%i
for /r f:\ %%i in (*.bat) do echo %%i
枚举F:盘下所有的文件(所有*.bat文件,包括子目录)

CMD中for的用法详解命令扩展

CMD FOR的在文件\\文件夹索引的用法实例详解

实例 1 for /D 用于在指定目录内搜索子目录名

基本格式是:

for /D %i in (目录名\\通配符) do (命令行) 

目录名 可以是自己指定的目录,例如C:\\Users\\Administer\\Desktop,或者是.\\指的是当下目录,该变量必须定义。

通配符 可以是*或者?,分别代表多个字符和一个字符。

命令行 可以不使用括号括起来。

例1:

for /D %i in (.\\*) do echo %i
::在当前文件夹下搜索所有的目录(文件夹)

例2:

for /D %i in (2,3,5) do echo %i
::此时输出:
>
2
3
5
>

例2 主要是为了补充该分类下的用法。其实该分类下用法的官方解释为:

FOR /D %variable IN (set) DO command
:: 如果set中包含通配符,则指定与目录名匹配,而不与文件名匹配.

因此如果set 是一组采用分隔符分隔的文件名组,不含有通配符,那么就可以挨个对文件名进行操作了。

实例 2 for /R 用于在指定目录内搜索文件名

基本格式是:

for /R 盘符:\\目录 %i in (目录名) do (命令行)

盘符目录指定了要在哪个目录树下执行for语句。
目录名 的定义同实例1,该方法会枚举该目录下的文件。

例如:

for /R C:\\Users\\ %i in (Desktop\\*) do echo %i
::以盘符C下的Users为目录树,在该目录树下运行for语句,在Desktop文件夹中枚举文件.

值得注意的是:如果/R后没有指定目录规范,则默认使用当前目录。如果目录名(.),则枚举该目录树。

实例 3 for /L 用于以增量形式输出数字序列

基本格式是:

FOR /L %i IN (开始,步长,结束) DO (命令行)

例如:

FOR /L %i IN (-7,1,-3) DO (echo %i )
::该方法输出:
>
-7
-5
-3
>

实例 4 for /F 用于在指定文件内(.txt)搜索文件内容

基本格式是:

for /F "选项" %i in (set) do (命令行)

set 可以是一个或者多个文件名,这些文件都会被打开读取处理解析处理将文件分割成一行行的文字,其次在每行解析出零个或更多的符号,最后用已找到的符号调用 For 循环,默认使用 [空格] 符号分割每行。

选项的内容有:

关键词描述
eol=character- 指定行尾字符
skip=n- 跳过的行数
delims=xxx- 指分隔符集。这个替换了默认的空格分隔符
tokens=x,y,m-n- 指定输出的列数1
usebackq- 允许set中使用反向单引号,单引号和双引号

例12

for /F "delims=、-, tokens=1" %i in (test.txt) do @echo %i
::在test文档中使用./-分隔号将每一行内容分割,并且输出每一行的第一列内容
>输出结果为:
1
2
3
4
>

例2

for /F "usebackq delims=:/ tokens=2" %i in (`date`) do echo %i
::打印结果为:
>
2021
(年月日)
>

例2 是作为该分类的补充,即使用usebackq时,set可以为命令行

例3

for "usebackq delims=:/ tokens=2" %i in ('当前日期: 2021/04/24 周六') do @echo %i 
::输出结果为:
>
2021
>

例3 是作为该分类的补充,set可以为字符串,但是可能需要usebackq扩展命令。

本章所提到的扩展命令均是对for本身和set的扩展


  1. tokens=x 输出第x列。
    tokens=m-n 输出第m至第n列。
    tokens= 提取全部。
    tokens=* 表示删除每行前面的空格忽略行首的所有空格。
    tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。
    tokens=m,* 提取第m列以后的所有字符,星号表示剩余的字符。

    ↩︎
  2. test.txt内容为:
    1、永远跟党走-红歌.mp3
    2、匆匆那年-电影.avi
    3、世界美好与你环环相扣-歌曲.mp3
    4、春风十里不如隔壁-歌曲.mp3

    ↩︎

以上是关于CMD for用法的主要内容,如果未能解决你的问题,请参考以下文章

CMD中for的用法详解命令扩展

Windows bat脚本——for循环用法详解

Windows bat脚本之for循环用法

dos下 和 批处理中的 for 语句的基本用法

cmd运行java文件不显示——Stream代码简洁之道的详细用法

批处理中for的用法和参数作用