【问题标题】:Pass the pipe character from a DOS batch script in a CALL statement在 CALL 语句中传递来自 DOS 批处理脚本的管道字符
【发布时间】:2011-07-27 03:54:38
【问题描述】:

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

 doparse -delimeter "$"

一般来说这是可行的:

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

不幸的是,我需要将竖线字符指定为分隔符(这是一项要求)。我预计以下内容会起作用:

 CALL CMD /C "doparse -delimeter "^|""

但是当我运行脚本时,我根本看不到这一行的任何输出(例如,如果我用一些不存在的名称替换“doparse”,则没有错误消息)。

我尝试了各种转义字符组合,但无法正常工作。可能吗? (不幸的是,必须通过批处理脚本完成)。

谢谢

【问题讨论】:

  • 你为什么使用CMD /C?只有在不支持 CALL 语法的旧版本 DOS 中才需要从另一个批处理文件调用一个批处理文件。此外,没有必要将参数引用到CMD /C,您正在考虑sh -c,它确实需要一个引用参数。

标签: batch-file dos call pipe


【解决方案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 中存在一个错误,因此如果解析器在调用阶段后发现未转义的 &|<>,它会立即停止。

【讨论】:

    【解决方案2】:

    以下对我有用:

    call delim -delimiter "|"
    

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

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

    【讨论】:

    • 就是这样。不知何故,我错过了更简单的 CALL 语法。谢谢乔伊!
    • 解决方法很简单,但是失败的原因很复杂;-)
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 2014-06-14
    • 2020-08-07
    • 2017-12-06
    • 1970-01-01
    • 2015-03-07
    • 2014-06-14
    • 2016-05-06
    相关资源
    最近更新 更多