我的目标是能够在单个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的那个
那么,有谁知道我如何实现我想要的运行方案?
答案 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"