我的目标是能够在一个cmd行中链接START命令。
可以说我有一个cmd窗口(让我们称之为启动)。 用一行代码,我想要启动一个新的cmd窗口(让我们称之为cmd1),它会回显1,并启动另一个cmd窗口(让我们称之为cmd2),将回声2并等待(暂停),之后cmd1调用cmd2等待它完成)它也会等待(暂停),在启动程序调用cmd1之后(不等待它完成)它将closures(或者什么也不做)
最后,我应该得到2厘米的窗口(CMD1打印“1”,CMD2打印2),都等待ENTER。
运行scheme:
--- 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行:
title starter start cmd.exe /c start cmd.exe /c "echo 2 & pause" & echo 1 & pause \----------cmd2-----------/ \---------------------------cmd1----------------------------/
(“标题启动器”只是为了了解女巫窗口是否打开,不应包含在最后一行)
用那个cmd行,starter就是打印2并等待的那个,cmd1在调用cmd2后才退出。
该行的运行scheme:
--- 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(starter)打开2 cmds(cmd1,cmd2),这样做的结果将是我想要的运行scheme的最终结果。但重要的是cmd1将是创buildcmd2)
那么,有谁知道我怎么能达到我想要的跑步计划?
我希望我明白你的要求
title Starter start "one" cmd.exe /c "start "two" cmd.exe /c "echo 2 ^& pause" & echo 1 &pause"
诀窍是正确的转义&
通过解析的第一个传递,然后解析第二步。
我为所有窗口添加了标题。
这是一个脚本,将递归地启动任意数量的窗口。 简单地通过计数作为脚本的第一个也是唯一的参数。 如果您不提供计数,那么它只会打开一个窗口。
该技术依赖于一个名为cmd
的变量的定义,该变量用作“宏”。 它包含要由cmd.exe /v:on /c
执行的命令字符串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个窗口并在每个窗口中执行一些命令,而每个窗口完全独立于另一个窗口(不关心谁启动它),那么迭代START命令就简单多了N次在你的父母的脚本。
@echo off for /l %%N in (1 1 5) do start "%%N" cmd /c "echo %%N&pause"