我需要将参数中所有出现的几个字符替换为批处理文件:
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”“不被识别为内部或外部命令,可操作程序或批处理文件
我做错了什么?
答案 0 :(得分:3)
set str=%1
set str=%str:""=\"%
set str=%str:\n=^|%
echo %str:|=^|%
pause
刚刚为我的测试用例工作过。
由于管道"3"" is not recognized
字符,您收到|
错误,因为这意味着CMD正在尝试将|
之前的文本传递到其后的“程序”中,这就是为什么你会注意到我已经使用^|
来“逃避”管道并阻止它具有特殊含义
答案 1 :(得分:3)
您应该切换到延迟扩展,因为使用特殊字符是安全的。
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: Get list of passed arguments in Windows batch script