Как запустить файл 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