1

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

助手.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"" 不是内部或外部命令、可运行程序或批处理文件

我究竟做错了什么?

4

2 回答 2

3
set str=%1

set str=%str:""=\"%
set str=%str:\n=^|%

echo %str:|=^|%

pause

刚刚用你的测试用例为我工作。

"3"" is not recognized由于管道字符,您会收到错误|,因为这意味着 CMD 正在尝试将之前的文本传递给|它之后的“程序”,这就是为什么您会注意到我曾经^|“转义”管道并停止的原因它具有特殊的意义

于 2013-08-02T10:44:38.780 回答
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 ofpassed arguments in Windows batch script

于 2013-08-02T11:41:10.863 回答