我需要在双引号中并行运行两个命令(在我的情况下,简单的命令将不起作用)并等待结果。但是当我这样做时,我会因两次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
问题:
答案 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>