转义带有扩展延迟的感叹号

时间:2018-11-12 14:23:16

标签: batch-file cmd findstr

我有一个批处理文件,我正在使用该文件搜索一段文本并将其替换为另一段文本。它可以正常工作,但实际上是在创建“新”文件时,删除了感叹号之后的所有内容。

原来的文件

Hello! I have some cheese

就变成

Hello

尽管我要替换的文字很好。

我了解到,由于我使用的是延迟扩展,因此我需要以某种方式用^^!来转义感叹号,但无法弄清楚该在哪里进行。在回显上添加它只会在字面上回显^^!

任何帮助将不胜感激。

set "rootname=Common Filename"

set "replace="old">"
set "replaced="new">"


set "source="%rootname%_unqiue_suffix.txt""
set "target=Fixed\%SOURCE%"


 setlocal enableDelayedExpansion
(
   for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
      set "line=%%b"
      if defined line set "line=!line:%replace%=%replaced%!"
      echo(!line!
   )
) > %target%

endlocal

1 个答案:

答案 0 :(得分:2)

为避免丢失感叹号,请仅在确实需要时才启用延迟扩展,并仅在禁用延迟扩展时才扩展常规NULL变量和sudo nuget update -self Checking for updates from https://www.nuget.org/api/v2/. Currently running NuGet.exe 4.3.0. Updating NuGet.exe to 4.7.1. Update successful. 元变量:

%

如果变量for@echo off setlocal EnableExtensions DisableDelayedExpansion set "rootname=Common Filename" set "replace="old">" set "replaced="new">" set "source=%rootname%_unqiue_suffix.txt" set "target=Fixed\%source%" ( for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%source%"') do ( set "line=%%b" setlocal EnableDelayedExpansion if defined line set "line=!line:%replace%=%replaced%!" echo(!line! endlocal ) ) > "%target%" endlocal 包含replace符号(因为它们是百分号扩展的),则此代码仍然会引起麻烦。

相关问题