2017-07-08 79 views
2

我的目标是能够在单个cmd行中链接START命令。如何在cmd中链接START命令?

可以说我有一个cmd窗口(让我们称它为启动器)。用一行代码,我想要启动一个新的cmd窗口(让我们称之为cmd1),它会回显1并启动另一个cmd窗口(让它称为cmd2),它将回显2并等待(暂停),在cmd1之后调用cmd2等待它完成)它会等待(暂停),在启动程序调用cmd1后(无需等待它完成)它将关闭(或什么都不做)

最后我应该以2 cmd窗口(cmd1打印“1”,cmd2打印2张),两者都在等待ENTER。

运行方案:

--- Starter 
    +--- Start cmd1 (Non-blocking) 
    | +--- Start cmd2 (Non-blocking) 
    | | +--- Echo 2 
    | | \--- Pause (Blocking comd2) 
    | +--- Echo 1 
    | \--- Pause (Blocking cmd1) 
    \---Do nothing (Starter, Incase running from bat file starter will exit) 

我在一个bat文件写了这个CMD行:

​​

(只是为了解女巫窗口打开,不应列入“称号启动器”在最后一行)

与该cmd行,启动器是一个打印2和等待,cmd1只是在调用cmd2后退出。

该行的运行方案:

--- Starter 
    +--- Start cmd1 (Non-blocking) 
    | \--- Start cmd2 (Non-blocking) 
    |   +--- Echo 2 
    |   \--- Pause (Blocking comd2) 
    +--- Echo 1 
    +--- Pause (Blocking Starter) 
    \---Do nothing (Starter, Incase running from bat file starter will exit) 

我尝试没有成功这条线的一些其他变化。

title starter 
start "cmd.exe /c start cmd.exe /c "echo 2 & pause" & echo 1 & pause" 
start cmd.exe /c "start cmd.exe /c "echo 2 & pause" & echo 1 & pause" 
start cmd.exe /c "start cmd.exe /c ""echo 2 & pause"" & echo 1 & pause" 

(需要注意的是我可以打开从第一CMD(首发)和该结果的2 CMDS(CMD1,CMD2)将是我想要的运行方案的最终结果,但它是非常重要的那cmd1将会是创建cmd2的那个)

那么,有没有人知道我该如何实现我想要的运行方案?

+0

我很好奇为什么通过cmd1启动cmd2窗口很重要,并且父级批处理不能迭代启动这两个窗口。我可以在脑海中发明一些假想的理由,但我很好奇你是否有这种行为的实际需要。 – dbenham

回答

4

我希望,我明白你的要求吧...

title Starter 
start "one" cmd.exe /c "start "two" cmd.exe /c "echo 2 ^& pause" & echo 1 &pause" 

诀窍是&适当的转义通过分析得到,然后用第二个步骤解析的第一遍通过。

我向所有窗口添加了标题。

+0

通过按原样运行命令:1. cmd1不打印1(它应该)2. cmd2不执行暂停命令3.打印机打印1(它不应该)4.打印机打印异常“暂停” '不被识别为内部或外部命令, 可操作的程序或批处理文件 –

+0

@GreenFire现在更好吗? – Stephan

+0

令人惊讶的是,即使有3个调用它的工作(开始“一”cmd.exe/C“开始”拖“ cmd.exe/c“start”3“cmd.exe/c”echo 3 ^&pause“^&echo 2 ^&pause”&echo 1&pause“)感谢您的帮助 –

1

这是一个脚本,将递归地启动任意数量的窗口。只需将计数作为脚本的第一个参数即可。如果您不提供计数,那么它只会打开1个窗口。

该技术依赖于名为cmd的变量的定义,该变量充当“宏”。它包含由cmd.exe /v:on /c执行的命令字符串。直到子进程内才能扩展宏是非常重要的。在父批中,我通过使用%%cmd%%来延迟宏的扩展。所有后续进程都有一个命令行上下文,而不是批处理上下文,所以延迟可以通过%^cmd%来实现。定义宏时,百分数必须加倍为%%^cmd%%才能达到所需的%^cmd%字符串。

RecursiveStart。蝙蝠

@echo off 
setlocal disableDelayedExpansion 
set /a N=1, END=%~1+0 
set "cmd=set /a N+=1,N-1&echo(&(if not !N! gtr !END! start "!N!" cmd /v:on /c %%^cmd%%)&pause" 
start "%N%" cmd /v:on /c %%cmd%% 

例如,启动5个窗口,只需使用:

RecursiveStart 5 

但是,如果你想要做的是窗户的打开N个号码,每个执行某些命令,每个窗口完全独立于其他(不关心谁启动它),那么它更容易在您的父级脚本中重复执行N次START命令。

@echo off 
for /l %%N in (1 1 5) do start "%%N" cmd /c "echo %%N&pause" 
+0

第一个是没有内存的,第二个是不递归的。 。'set/a N + = 1,N-1':nice trick':)' – Stephan

+0

@Stephan - 我不知道它需要成为“o NE-班轮”。但我可怜任何试图扩展你的单行说7个窗口的人。转义序列很快就会变得难看。显然,第二种方法不是递归的 - 我明确表示这是一种迭代解决方案。我意识到迭代方法不是OP所要求的,但它是获得几乎相同结果的更简单的方法。除非有充分的递归原因,否则迭代更简单。 – dbenham

+0

我也不喜欢单线。他们往往变得不可读。我看不到递归的需要。但另一方面,'echo '肯定不是最终目标,所以可能有一个原因。 – Stephan