【格式六】

【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_u 、string_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>
写作不易,本文档如能帮到您,麻烦您 “在下面一圈三连”。