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

发布于:2022-11-27 ⋅ 阅读:(762) ⋅ 点赞:(0)

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

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

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

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

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

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

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

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

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

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

【格式六】  

【file-set_u】 

顾名思义,file-set 是个文件集合,如果file-set 中存在某个目录名,对于该目录,则提示“系统找不到”

        示例

:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码  【标注一】
::demo.bat
@echo  off
:: ziDir 是当前目录下的一个目录
for /f "usebackq" %%a in (ziDir) do (
echo a:  begin-%%a-end
)

 【标注一】   下载Notepad++ 

        运行

C:\out>dir /b /a:d|findstr "ziDir$"
ziDir

C:\out>demo
系统找不到文件 ziDir。
C:\out>

file-set_u 是一个文件名列表,多个文件之间的分隔符总是空白(一个或多个空格),不受 delims=xxx 的影响。每个文件名的格式可以是以下两种之一:

  • fileName
  • “fileName”

1、file-set_u 中的文件名不支持通配符 

2、file-set_u 中的文件可以隐藏文件

        示例

:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码  【标注一】
::demo.bat
@echo  off
:: test.txt 和 a.txt 都是隐藏文件
for /f "usebackq tokens=1-3" %%a in ("test.txt" a.txt) do (
echo a:  begin-%%a-end
echo b:  begin-%%b-end
echo c:  begin-%%c-end
echo ----------------------------------------------
)

        运行 

C:\out>type test.txt
one two three
;x y z
100 200 300

C:\out>type a.txt
11 22
C:\out>dir /b /a:h test.txt a.txt
test.txt
a.txt

C:\out>demo
a:  begin-one-end
b:  begin-two-end
c:  begin-three-end
----------------------------------------------
a:  begin-100-end
b:  begin-200-end
c:  begin-300-end
----------------------------------------------
a:  begin-11-end
b:  begin-22-end
c:  begin--end
----------------------------------------------

C:\out>

3、file-set_u 中的每个文件名必须存在,不然,当循环至不存在的文件时,for命令会报错并退出

        示例

:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码  【标注一】
::demo.bat
@echo  off
:: text.txt存在 dd.txt不存在
for /f "usebackq tokens=1-2 delims= "  %%a  in (text.txt dd.txt) do (
echo a:  %%a
echo b:  %%b
)

        运行 

C:\out>where text.txt dd.txt
C:\out\text.txt
信息: 找不到 "dd.txt"。

C:\out>demo
a:  one
b:  two
a:  100
b:  200
a:  x
b:  y
系统找不到文件 dd.txt。
C:\out>

4、当文件名包含空白或者特殊字符时,必须使用 “fileName” 格式。 

        示例

:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码  【标注一】
::demo.bat
@echo  off
:: 在 'b.txt 两边加双引号
for /f "usebackq tokens=1-2 delims= "  %%a  in ("'b.txt") do (
echo a  %%a
echo b  %%b
)

echo  --------------------------------
:: 在 'b.txt 两边不加双引号(执行时会发生异常)
for /f "usebackq tokens=1-2 delims= "  %%a  in ('b.txt) do (
echo a  %%a
echo b  %%b
)

         运行

C:\out>type 'b.txt
11 22
C:\out>demo
a  11
b  22
 -------------------------------- 
a  11
b  22
系统找不到文件 。      // 发生异常
C:\out>

 5、“fileName” 格式中,fileName 不支持转义字符(^), fileName 格式中,fileName 支持转义字符(^)

        示例

:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码  【标注一】
::demo.bat
@echo  off
:: "fileName" 格式
for /f "usebackq tokens=1-2 delims= "  %%a  in ("t^ext.txt") do (
echo a  %%a
echo b  %%b
)

echo -------------------------------------------------

:: fileName 格式
for /f "usebackq tokens=1-2 delims= "  %%a  in (t^ext.txt) do (
echo a  %%a
echo b  %%b
)

        运行

C:\out>type text.txt
one two
100 200
x y

C:\out>demo
系统找不到文件 t^ext.txt。
-------------------------------------------------
a  one
b  two
a  100
b  200
a  x
b  y
C:\out>

6、file-set_u 开头和末尾的空白(一个或多个空格)会被忽略  

        示例

::demo.bat
@echo  off
for /f "usebackq tokens=1-2 delims= "  %%a  in (     text.txt     d.txt     ) do (
echo a:  %%a
echo b:  %%b
)

        运行 

C:\out>type text.txt
one two
100 200
x y

C:\out>type d.txt
cc dd
C:\out>demo
a:  one
b:  two
a:  100
b:  200
a:  x
b:  y
a:  cc
b:  dd
C:\out>

7、使用 file-set_u 时,如果被取的列中包含连续的多个空格,则这些空格会被原样输出,它们不会被合并为一个空格或者被删除

        示例

::demo.bat
@echo  off
set /a num=0
for /f "usebackq tokens=1-3 delims=w" %%a in (d.txt) do (
set /a num+=1
echo a:  x%%ay
echo b:  x%%by
echo b:  x%%cy
)
echo %num%

        运行 

C:\out>type d.txt
   one    two
C:\out>demo
a:  x   one    ty
b:  xo       y
b:  xy
1

C:\out>

string_u】 

1、string_u 是一个字符串列表(string_u 被for命令看作“一行”,所以只循环一次),多个字符串之间使用的分隔符由 delims=xxx 指定,多个连续的分隔符会被当作一个分隔符, string_u 开头和末尾的 xxx 会被忽略  

        示例

::demo.bat
@echo  off
set /a num=0
for /f "usebackq tokens=1-3 delims=b" %%a in ('bbbbbbbbbbbbone   two    bthreebbbbbbbbbbbbbbbbbbb') do (
set /a num+=1
echo %%a
echo %%b
echo %%c
)
echo %num%

        运行

C:\out>demo
one two
three
ECHO 处于关闭状态。
1

C:\out>

2、使用 string_u 时,如果被取的列中包含连续的多个空格,则这些空格会被合并为一个空格。使用转义字符(^)可以避免多个连续空格被合并

         示例

::demo.bat
@echo  off
set /a num=0
for /f "usebackq tokens=1-3 delims=w" %%a in ('   one    two       ') do (
set /a num+=1
echo a:  x%%ay
echo b:  x%%by
echo b:  x%%cy
)
echo %num%

echo -----------------------------------------------------------------------------
set /a num=0
for /f "usebackq tokens=1-3 delims=w" %%a in ('^ ^ ^ one^ ^ ^ ^ two^ ^ ^ ^ ^ ^ ^ ') do (
set /a num+=1
echo a:  x%%ay
echo b:  x%%by
echo b:  x%%cy
)
echo %num%

        运行 

C:\out>demo
a:  x one ty
b:  xo y
b:  xy
1
-----------------------------------------------------------------------------
a:  x   one    ty
b:  xo       y
b:  xy
1

C:\out>

command_u】 

1、使用 command_u 时,把执行 command_u 的输出内容看作一个文件,对该文件的每一行进行循环,行内分隔符由 delims=xxx 指定,多个连续的分隔符会被当作一个分隔符, 每行开头和末尾的 xxx 会被忽略

        示例

::demo.bat
@echo  off
set /a num=0
for /f "usebackq tokens=1-3 delims=w" %%a in (`echo wwwwwonewwwwtwowwwwww`) do (
set /a num+=1
echo a:  x%%ay
echo b:  x%%by
echo b:  x%%cy
)
echo %num%

        运行

C:\out>demo
a:  xoney
b:  xty
b:  xoy
1

C:\out>

 2、使用 command_u 时,如果被取的列中包含连续的多个空格,有的 command_u(例如:echo)会导致连续空格被合并或被删除,有的 command_u(例如:type)则会原样输出连续空格,解决之道:使用转义字符(^)转义空格

        示例

::demo.bat
@echo  off
set /a num=0
for /f "usebackq tokens=1-3 delims=w" %%a in (`echo=    one    two       `) do (
set /a num+=1
echo a:  x%%ay
echo b:  x%%by
echo b:  x%%cy
)
echo %num%



set /a num=0
for /f "usebackq tokens=1-3 delims=w" %%a in (`type d.txt`) do (
set /a num+=1
echo a:  x%%ay
echo b:  x%%by
echo b:  x%%cy
)
echo %num%

        运行 

C:\out>type d.txt
   one    two
C:\out>demo
a:  xone ty   // “   one    t” 开头的连续空格被删除,中间的连续空格被合并为一个空格
b:  xo y
b:  xy
1
a:  x   one    ty
b:  xo       y
b:  xy
1
C:\out>

3、和在DOS命令行下执行 command_u 一样,command_u 支持通配符。

        示例

::demo.bat
@echo  off
set /a num=0
for /f "usebackq tokens=1-3 delims=w" %%a in (`type d.t?t`) do (
set /a num+=1
echo a:  x%%ay
echo b:  x%%by
echo b:  x%%cy
)
echo %num%

        运行

C:\out>type d.t?t

d.txt


   one    two
C:\out>demo

d.txt


a:  x   one    ty
b:  xo       y
b:  xy
1

C:\out>

4、命令分隔符(||、&&、&)和管道(|)用于 command_u 时,必须对其转义,不然会报错

        示例

::demo.bat
@echo  off
for /f "usebackq tokens=1 delims=" %%a in (`type test.txt^|findstr one`) do (
echo a:  x%%ay
)
echo -----------------------------------------------------------------------
for /f "usebackq tokens=1 delims=" %%a in (`echo=one^&^& echo two`) do (
echo a:  x%%ay
)
echo -----------------------------------------------------------------------
for /f "usebackq tokens=1 delims=" %%a in (`findstr xyz test.txt^|^| echo two`) do (
echo a:  x%%ay
)
echo -----------------------------------------------------------------------
for /f "usebackq tokens=1 delims=" %%a in (`echo one^& echo two`) do (
echo a:  x%%ay
)

        运行 

C:\out>type test.txt
one

C:\out>demo
a:  xoney
-----------------------------------------------------------------------
a:  xoney
a:  xtwoy
-----------------------------------------------------------------------
a:  xtwoy
-----------------------------------------------------------------------
a:  xoney
a:  xtwoy

C:\out>

 command_ustring_u 都支持转义字符(^) 

        示例

::demo.bat
@echo  off
:: string_u
for /f "usebackq tokens=1-2 delims= "  %%a  in ('one two thr^ee') do (
echo a:  %%a
echo b:  %%b
echo c:  %%c
)

echo -------------------------------------------------

:: command_u
for /f "usebackq tokens=1-2 delims= "  %%a  in (`echo  thr^ee`) do (
echo a:  %%a
echo b:  %%b
echo c:  %%c
)

        运行 

C:\out>type text.txt
one two
100 200
x y

C:\out>demo
a:  one
b:  two
c:  %c
-------------------------------------------------
a:  three
b:
c:  %c
C:\out>

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


网站公告

今日签到

点亮在社区的每一天
去签到