我需要用双引号并行运行两个命令(简单的命令在我的情况下不起作用)并等待结果。但是当我这样做时,我得到了一个不同的行为,双重 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
问题:
关于您的测试场景:
在cmd /C "timeout /t 5 /nobreak > nul"
对重定向操作符>
从托管隐藏cmd
实例(运行批处理文件的代码的),所以它成为在内部执行的cmd
实例。
在cmd /C ""timeout /t 5 /nobreak > nul""
该>
暴露的托管cmd
实例,因此重定向执行有和内一个不接收> nul
部分。
(虽然让我有点惊讶的是,由于双引号没有出现语法错误;我可以想象第二个start
命令实际上收到了类似""timeout /t 5 /nobreak
执行的东西,它似乎从中删除了前导""
,但我不太确定。 )
关于你的特殊情况:
忘了逃跑的类似XML字符串中,刚刚逃脱外引号和重定向操作。
单独运行程序:
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"
将命令行program.exe" "quoted string
留在后面的东西,这当然是无效的语法。
注意:
通常可以不使用 启动外部程序cmd /C
,但在您的情况下,您使用的是输出重定向>
,这是 内部的事情cmd
,这就是您需要它的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句