如何在 for 循环批处理中使用 ! 来编辑/替换代码

如何在 for 循环批处理中使用 ! 来编辑/替换代码

我尝试使用 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

相关内容