我尝试使用 for 循环测试某一行是否包含一串文本,然后如果存在则删除该字符串。
for /F "tokens=*" %%A in (test.txt) do (
echo %%A | findstr /C:"[B]" 1>nul
if !errorlevel!==1 echo %%A
if !errorlevel!==0 SOMEHOW REMOVE [B] AND ECHO IT WITHOUT THE B
)
问题是以下概念在 for 循环中不起作用:
set var=[B]Hello
set Va2r=%_var:[B]=%
而且将%
s 替换为!
s 似乎不起作用。
答案1
你需要延缓扩张当设置和在(代码块)内使用变量
这将会eat
在您的文本中出现感叹号。
:: Q:\Test\2018\06\26\SU_1334338.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=*" %%A in (test.txt) do (
set "line=%%A"
Echo=!line:[B]=!
)
编辑只是为了提醒使用for /f
有一些缺陷:
test.txt
使用上面的批处理处理以下文件
This line contains [ B ] here :[B]:
this line is indented
there is an empty line following
; this line starts with a ;
:: this is the last line
示例输出:
> .\SU_1334338.cmd
This line contains [ B ] here ::
this line is indented
there is an empty line following
:: this is the last line
所以发生了什么事:
- [B] 的替换已经完成,但是
- 缩进丢失,
- 空行消失了
- 该行也以分号开头。
使用"delims="
和"tokens=*"
- 当将分隔符设置为无时,整行将按不变的方式进行处理。
- 使用所有标记(*)的作用与听起来一样,但是Space第一个标记前面的默认分隔符被删除(或多个,因为它们被视为一个),所以这解释了为什么缩进被删除。
- 删除空行是一种常见的行为,可以通过使用编号行来解决 - 请参阅下一个批处理文件
for /f
支持一个end of line
字符,默认情况下是第一列的分号。如果这是一个问题,请定义一个Eol=
最可能不会干扰文本的字符,例如竖线|
这个没有太大区别的批处理文件避免了使用带有/V 的 find 和最不可能在文本中出现的字符串以及所有行的数字所列出的陷阱,因此它们对于for /f
;来说不是空的,要删除分隔符设置为的数字]
会导致这个字符在第一列中也被删除的风险。
:: Q:\Test\2018\06\26\SU_1334338_2.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=1* eol=|delims=]" %%A in (
'find /N /V "#+§-*;" ^< test.txt'
) do (
set "line=%%B"
if defined line (Echo(!line:[B]=!) else Echo(
)
示例输出:
> .\SU_1334338_2.cmd
This line contains [ B ] here ::
this line is indented
there is an empty line following
; this line starts with a ;
:: this is the last line