【WINDOWS / DOS 批处理】for命令详解(一)

 for命令详解(一)【共十篇】   

 for命令详解(二)【共十篇】

 for命令详解(三)【共十篇】

 for命令详解(四)【共十篇】

 for命令详解(五)【共十篇】           

 for命令详解(六)【共十篇】

 for命令详解(七)【共十篇】   

 for命令详解(八)【共十篇】 

 for命令详解(九)【共十篇】  

 for命令详解(十)【共十篇】 

 命令格式

【格式一】FOR  %variable  IN (set) DO cmd  [cmd-parameters]

【格式二】FOR   /R   [ [drive:]path] ]   %variable  IN (set) DO cmd  [cmd-parameters]

【格式三】FOR   /D  %variable  IN (set) DO cmd  [cmd-parameters]

【格式四】FOR   /D   /R  [ [drive:]path] ]  %variable  IN (set) DO cmd  [cmd-parameters]

【格式五】FOR  /L %variable  IN (start,step,end) DO cmd  [cmd-parameters]

【格式六】

【格式一】

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

 【注意】DO后面必须存在空白,即使do后面是左括号

【%variable参数】

 variable 指定一个名称为单一字母的循环变量名,例如:%V,variable 区分大小写,所以 %V 不同于 %v。for命令用于批处理文件中时,%variable 必须写为 %%variable

【cmd参数】

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

【cmd-parameters参数】

指定cmd的参数 

【set参数  

    在【格式一】中,set 被看作一个使用一个或多个空格分隔的文件名列表

工作原理

   对于 set 中以空白分隔的每一个文件名,

  • 如果它包括通配符,则for命令会在当前目录下查找匹配它的文件,并找到的文件名赋值给%variable,并执行 cmd [cmd-parameters];如果没有找到匹配它的文件,则for命令会忽略它;
  • 如果它不包括通配符,则for命令直接把它赋值给%variable,并执行 cmd [cmd-parameters] ,而不会在当前目录下查找它,也就是说,与它是否存在无关。

【格式一命令功能】

  • 要遍历当前目录下的非隐藏文件,set中的文件名称必须使用通配符
  • 要分割“以空白分隔的字符串”,set中的文件名称不能使用通配符

1、set 是一个文件名列表,其中的文件名可以是不存在的

        示例

demo.txt的内容如下:

::demo.bat
@echo  off

:: x.txt和y.txt都不是真实存在的文件
for %%a in (x.txt y.txt) do (
echo %%a
)

        运行

C:\out>tree /f .
卷 系统 的文件夹 PATH 列表
卷序列号为 B019-EC3F
C:\OUT
│  a.txt
│  b.txt
│  demo.bat
│
└─ziDir
    │  c.txt
    │
    └─sun
            d.txt


C:\out>demo
x.txt
y.txt
C:\out>

2、set 是一个文件名列表,如果它外面加双引号(或单引号或反引号),则会改变“原义”

        示例

demo.txt的内容如下:

:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码  【标注一】
::demo.bat
@echo  off

:: "x.txt y.txt"被看作一个文件名
for %%a in ("x.txt y.txt") do (
echo %%a
)
echo ------------------------------
:: 单引号被看作普通字符
for %%a in ('x.txt y.txt') do (
echo %%a
)

echo ------------------------------
:: 反引号被看作普通字符
for %%a in (`x.txt y.txt`) do (
echo %%a
)

【标注一】   下载Notepad++  

           运行

C:\>demo
"x.txt y.txt"
------------------------------
'x.txt
y.txt'
------------------------------
`x.txt
y.txt`
C:\>

3、set 是一个使用一个或多个空格分隔的文件名列表,set 开头和末尾的空白(一个或多个空格)会被忽略 

        示例

demo.txt的内容如下:

::demo.bat
@echo  off
set /a num=0
for %%a in (   aa   bb     ) do (
set /a num+=1
echo %%a
)
echo %num%

        运行 

C:\out>demo
aa
bb
2
C:\out>

4、set 是一个文件名列表,其中的每个文件名都可以使用通配符( * 、?),通配符只能匹配当前目录下的非隐藏文件名(不能匹配目录名)

        示例

demo.txt的内容如下:

::demo.bat
@echo  off

:: x.txt和y.txt都不是真实存在的文件
for %%a in (x.txt *.txt) do (
echo %%a
)
echo -----------------------------------------------

:: a.txt存在于c:\out目录下,y.txt不是真实存在的文件
for %%a in (a.txt *.txt) do (
echo %%a
)

        运行

C:\out>tree /f .                  // tree命令不能显示隐藏目录和隐藏文件
卷 系统 的文件夹 PATH 列表
卷序列号为 B019-EC3F
C:\OUT
│  a.txt
│  demo.bat
│
└─ziDir
    │  c.txt
    │
    └─sun
            d.txt


C:\out>dir /b /a:h b.txt         // b.txt是隐藏文件
b.txt

C:\out>demo
x.txt
a.txt
-----------------------------------------------
a.txt         // 输出结果没有除重   
a.txt         
C:\out>

5、set 是一个文件名列表,其中的文件名支持转义字符(^)  

        示例

::demo.bat
@echo  off
for %%a in (a^a bb cc) do (
echo a:  begin-%%a-end
echo ----------------------------------------------
)

        运行 

C:\out>demo
a:  begin-aa-end
----------------------------------------------
a:  begin-bb-end
----------------------------------------------
a:  begin-cc-end
----------------------------------------------

C:\out>

 【应用实例】

要求:把PATH环境变量的每个路径分离出来进行逐行显示

思路:在for命令格式一中,set 是一个使用一个或多个空格分隔的文件名列表,并且其中的文件名可以不存在,那么就可以使用格式一来分割“以空白分隔的字符串”。%PATH%是以分号分隔的字符串,需要先把分号替换为空格,实现如下:

demo.bat是内容如下:

:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码
::  【标注一】
::demo.bat
@echo  off

:: "%path:;=" "%" 是set,其外面加了双引号
:: %path:;=" "%  把PATH环境变量值中的每个分号( ; )替换成一个空格
:: %%~a  是变量扩充,将%a的变量值两边的双引号除掉   【标注二】
for %%a in ("%path:;=" "%") do (
if not ""==%%a echo %%~a
)

 【标注一】       下载Notepad++

 【标注二】       什么是变量扩充 

        运行

C:\out>demo
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
  ...
C:\out>

写作不易,本文档如能帮到您,麻烦您 “在下面一圈三连”


版权声明:本文为mt15306338066原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。