
命令解释思路图
接上一篇:dos命令进阶(三)—批处理(入))
FOR命令的作用主要用于处理文本内容。
您可以打开cmd并输入“for /?” 查看它的帮助文档
下面是for命令的四个参数/F、/D、/R、/L的列表。当然这些参数也可以省略(参数不区分大小写)
第一部分:
下面我们跑几个例子,先看不带参数的。
示例 1:
@echo 关闭
对于 (c:\windows\*.log) 中的 %%a,执行 echo %%a
暂停
不带参数的for命令的操作演示
首先,请看几个固定格式,%%a 是一个变量。
批处理变量的命名约定是小写 a — 小写 z 和大写 A — 大写 Z
案例分析:
执行命令将(c:\windows\*.log)中的操作结果一一赋值(传输)到%%a,然后在echo命令中输入%%a,它会打印出所有扩展名.log 的 c:\windows 目录文件
还有一点需要注意:
%%a等变量命名方式在编写批处理脚本时只需要在变量名前加两个%即可。如果在CMD中独立执行for命令行,只需要一个%,即%a。
应用 % 和 %% 之间的差异
好的,现在我们来学习for命令的第一个参数/d,打开帮助就可以看到了。
系统帮助文档中说“如果数据集(set)包含通配符,指定匹配目录名,而不是文件名”。
表示该参数是对目录进行相关操作,而不是文件。
也就是说带参数/d的for命令行只能对目录进行操作(好像比较容易理解)。
/d 参数的基本格式:
FOR /D %variable IN (set) DO 命令 [命令参数]
示例 2:
@echo 关闭
for /d %%a in (*) do echo %%a
暂停
for /d参数的应用(只能对当前目录进行操作)
for /d参数的应用,只操作脚本当前路径下的目录
for /d 参数指定操作路径
对于/d参数,在指定操作路径的两端加上双引号
它只显示批处理文件所在的当前路径下的所有文件夹(专业点叫目录、目录),文件不会显示。这就是 /d 参数的作用。我们来看一个例子,这也是我们前面提到的知识。
示例 3:
@echo 关闭
for /d %%a in (?indows) 回显 %%a
暂停
for /d 在默认路径下执行脚本
for /d 在任意路径执行脚本
? 可以匹配任意字符,所以会打印出c:\下所有以任意字符开头且有indows的目录,这对于学过基础的人来说很难。
/r参数的基本格式:
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根(起点)的目录树,指向每个目录中的 FOR 语句。如果 /R 后没有指定目录,则使用脚本的当前目录。如果数据集(set)是单点(.)字符,则枚举目录树。
这个r参数应该是递归搜索当前目录树下指定类型的文件
系统帮助文档好像不是那么好理解的,我们直接看例子,这样比较实际:
示例 1:
显示当前目录和子目录下所有扩展名为.txt的文件
@echo 关闭
for /r %%a in (*.txt) do echo %%a
暂停
默认路径下
示例 2:
在 c:\ 的根目录和子目录中搜索所有扩展名为 .exe 的文件
@echo 关闭
对于 (*.txt) 中的 /r C:\opencv %%a 执行 @echo %%a
暂停
指定路径中的文件
您想要的所有文件都已找到。至于你想对找到的文件做什么,请在DO之后进行操作。
/l参数的基本格式:
FOR /L %variable IN (start,step,end) DO 命令 [命令参数]
数据集表示从开始到结束递增的数字序列。
因此,(1,1,5)会生成序列1 2 3 4 5,即循环从1开始,每次递增1,在5结束循环。
(5,-1,1) 会生成序列(5 4 3 2 1),即循环从5开始,每次减1,直到1结束循环。
有些朋友可能不是很了解。让我们看一个例子
示例 1:
@echo 关闭
for /l %%a in (1,1,5) do @echo %%a
暂停
make for /l 只是计数
执行后,显示 1 2 3 4 5。首先,(1,1,5)对应基本格式中的(start,step,end),即
开始计数,递增计数,结束计数。然后就可以修改这个do后面的命令了,我们看个例子来理解
示例 2:
@echo 关闭
for /l %%a in (1,1,3) do echo 我的朋友们万岁!
暂停/l
你也可以跑来跑去
/f 参数的基本格式:
FOR /F “ParsingKeywords” %%Variable IN (FileNameSet) DO command [command-parameters]
从帮助文档中我们知道,for命令主要用于解析文件。那么前几个参数不具备用for解析文件的功能。
重点是这个/f参数,这个参数的作用很强大,大家一定要好好学习
“ParsingKeywords”代表以下选项参数:
eol=c – 指行尾注释字符(只有一个)
skip=n – 指在文件开头忽略的行数
delims=xxx – 指分隔符集。这将替换空格和制表符的默认分隔符集
tokens=x,y,mn – 指示每行的哪些标记在每次迭代中传递给 for 自身。这会导致分配额外的变量名称。mn 格式是一个范围。用第 n 个表示法指定 mth。如果符号字符串中的最后一个字符是星号,那么额外变量将被分配并在最后一个符号被解析后接受该行的保留文本。
usebackq – 指定在反引号字符串作为命令执行并且单引号字符是文字字符串命令并允许文件名集中文件名的双引号扩展的情况下使用新语法。
以上帮助文档的内容,只有天才才能看懂,反正小编没看懂。
那我们就一起来试试吧,顺便看看热闹,看看能不能看懂各个参数的作用。如果能看懂,小编的努力就白费了。
示例 3:
@howare 你们
欢迎欢迎热烈欢迎
感谢您的关注和支持。朋友们万岁!
感谢您的关注和支持。朋友们万岁!
感谢您的关注和支持。朋友们万岁!
认清
;知道了
将其保存为文本文件为 test.txt,使用 for /f 解析并尝试
@echo 关闭
for /f “eol=@ tokens=1 delims= ” %%i in (test.txt) do @echo %%i
暂停
for /f 解析文件内容 tokens=1
for /f 解析文件内容标记=4
操作说明:
关键字 eol= 后面的符号表示忽略以该符号开头的行
关键字 tokens=1 是什么意思?这里代表的是每一行的第一个块,那么如果tokens=2,当然代表的是每一行的第二个块……那么划分每一行块的依据就是关键字“delims=”了,这里以空格分隔,可以灵活使用。
如果是其他特殊符号,比如“;”,那么可以写成“delims=;”,我想大家应该有点明白了。
我们来看例子4:
@echo 关闭
for /f “delims=” %%i in (test.txt) do @echo %%i
暂停
默认解析参数演示
这不会添加 eol= 参数
注意:for /f 是 eol=; 默认情况下,它会显示这个,
之所以添加这个“delims=”是因为 for /f 的默认分隔符是空格
所有参数均为默认值
综合了解以上参数。
示例 5:
@echo 关闭
for /f “eol=; tokens=1,2,3 delims= ” %%a in (test.txt) do @echo %%a %%b %%c
暂停
综合命令参数解析示例
与上面类似,但显示了更多内容。注意%%a %%b %%c 应该按26个英文字母的顺序写,希望大家记住。
让我们看另一个例子
示例 6:
@echo 关闭
for /f “skip=5 tokens=*” %%i in (test.txt) do @echo %%i
暂停
for /f 跳过参数的使用
这个skip=5表示跳过前5行,用数字表示,tokens=*表示显示所有信息
第二部分:
此外,FOR 变量引用的替换也得到了增强。您现在可以使用以下选项语法:
~I – 删除所有引号 (“),展开 %I
%~fI – 将 %I 扩展为完全限定的路径名
%~dI – 仅将 %I 扩展为驱动器号
%~pI – 仅将 %I 扩展为路径
%~nI – 仅将 %I 扩展为文件名
%~xI – 将 %I 扩展为只有一个文件扩展名
%~sI – 扩展路径仅包含短名称
%~aI – 将 %I 扩展为文件的文件属性
%~tI – 将 %I 扩展为文件的日期/时间
%~zI – 将 %I 扩展到文件的大小
%~$PATH:I – 查找 PATH 环境变量中列出的目录并将 %I 扩展为找到的第一个完全限定名称。如果未定义环境变量名称dos判断文件夹大小为0,或未找到文件,则此组合键扩展为空字符串
注意:如果在CMD命令提示符下执行,需要输入一个%号。这也是很多人容易犯的错误。以下是一些示例,可帮助您理解它们的含义:
看看这个 ~I – 删除所有引号 (“),展开 %I
将以下内容另存为名为 test.txt 的文本文件
“我的朋友们万岁!”
“我的朋友们万岁!”
“我的朋友们万岁!”
“我的朋友们万岁!”
示例 1:
@echo 关闭
for /f “delims=” %%i in (test.txt) do @echo %%~i
暂停
for /f 不会将 ~ 添加到扩展变量中
for /f 增加了~的扩展变量的效果
可以用作扩展变量的不一定是 I,其他字符也可以
可以看到,其实这个参数是用来去掉两端引号的,但是去掉“”也是有一定的规则的。如果单词中间的“”不去掉。我希望你能注意这一点。
明白了这个~i,我们来看一个%~fI的例子
示例 2:
@echo 关闭
for /f “delims==” %%i in (‘dir /b’) do @echo %%~fi
暂停
下面我们来看看 dir 和 dir /b 有无 /b 参数的区别
不带任何参数的默认目录
dir /b参数的作用
这是在使用 %~fi 之前
使用 %~fi 命令展开的效果
%~fI其实就是把%I展开成一个完全限定的路径名(每个文件的绝对路径)dos判断文件夹大小为0,大家可以比较一下有什么不同就明白了
“delims==” 这个参数写的,两个=号的效果和一个=号的效果一样,不用纠结了。
让我们看下一个例子:
示例 3:
@echo 关闭
for /f “delims==” %%i in (‘dir /b’) do @echo %%~di
暂停
for /f 中 %~di 变量扩展的效果
为什么只有显示批处理的路径的盘符?这就是 %~di 之间的关系。用于显示批处理所在路径的盘符。你明白吗?
%~pI – 仅将 %I 扩展为路径
示例 4:
@echo 关闭
FOR /F “delims==” %%i IN (‘dir /b’) DO @echo %%~pi
暂停
for /f %~pi 变量扩展的效果
即只显示路径不显示文件名,所以从命令行帮助可以理解如下
%~sI – 扩展路径仅包含短名称
让我们看示例5:
@echo 关闭
for /f “delims=” %%i in (‘dir/b’) do @echo %%~si
暂停
for /f %~si 扩展变量的演示
也可以从字面上理解,系统中有长路径名和短路径名,我们来看看。比如我们要切换目录,如果我要切换到C:\下的C:\Program Files目录,我可以输入cd “Program Files” 注意双引号,因为里面有空格目录名称。
那么这是一个长路径名的表示。然后我们现在用短路径名来表示它。cd PROGRA~1(字母大写)是否也切换了?那么如何才能看到每个目录的短路径呢?您可以通过键入 dir /x 来查看它。
%~$PATH:I – 查找 PATH 环境变量中列出的目录并将 %I 扩展为找到的第一个完全限定名称。如果未定义环境变量名称,或未找到文件,则此组合键扩展为空字符串
举个例子看看是什么意思
示例 6:
FOR /F “delims==” %%i IN (“notepad.exe”) DO @echo %%~$PATH:i
暂停
首先看下图,要知道PATH环境的值,它的值是每个文件夹的绝对路径,用分号隔开
在%PATH%路径下搜索指定文件,因为是系统变量%PATH%,回显一下就知道是什么意思了。
查看系统环境变量的结果
最后,我们来看看它们的组合用法
%~dpI – 仅将 %I 扩展为驱动器号和路径
示例 7:
@echo 关闭
for /f “delims=” %%i in (‘dir/b’) do @echo %%~dpi
暂停
请对比%~di、%~pi、%~dpi这三个例子来理解
如上所述,只有将它们组合在一起才实用。
%%~dI 仅将 %I 扩展为驱动器号,%~pI- 仅将 %I 扩展为路径
%~nxI – 只需将 %I 扩展为文件名和扩展名。
for /f下%~ni扩展变量的应用
for /f下%~xi扩展变量的应用
for /f下%~xni扩展变量的应用
%~fsI – 只是将 %I 扩展为具有短名称的完整路径名,与 %~si 相同
%~dp$PATH:i – 查找 PATH 环境变量中列出的目录,并将 %I 扩展为找到的第一个驱动器号和路径。
%~dp$PATH:i 扩展变量的使用
%~ftzaI – 将 %I 扩展为像输出线一样的 DIR
这个也很简单,举个例子
最后,我们来看一个例子
示例 8:
@echo 关闭
对于 /f “delims=” %%i in (“notepad.exe”) 执行 @echo %%~dp$PATH:i
暂停
%~$PATH:I 用于搜索文件,如前所述。
那么 %%~dp$PATH:i 是什么意思。也就是说,如果搜索文件notepad.exe,只会显示它所在的%~dI盘符和路径的%~pI扩展名,不会显示文件名。如果要显示文件名,还得加个参数,即%~nI- 只将%I展开为文件名
延迟的环境变量扩展
要了解什么是“延迟环境变量扩展”,首先要了解什么是“环境变量扩展”。
(搬砖来源:)
cmd在解释我们的命令时,首先会从命令行中读取一个完整的命令,然后对其进行一些命令格式匹配操作,看看你输入的命令格式是否正确。如果我们想在命令中引用一些变量,那么我们需要在变量的两边加上一个%号,这样cmd在解释我们的命令时就可以识别这个变量,比如%name%。当cmd读取我们的格式匹配命令时,会发现在name字符串的每一边都加了一个%,不会被当作普通字符串,而是当作变量来对待。这个名字叫做名字。然后cmd会查找这个变量的值,用这个值替换%name%,最后执行替换的命令。这种替换过程称为环境变量扩展。
什么是延迟环境变量扩展,我们都知道命令行解释器在解析和执行批处理文件的时候会解析并执行一个完整的命令。(对于if和for等命令,可以将命令嵌套在括号中,所以一个完整的if命令可能包含多个需要执行的命令,但是cmd解释这样的命令时,会被当作一个完整的命令,导致一些问题。),这应该不难理解。
示例代码:
@echo 关闭
设置/a var = 0
for /l %%m in (1,1,5) 做 (
设置/a var = %%m
回声%var%
)
暂停
结果:
延迟环境变量示例
这是因为在命令执行之前变量被替换了,所以嵌套在for命令中的操作没有体现出来。这时,提出了“延迟环境变量扩展”的概念。“延迟环境变量扩展”,即在每条命令执行前,替换变量,保证对变量的任何修改都能实时生效。
我们可以使用“setlocal enabledelayedexpansion”命令来启用延迟的环境变量扩展。启用后,我们使用 !name! 对于值而不是 %name%。
修改后的代码如下:
@echo 关闭
setlocal enabledelayedexpansion
设置/a var = 0
for /l %%m in (1,1,5) 做 (
设置/a var = %%m
回声!变种!
)
暂停
结果:
启用延迟变量扩展后
审查 For 命令花了两天时间。花了两天时间理解和操作,边操作边理解。此外,我必须照顾好我的工作。花了两天时间。它是在我仔细检查之前发布的。如果文中有任何错误,请告诉我。让我知道,非常感谢您的支持!
谢谢谢谢!
请登录后发表评论
注册
社交帐号登录