替换批处理文件中子字符串中的多个字符

时间:2013-08-02 10:21:40

标签: windows batch-file cmd

我需要将参数中所有出现的几个字符替换为批处理文件:

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”“不被识别为内部或外部命令,可操作程序或批处理文件

我做错了什么?

2 个答案:

答案 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