Як запустити файл bat у фоновому режимі з іншого файлу bat?


91

У мене є сценарій "налаштування", який я запускаю вранці і запускає всі програми, які мені потрібні. Зараз деякі з них потребують додаткового налаштування середовища, тому мені потрібно обернути їх невеликими сценаріями BAT.

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

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

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

START/B CMD env-script.batдає той самий результат. Здається, жоден прапор у CMD не відповідає моєму рахунку.

Відповіді:


72

Насправді, для мене добре працює та створює нові вікна:

test.cmd:

@echo off
start test2.cmd
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 , як зазначив Моше, якщо ви не хочете, щоб нові вікна з’являлися перед вами.


1
Гаразд, це працює, але не на 100% ідеально: після того, як я натиснув "RETURN" у "Тесті 2", це вікно не закриється. Будь-які ідеї?
Аарон Дігулла,

Ви можете додати "вихід" до породжених партій, щоб потім закрити їх знову. Вибачте, не тестував так далеко :)
Джої

насправді запуску script1.bat \ n запуску script2.bat \ n запуску scriptN.bat мені було достатньо
andrej

142

Два роки, але для повноти ...

Стандартний вбудований підхід: (тобто поведінка, яку ви отримаєте при використанні &в 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

Якщо ви хочете, щоб bat запускався на незалежній консолі: (тобто інше вікно)

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

Якщо ви хочете, щоб інше вікно після цього зависло:

START CMD /K CALL "foo.bat" [args [...]]

Примітка: Це насправді погана форма, якщо у вас немає користувачів, які спеціально хочуть використовувати відкрите вікно як звичайну консоль. Якщо ви просто хочете, щоб вікно застрягло, щоб побачити результат, краще поставити a PAUSEв кінці файлу bat. Або навіть ще, додайте ^& PAUSEпісля командного рядка:

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

10
&є оператором "а потім" (термінологія?). (наприклад, cmd1 & cmd2означає зробити "cmd1", а потім "cmd2". На відміну від &&оператора, виконання "cmd2" не залежить від успішного виходу "cmd1".) ^Екранується &так, що він переходить у аргументи CMD, а не споживається і запускається на тій самій консолі, на якій працював START.
антак

Це дуже корисно, дякую. Я якраз збирався перенести деякі сценарії на Linux, оскільки інші посібники startта cmdне надавали повної функціональності, яку я шукав. Ваша відповідь це забиває.
Ітератор

3
Якщо ви не хочете вихідних даних, тоді переспрямування потрібно уникати, щоб воно було передано CMD. Також CALL не потрібен:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham

1
@dbenham: Хоча те, що ти кажеш, має сенс, START /B "" CMD /C PING 127.0.0.1 >NULздається, працює незалежно, і нічого не виводиться. (Можливо, тому, що CMDуспадковує STARTдескриптори вводу-виводу.) Я думаю, різниця полягає в тому, що ви хочете зберегти STARTвихідні дані (помилки) в цілості, що, мабуть, є гарною ідеєю. CALLпросто там, тому що я відчував, що це хороша практика, яку потрібно тримати. (тобто невикористання CALLдля синхронних викликів bat призведе до непередбачуваних кодів виходу, тому я постійно поєднуюсь із дзвінками bat, CALLнавіть коли це не суворо застосовується, як у цьому випадку.)
antak

7

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


-1 Проблема в тому, що START не створює нового вікна при запуску файлу BAT; натомість він повторно використовує поточне вікно та змішує введення-виведення двох процесів CMD.
Аарон Дігулла,

4
Це не створює нове вікно, оскільки ви використовуєте прапор / B. Видали це.
Моше

5

Крім терміну переднього плану / фону. Інший спосіб приховати запущене вікно - це за допомогою vbscript, якщо він все ще доступний у вашій системі.

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

назвіть це як sth.vbs і зателефонуйте йому від bat, поставте заплановане завдання тощо. Особисто я відключу vbs без поспіху в будь-якій системі Windows, якою я керую :)


Що стосується мого конкретного випадку використання, це насправді було єдиним рішенням, яке я міг приступити до роботи ...
Бен,

0

Створіть нову програму 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();
}

2
М-м-м-м ... Я сподівався, що щось таке просте, як те, що не потребуватиме встановлення Visual Studio ...
Аарон Дігулла,

1
Поки PowerShell не буде доступний на 100% - C # справді надмірний.
Джим,

2
Аарон: Компілятор C # включений у .NET Framework 2, тому ви можете просто відредагувати якийсь код у текстовому редакторі та скомпілювати його. Проте, оскільки це цілком можливо в командному файлі, я б також сказав, що C # є надмірним.
Джої,

0

Це працює на моїй установці Windows XP Home, Unix способом:

call notepad.exe & 

7
Я думаю, що це працює лише випадково, і & не є необхідним.
Сем Уоткінс

2
Так, notepad.exe для початку асинхронний.
антак

0

Насправді досить просто з цим варіантом в кінці:

c: \ start BATCH.bat -WindowStyle Hidden


команда Windows startне має -WindowStyleопції.
Stephan

@Stephan Arreed. C:` instead of Непарний шлях ( C: \ Windows`) говорить про те, що він знайшов інструмент десь в Інтернеті та скопіював на свій жорсткий диск.
Аарон Дігулла
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.