8

我有一个要执行这一行的 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"

感谢您的任何想法。

4

6 回答 6

9

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

回声^| 这里有一些文字^|

会显示...

| 这里有一些文字 |

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

于 2012-03-26T15:15:35.677 回答
3

这是双重转义的经典案例,需要指示 bash 和 CMD.EXE 忽略特殊的 | (管道)字符。

尝试以下操作:

$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。)

于 2009-02-20T19:21:41.293 回答
1

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

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

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

即使调用者和被调用者之间有多个包装器,它也能完成这项工作。我现在将它与很长的包装链一起使用:Python/Linux -> VirtualBox guest's executeProcess -> Cmd/Windows -> devenv.com

(交叉发布到:如何将带引号的管道字符传递给 cmd.exe?

于 2011-06-28T14:27:06.383 回答
1

在 Windows 脚本语言中转义管道字符是使用插入符号 (^) 完成的。前几天我不得不这样做。我知道这很旧,但我想我会发布我发现的内容,以防其他人像我一样遇到这个问题。

于 2012-08-11T03:01:58.087 回答
0

有趣的!逃避|做什么?

这些有用吗?

  • 回声“调试|Win32”
  • echo "qt.sln" /BUILD '调试|Win32'
于 2009-02-20T19:22:16.330 回答
0

我会考虑走简单的路线,而是传递一个占位符令牌 - “$P”,然后在 CMD/Batch 文件中替换它;例如使用 'UnxUtils' SEd 命令进行替换:

For /F "usebackq delims=" %%r in (`Echo %Cmd% ^| sed -e "s/$P/|/g"`) do @Set Cmd2=%%r

REM  Now run the command, with the proper pipe symbol in place

%Cmd2%

因此,通过了命令 arg/CMD 脚本 args -“git status $P wc -l”。

于 2019-03-14T17:47:52.363 回答