如何从另一个bat文件在后台运行bat文件?


90

我有一个“设置”脚本,该脚本在早晨运行,可以启动我需要的所有程序。现在,其中一些需要额外的环境设置,因此我需要将它们包装在小型BAT脚本中。

如何在Windows XP的后台运行这样的脚本?

CALL env-script.bat 同步运行它,即,安装脚本只有在env-script中的命令终止后才能继续。

START/B env-script.bat 在同一命令提示符下运行CMD.exe的另一个实例,使其处于真正的混乱状态(我看到嵌套的CMD.exe的输出,键盘死了一段时间,脚本未执行)。

START/B CMD env-script.bat产生相同的结果。CMD中的所有标志似乎都不符合我的要求。

Answers:


71

实际上,以下内容适合我并创建新窗口:

test.cmd:

@echo off
call "cmd /c start test2.cmd"
call "cmd /c start test3.cmd"
echo Foo
pause

test2.cmd

@echo off
echo Test 2
pause
exit

test3.cmd

@echo off
echo Test 3
pause
exit

如果您不希望新窗口出现在您的面前,则将其与start诸如的参数结合起来/min,如Moshe指出的那样。


1
好的,这可行,但并非100%完美:在“测试2”中按“返回”后,该窗口不会关闭。有任何想法吗?
亚伦·迪古拉

您可以将“退出”添加到生成的批次中,然后再次关闭它们。抱歉,测试得还不够:)
乔伊(Joey)2009年

140

两岁了,但是为了完整...

标准的内联方法:(&在Linux中使用时的行为)

START /B CMD /C CALL "foo.bat" [args [...]]

注意:1. CALL与.bat文件配对是因为它通常在其中..(即,这是对CMD /C CALL "foo.bat"表单的扩展,以使其异步。通常,需要正确获取退出代码,但这不是问题这里。); 2.仅当名称包含空格时,才需要在.bat文件周围加双引号。(该名称可能是一条路径,在这种情况下,可能性更大。)

如果您不想要输出:

START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1

如果您希望蝙蝠在独立的控制台上运行:(即另一个窗口)

START CMD /C CALL "foo.bat" [args [...]]

如果您以后希望另一个窗口挂起:

START CMD /K CALL "foo.bat" [args [...]]

注意:除非您有特别想将打开的窗口用作普通控制台的用户,否则这实际上是糟糕的形式。如果您只是希望窗口随处可见以查看输出,则最好PAUSE在bat文件的末尾放置a 。甚至可以^& PAUSE在命令行后添加:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE

10
&是“然后”(术语?)运算符。(例如,cmd1 & cmd2手段做“CMD1”,然后“CMD2”。不同的是&&运营商的“CMD2”执行不依赖于“CMD1”的成功退出。)的^转义&,使其进入CMD的参数,而不是被消耗并由运行START的同一控制台运行。
antak 2011年

这非常有帮助,谢谢。我正要端口一些脚本到Linux,因为其他的指南start,并cmd没有给予充分的功能我所追求的。您的答案是正确的。
Iterator

3
如果您不希望输出,则必须对重定向进行转义,以便将其传递给CMD。也不需要START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
拨打电话

1
@dbenham:尽管您说的是有道理的,但无论如何它START /B "" CMD /C PING 127.0.0.1 >NUL似乎都可以工作,什么也没输出。(可能是因为CMD继承了STARTI / O句柄。)我想,不同之处在于您是否希望保持START(错误)输出的完整性,这可能是个好主意。 CALL就在那儿,因为我觉得这是个好习惯。(即,不CALL用于同步 bat调用会导致无法预测的退出代码,因此CALL即使在严格不适用的情况下,例如在这种情况下,我也始终与bat调用配对。)
antak 2012年

7

由于START是从CMD脚本在后台执行某些操作的唯一方法,因此建议您继续使用它。尝试使用/ MIN而不是/ B修饰符,以便新创建的窗口不会打扰您。另外,您可以使用/ LOW或/ BELOWNORMAL将优先级设置为较低的值,这将改善系统的响应速度。


-1问题是启动BAT文件时START不会创建新窗口;取而代之的是,它重用当前窗口,并将I / O混合为两个CMD进程。
亚伦·迪古拉09年

4
它不是在创建新窗口,因为您正在使用/ B标志。去掉它。
Moshe

5

除了前景/背景术语。隐藏运行窗口的另一种方法是通过vbscript(如果系统中仍可用)。

DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)

将其命名为sth.vbs,然后从bat调用它,执行任务分散的任务,依此类推。就我个人而言,我将在我管理的任何Windows系统上不加急地禁用vbs :)


对于我的具体使用情况,这实际上是唯一的解决办法,我能得到工作...

0

创建一个新的C#Windows应用程序,并从main调用此方法:

public static void RunBatchFile(string filename)
{
    Process process = new Process();

    process.StartInfo.FileName = filename;

    // suppress output (command window still gets created)
    process.StartInfo.Arguments = "> NULL";

    process.Start();
    process.WaitForExit();
}

2
嗯...我希望像这样简单的事情不需要安装Visual Studio ...
Aaron Digulla 09年

1
在PowerShell 100%可用之前,C#实在是太过分了。
吉姆

2
Aaron:C#编译器包含在.NET Framework 2中,因此您只需在文本编辑器中编辑一些代码并进行编译即可。不过,由于在批处理文件中完全有可能做到这一点,所以我还要说C#太过分了。
乔伊(Joey)

0

这适用于我的Windows XP Home安装(以Unix方式):

call notepad.exe & 

7
我认为这只是巧合,而&并不是必需的。
山姆·沃特金斯

2
是的,notepad.exe首先是异步的。
antak 2012年

0

最后,使用此选项实际上很容易:

c:\ start BATCH.bat -WindowStyle隐藏


Windows命令start没有-WindowStyle选项。
斯蒂芬

@Stephan Arreed。奇怪的路径(C:` instead of C:\ Windows`)表明他在互联网上的某个地方找到了一个工具,并将其复制到了硬盘上。
亚伦·迪古拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.