在CALL语句中从DOS批处理脚本传递管道字符

5
在一个需要在Win 200x和Win7环境下运行的DOS批处理脚本中,我需要将特定字符(用引号括起来)传递给另一个可执行文件;例如:
 doparse -delimeter "$"

一般情况下这样做:

 CALL CMD /C "doparse -delimeter "$""

很遗憾,我需要将管道符号指定为分隔符(这是必须的)。我本来以为以下内容会起作用:
 CALL CMD /C "doparse -delimeter "^|""

但是当我运行脚本时,对于这一行我根本看不到任何输出(例如,如果我用一个不存在的名称替换“doparse”,也没有错误消息)。我尝试过各种转义字符的组合,但无法让它工作。这有可能吗?(不幸的是必须通过批处理脚本完成)。谢谢。

为什么你在使用 CMD /C?这只有在旧版本的DOS系统中才需要,因为它不支持通过CALL语法来调用另一个批处理文件。同时,在使用 CMD /C 命令时并不需要对参数进行引号包裹,你可能混淆了 sh -c 命令,它需要对参数进行一次引号包裹。 - Neil
2个回答

3
以下方法适用于我:

call delim -delimiter "|"

然后在调用的批处理中像这样使用它:

setlocal enabledelayedexpansion
set "delim=%~2"
echo Delimiter: !delim!

就是这样。不知怎么的,我错过了更简单的CALL语法。谢谢Joey! - Dan
解决方案很简单,但失败的原因却很复杂;-) - jeb

1

这些版本应该可以用 cmd /c "test2.bat "^|""cmd /c ^"test2.bat "|""
两者都会启动 test2.bat。

此外,Joey 的版本也可以正常运行。

你遇到的问题是 call 命令和引号数量的问题,在 call 语句中(在引号之外),不能转义特殊字符,至少没有特殊的插入符技巧。

例如:

set "caret=^"
call echo &
call echo ^&
call echo ^^&
call echo ^^^&
call echo "&"
call echo %%caret%%^&

只有最后两个有效,第一个在引号内,第二个使用特殊的插入符技巧在第二个解析器运行时转义了&

在您的情况下,|在引号外(在第二个引号之后)。 并且cmd.exe存在一个错误,如果解析器在调用阶段后发现未转义的&|<>,则会立即停止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接