在batch file中replace子string中的几个字符

我需要将一个参数中出现的几个字符全部replace为batch file

helper.bat

@echo off echo %1 call:replace_newline_characters_and_additional_quotes arg %%1 echo %arg% goto:eof :replace_newline_characters_and_additional_quotes set in=%2 set tmp=%in:\n=|% set %1=%tmp:""=\"% goto:eof 

运行它

帮手“1”“2 \ n3”

产量

“1” “2 \ N3”
“3”“不被识别为内部或外部命令,可操作程序或batch file

我究竟做错了什么?

 set str=%1 set str=%str:""=\"% set str=%str:\n=^|% echo %str:|=^|% pause 

刚刚在你的测试案例中为我工作。

你得到的"3"" is not recognized由于管道字符"3"" is not recognized错误,因为这意味着CMD正在尝试将之前的文本传递给“程序”,这就是为什么你会注意到我已经使用^|来“逃离”管道,并阻止它具有特殊的含义

您应该切换到延迟扩展,因为使用特殊字符是安全的。

 setlocal EnableDelayedExpansion set "param1=%1" echo !param1! call :replace_newline_characters_and_additional_quotes arg param1 echo !arg! exit /b :replace_newline_characters_and_additional_quotes set "in=!%2!" set "tmp=!in:\n=|!" set "%1=!tmp:""=\"!" exit /b 

唯一有问题的行set "param1=%1" ,因为在调用的情况下会失败

 helper "&"^& 

要避免这种情况并不容易,但是现在有一个解决方案
SO:获取Windows批处理脚本中传递参数的列表