Как запустить файл bat в фоновом режиме из другого файла bat?
У меня есть "setup" script, который я запускаю утром, который запускает все программы, которые мне нужны. Теперь некоторые из них нуждаются в дополнительной настройке среды, поэтому мне нужно обернуть их небольшими сценариями BAT.
Как запустить script в Windows XP в фоновом режиме?
CALL env-script.bat
запускает его синхронно, т.е. установка script может продолжаться только после того, как команда в env- script завершена.
START/B env-script.bat
запускает другой экземпляр CMD.exe в той же командной строке, оставив его в действительно запутанном состоянии (я вижу вывод вложенного CMD.exe, клавиатура на какое-то время мертва, script не выполняется).
START/B CMD env-script.bat
дает тот же результат. Ни один из флагов в CMD, похоже, не соответствует моему счету.
Ответы
Ответ 1
Собственно, следующее работает отлично для меня и создает новые окна:
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
, как указал Моше, если вы не хотите, чтобы новые окна появлялись перед вами.
Ответ 2
Два года, но для полноты...
Стандартный, встроенный подход: (т.е. поведение, которое вы получите при использовании &
в 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
Ответ 3
Поскольку START - единственный способ выполнить что-то в фоновом режиме из CMD script, я бы рекомендовал вам продолжать использовать его. Вместо модификатора /B попробуйте/MIN, чтобы вновь созданное окно не беспокоило вас. Кроме того, вы можете установить приоритет на более низкое значение с помощью /LOW или/BELOWNORMAL, что должно повысить оперативность вашей системы.
Ответ 4
За исключением переднего плана/фона.
Другой способ скрыть запущенное окно - через vbscript, если он все еще доступен в вашей системе.
DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)
назовите его как sth.vbs и назовите его с bat, поставьте вложенную задачу и т.д.
Лично я отключу vbs без спешки в любой системе Windows, которой я управляю:)
Ответ 5
Создайте новое приложение Windows С# и вызовите этот метод из основного:
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();
}
Ответ 6
Это работает на моей установке Windows Home XP, Unix:
call notepad.exe &
Ответ 7
На самом деле это довольно легко с этой опцией в конце:
c:\start BATCH.bat -WindowStyle Hidden