如何在cmd中链接START命令?

时间:2017-07-08 09:04:42

标签: windows batch-file command-line cmd

我的目标是能够在单个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 cmd2)
    |    +--- Echo 1
    |    \--- Pause (Blocking cmd1)
    \---Do nothing (Starter, Incase running from bat file starter will exit)

我在bat文件中写了这个cmd行:

title starter 
start cmd.exe /c start cmd.exe /c "echo 2 & pause" & echo 1 & pause
                       \----------cmd2-----------/
      \---------------------------cmd1----------------------------/

(“标题首发”仅用于了解哪个窗口已打开且不应包含在最后一行中)

使用该cmd行,starter是打印2并等待的那个,而cmd1只是在调用cmd2后退出。

该行的运行方案:

--- Starter
    +--- Start cmd1 (Non-blocking)
    |    \--- Start cmd2 (Non-blocking)
    |         +--- Echo 2
    |         \--- Pause (Blocking cmd2)
    +--- 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的那个

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

2 个答案:

答案 0 :(得分:4)

我希望,我理解你的要求......

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

诀窍是正确转义&以通过解析的第一遍来获取然后通过第二步解析。

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

答案 1 :(得分:1)

这是一个递归地START任意数量的窗口的脚本。只需将计数作为脚本的第一个也是唯一的参数传递。如果你不提供计数,那么它只会打开1个窗口。

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

<强> RecursiveStart.bat

@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个窗口并在每个窗口中执行一些命令,并且每个窗口完全独立于另一个窗口(不关心是谁启动它),那么它是 < em>很多 更简单,可以在父脚本中迭代START命令N次。

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