Как запустить файл bat в фоновом режиме из другого файла bat?

У меня есть скрипт "setup", который я запускаю утром, который запускает все нужные мне программы. Теперь некоторые из них нуждаются в дополнительной настройке среды, поэтому мне нужно обернуть их в небольшие BAT-скрипты.

Как мне запустить такой скрипт на Windows XP в фоновом режиме?

CALL env-script.bat запускает его синхронно, т.е. скрипт установки может продолжаться только после завершения команды в скрипте env.

START/B env-script.bat запускает другой экземпляр CMD.exe в той же командной строке, оставляя его в очень грязном состоянии (я вижу вывод вложенного CMD.exe, клавиатура некоторое время не работает, сценарий не выполняется).

START/B CMD env-script.bat дает тот же результат. Ни один из флагов в CMD, кажется, не соответствует моему счету.

7 ответов

Решение

На самом деле, следующее прекрасно работает для меня и создает новые окна:

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Как указал Моше, если вы не хотите, чтобы новые окна появлялись перед вами.

Два года, но для полноты...

Стандартный, встроенный подход: (т.е. поведение, которое вы получите при использовании & в линуксе)

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 [...]]

Примечание. На самом деле это плохая форма, если у вас нет пользователей, которые хотят использовать открытое окно как обычную консоль. Если вы просто хотите, чтобы окно оставалось на месте, чтобы увидеть результат, лучше поставить PAUSE в конце файла летучей мыши. Или даже еще добавить ^& PAUSE после командной строки:

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

Поскольку START - единственный способ выполнить что-либо в фоновом режиме из сценария CMD, я бы порекомендовал вам продолжать его использовать. Вместо модификатора /B попробуйте /MIN, чтобы вновь созданное окно вас не беспокоило. Кроме того, вы можете установить приоритет на что-то более низкое с помощью /LOW или /BELOWNORMAL, что должно улучшить отзывчивость вашей системы.

Кроме переднего плана / фона. Другой способ скрыть запущенное окно - через vbscript, если он все еще доступен в вашей системе.

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

назовите его как sth.vbs и вызовите его из bat, поместите в запланированное задание и т. д. Лично я отключу vbs без спешки в любой системе Windows, которой я управляю:)

На самом деле довольно просто с этой опцией в конце:

c: \ start BATCH.bat -WindowStyle Hidden

Это работает на моей установке Windows XP Home, Unix-способ:

call notepad.exe & 

Создайте новое приложение 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();
}
Другие вопросы по тегам