代码之家  ›  专栏  ›  技术社区  ›  Owen

如何在bash脚本的批处理文件的参数中包含管道字符?

  •  6
  • Owen  · 技术社区  · 17 年前

    我有一个要执行此行的shell脚本:

    qtvars.bat vsstart "qt.sln" /BUILD "Debug|Win32"
    

    这个很好用(尽管我不得不修改 qtvars.bat 但这不是重点)。问题是,我希望执行的命令位于变量中: 编辑:如果我把它输入bash,这也不起作用。以前我把它输入 cmd.exe 很难做出公平的比较。

    command="qtvars.bat"
    args="vsstart"
    
    $command $args "qt.sln" /BUILD "Debug|Win32"
    

    现在它被管子堵住了!我收到这个消息:

    'Win32' is not recognized as an internal or external command,
    operable program or batch file.
    

    我试过用多种形式来逃避引号和/或管道,但都没有用。有趣的是,当它是可执行文件而不是批处理文件时,它可以工作,例如:

    command="devenv.exe"
    args=""
    
    $command $args "qt.sln" /BUILD "Debug|Win32"
    

    谢谢你的建议。

    5 回复  |  直到 13 年前
        1
  •  7
  •   Valiante    14 年前

    我知道你用^字符“转义”批处理文件中的管道字符,所以…

    这里回音一些文字^|

    将显示…

    |这里有一些文字|

    我不知道在这种情况下这是否对你有帮助?也许可以尝试在每个管道字符前加一个^看看会发生什么?-)

        2
  •  3
  •   Tim Cooper    14 年前

    这是双重转义的典型情况,需要指示bash和cmd.exe忽略特殊的(pipe)字符。

    尝试以下操作:

    $command $args "qt.sln" /BUILD '"Debug|Win32"'
    

    这相当于在cmd.exe提示下键入:

    qtvars.bat vsstart qt.sln /BUILD "Debug|Win32"
    

    使用上面的内容,您实际上是在强制将双引号传递给cmd.exe(而不是bash将它们吃掉)。最外面的单引号指示bash不要以任何方式解释或触摸它们内部的内容;内部双引号指示cmd.exe忽略其中的任何特殊字符(在本例中是管道)。

    或者,您也可以尝试:

    $command $args "qt.sln" /BUILD 'Debug\|Win32'
    

    这应该相当于在cmd.exe提示下键入:

    qtvars.bat vsstart qt.sln /BUILD Debug\|Win32
    

    注意使用 单一的 引文(!),确保bash不会解释\(相反,它将按原样传递给cmd.exe。)

        3
  •  1
  •   Community Mohan Dere    9 年前

    这是另一个解决方案(解决方法?)我发现:

    首先,确保环境变量定义了管道字符,例如:
    set PIPE="|"

    稍后,运行指定上述定义的环境变量名的命令:
    "c:\(...)\devenv.com" foo.sln /build Debug%PIPE%Win32

    即使在调用者和被调用者之间有多个包装器,也会执行此任务。我现在用的是一个很长的包装链: python/linux->virtualbox guest的executeprocess->cmd/windows->devenv.com

    (交叉发布到: How to pass a quoted pipe character to cmd.exe? )

        4
  •  1
  •   John Beavers    13 年前

    在Windows脚本语言中转义管道字符是用插入符号(^)完成的。前几天我不得不这么做。我知道这是旧的,但我想我会把我发现的东西贴出来,以防其他人像我一样遇到这个。

        5
  •  0
  •   dirkgently    17 年前

    很有趣!逃避什么 | 怎么办?

    做这些工作吗?

    • echo“调试win32”
    • echo“qt.sln”/构建“调试win32”