it-swarm.com.ru

Как запустить файл 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, кажется, не соответствует моему счету.

81
Aaron Digulla

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

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

66
Joey

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

Стандартный, встроенный подход: (то есть поведение, которое вы получите при использовании & в 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
129
antak

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

7
Moshe

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

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

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

3
MeaCulpa

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

call notepad.exe & 
0
MiiToo

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

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

c:\start BATCH.bat -WindowStyle Hidden

0
user8832474