ChatGPT解决这个技术问题 Extra ChatGPT

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

我有一个早上运行的“设置”脚本,它启动了我需要的所有程序。现在其中一些需要额外设置环境,所以我需要将它们包装在小型 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 中的所有标志似乎都与我的账单不符。


a
antak

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

标准内联方法:(即在 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

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

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

如果您希望其他窗口在之后挂起:

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

注意:这实际上是一种糟糕的形式,除非您有用户特别想将打开的窗口用作普通控制台。如果您只是想让窗口停留在附近以查看输出,最好在 bat 文件的末尾放置一个 PAUSE。甚至,在命令行之后添加 ^& PAUSE

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

& 是“然后”(术语?)运算符。 (例如 cmd1 & cmd2 表示先执行“cmd1”,然后执行“cmd2”。与 && 运算符不同,“cmd2”的执行不依赖于“cmd1”的成功退出。)^ 转义了 {1以便它进入 CMD 的参数,而不是被运行 START 的同一控制台消耗和运行。
这很有帮助,谢谢。我正准备将一些脚本移植到 Linux,因为 startcmd 的其他指南没有提供我所寻求的全部功能。你的回答很到位。
如果您不想要输出,则必须对重定向进行转义,以便将其传递给 CMD。也不需要 CALL:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
@dbenham:尽管您所说的有道理,但 START /B "" CMD /C PING 127.0.0.1 >NUL 似乎无论如何都可以工作,并且没有任何输出。 (可能是因为 CMD 继承了 START 的 I/O 句柄。)我想不同之处在于您是否想保持 START 的(错误)输出完好无损,这可能是个好主意。 CALL 之所以存在,是因为我觉得保留它是一个很好的做法。 (即,不将 CALL 用于 同步 bat 调用将导致不可预知的退出代码,因此我始终将 bat 调用与 CALL 配对,即使它并不严格适用,例如在这种情况下。 )
和我一起工作就像一个魅力。 FOR %%y IN (* --dev-- *) DO START /B CMD /C CALL "%%y"
J
Joey

实际上,以下内容对我来说很好,并创建了新窗口:

测试.cmd:

@echo off
start test2.cmd
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 指出的那样,如果您不希望新窗口出现在您面前。


好的,这可行,但不是 100% 完美:在“测试 2”中按“返回”后,该窗口不会关闭。有任何想法吗?
您可以在生成的批次中添加“退出”,以便之后再次关闭它们。抱歉,没有测试那么远:)
实际上 start script1.bat \n start script2.bat \n start scriptN.bat 对我来说已经足够了
M
Moshe

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


-1 问题是启动BAT文件时START不会创建新窗口;相反,它重用当前窗口并混合 I/O 两个 CMD 进程。
它没有创建新窗口,因为您使用的是 /B 标志。去掉它。
M
MeaCulpa

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

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

将其命名为 sth.vbs 并从 bat 中调用它,放入已调度的任务等。就我个人而言,我将在我管理的任何 Windows 系统上毫不犹豫地禁用 vbs :)


对于我的特定用例,这实际上是我可以开始工作的唯一解决方案......
S
Sahil Mahajan Mj

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

c:\start BATCH.bat -WindowStyle 隐藏


Windows 命令 start 没有 -WindowStyle 选项。
@Stephan Arreed。奇怪的路径 (C:` instead of C:\Windows`) 表明他在 Internet 上的某个地方找到了一个工具并复制到了他的硬盘上。
L
LegendLength

创建一个新的 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();
}

嗯......我希望像这样简单的东西不需要安装Visual Studio......
直到 PowerShell 100% 可用 - C# 真的是矫枉过正。
Aaron:C# 编译器包含在 .NET Framework 2 中,因此您可以在文本编辑器中编辑一些代码并进行编译。尽管如此,由于这在批处理文件中是完全可能的,所以我还要说 C# 是矫枉过正的。
P
Peter Mortensen

这适用于我的 Windows XP Home 安装,Unix 方式:

call notepad.exe & 

我认为这只是巧合,而 & 不是必需的。
是的,notepad.exe 一开始是异步的。