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

У меня есть скрипт «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 ]

130 голосов
/ 02 декабря 2011

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

Стандартный, встроенный подход: (то есть поведение, которое вы получите при использовании & в 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. Или даже добавьте ^& PAUSE после командной строки:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
67 голосов
/ 16 марта 2009

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

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

7 голосов
/ 16 марта 2009

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

4 голосов
/ 25 апреля 2012

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

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

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

0 голосов
/ 25 октября 2017

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

c: \ start BATCH.bat -WindowStyle Hidden

0 голосов
/ 30 июня 2011

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

call notepad.exe & 
0 голосов
/ 16 марта 2009

Создайте новое приложение 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();
}
...