我需要将一个参数中出现的几个字符全部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批处理脚本中传递参数的列表