为什么这两种命令执行情况在这里有所不同?

时间:2019-09-12 07:16:19

标签: windows batch-file cmd command-line escaping

我需要在双引号中并行运行两个命令(在我的情况下,简单的命令将不起作用)并等待结果。但是当我这样做时,我会因两次qouted执行而得到不同的行为(我的命令由于未知原因根本不会运行)。

我已将问题简化为以下示例:

(
   start "task1" cmd /C "timeout /t 5 /nobreak > nul"
   start "task2" cmd /C ""timeout /t 8 /nobreak > nul""
) | pause

您可以看到,在后一种情况下,计数器将递减计数,但在第一种情况下不会计数

Waiting for 8 seconds, press CTRL+C to quit ...

问题:

  • 是什么原因导致这两种情况之间发生变化?
  • 如何避免这种行为改变?

在我的特殊情况下:

运行此命令时,一切正常:

start "task1" cmd /C ""D:\Program Files\Alteryx\bin\AlteryxEngineCmd.exe" "^<WizardValues^> ^<Module^>D:\long path\aaa.yxwz^</Module^> ^<Value name='Drop Down (31)'^>2019-08^</Value^> ^</WizardValues^>" > outp1.txt "

当我将简单版本放入复杂版本时,执行失败:

(
   start "task1" cmd /C ""D:\Program Files\Alteryx\bin\AlteryxEngineCmd.exe" "^<WizardValues^> ^<Module^>D:\long path\aaa.yxwz^</Module^> ^<Value name='Drop Down (12)'^>2019-08^</Value^> ^</WizardValues^>" > outp1.txt "
   start "task2" cmd /C ""D:\Program Files\Alteryx\bin\AlteryxEngineCmd.exe" "^<WizardValues^> ^<Module^>D:\long path\bbb.yxwz^</Module^> ^<Value name='Drop Down (34)'^>2019-07^</Value^> ^</WizardValues^>" > outp2.txt "
) | pause

问题:

  • 这种行为上的变化与上面的示例有何相似之处?

1 个答案:

答案 0 :(得分:2)

关于您的测试方案:

cmd /C "timeout /t 5 /nobreak > nul"中,redirection operator >对托管的cmd实例(运行批处理文件的代码)是隐藏的,因此它在内部{{1} }实例。

cmd中,cmd /C ""timeout /t 5 /nobreak > nul""暴露给托管的>实例,因此重定向在此处执行,内部的实例不接收cmd部分。
(尽管令我惊讶的是,双引号没有引起语法错误;我可以想象第二个> nul命令实际上接收到类似start的东西来执行,似乎删除了领先""timeout /t 5 /nobreak,但我不确定。)


关于您的特殊情况:

忘记了类似XML的字符串中的escaping,只需转义外部引号和重定向运算符即可。

  • 单独运行程序:

    ""
  • 在管道(start "task1" cmd /C ^""D:\Program Files\Alteryx\bin\AlteryxEngineCmd.exe" "<WizardValues> <Module>D:\long path\aaa.yxwz</Module> <Value name='Drop Down (31)'>2019-08</Value> </WizardValues>" ^> "outp1.txt"^" )中运行程序需要两次转义,因为|的任一端均在此处自行执行:

    cmd /S /D /c

不幸的是,您不能仅省略(转义的)外部一对引号,因为( start "task1" cmd /C ^^^""D:\Program Files\Alteryx\bin\AlteryxEngineCmd.exe" "<WizardValues> <Module>D:\long path\aaa.yxwz</Module> <Value name='Drop Down (12)'>2019-08</Value> </WizardValues>" ^^^> "outp1.txt"^^^" start "task2" cmd /C ^^^""D:\Program Files\Alteryx\bin\AlteryxEngineCmd.exe" "<WizardValues> <Module>D:\long path\bbb.yxwz</Module> <Value name='Drop Down (34)'>2019-07</Value> </WizardValues>" ^^^> "outp2.txt"^^^" ) | pause ^> nul 在处理它们时不是很聪明。像cmd这样的东西会把命令行cmd /C "program.exe" "quoted string"留在后面,这当然是无效的语法。

N。 B。:
通常,无需使用program.exe" "quoted string就可以启动外部程序,但是在您的情况下,您使用的是输出重定向cmd /C,这是>内部的东西,这就是您需要它的原因。 / p>