我有一个批处理文件,我正在使用该文件搜索一段文本并将其替换为另一段文本。它可以正常工作,但实际上是在创建“新”文件时,删除了感叹号之后的所有内容。
原来的文件
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
答案 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
符号(因为它们是百分号扩展的),则此代码仍然会引起麻烦。