Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 带延迟扩展的转义感叹号_Batch File_Cmd_Findstr - Fatal编程技术网

Batch file 带延迟扩展的转义感叹号

Batch file 带延迟扩展的转义感叹号,batch-file,cmd,findstr,Batch File,Cmd,Findstr,我有一个批处理文件,用于搜索一段文本并用另一段替换它。它是有效的,但是当创建“新”文件时,感叹号之后的任何内容都会被删除 那么原始文件呢 Hello! I have some cheese 刚刚成为 Hello 尽管我试图替换的文本很好 我明白,由于我使用的是延迟扩展,我需要以某种方式用^^避开感叹号但无法确定在何处执行此操作。在回显中添加它只会回显^^字面意思 任何帮助都将不胜感激 set "rootname=Common Filename" set "replace="old">

我有一个批处理文件,用于搜索一段文本并用另一段替换它。它是有效的,但是当创建“新”文件时,感叹号之后的任何内容都会被删除

那么原始文件呢

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

为避免感叹号丢失,请仅在确实需要时启用延迟扩展,并仅在禁用延迟扩展时扩展普通
%
变量和
元变量:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
设置“rootname=公共文件名”
设置“replace=”old“>”
设置“已替换=“新建”>”
设置“source=%rootname%\u unqiue\u suffix.txt”
设置“目标=固定\%source%”
(
对于/F“tokens=1*delims=:”%%a in('findstr/N“^”“%source%”)do(
设置“行=%%b”
setlocal EnableDelayedExpansion
如果定义了行集“行=!行:%replace%=%replaced%!”
回声(!线!
端部
)
)>“%target%”
端部

如果变量
replace
replace
包含
-符号,此代码仍然会导致问题,因为它们是百分比展开的。

DOS中既没有启用延迟展开,也没有
for/f
。抱歉。我不是编码员或程序员,所以有时会把事情弄糊涂。