Запуск команд пакетного файлу Windows асинхронно


187

Скажи, якщо я маю

  • foo.exe
  • bar.exe
  • baz.exe

Як запустити їх із пакетного файлу асинхронно, тобто не чекаючи, коли попередня програма зупиниться?

Відповіді:


254

Використання STARTкоманди для запуску кожної програми повинно отримати вам те, що вам потрібно:

START "title" [/D path] [options] "command" [parameters]

Кожна STARTвиклик виконує команду, задану в її параметрі, і повертається негайно, якщо не виконується з /WAITкомутатором.

Це стосується програм командного рядка. Програми без командного рядка повертаються негайно, тому, якщо ви хочете запустити всі асинхронно, використовуйте START.


Добре, дякую. Я повинен був уважно прочитати кожен запис help. :)
RichN

8
Я насправді мав проблеми з цим днями. Мені довелося запустити 30 windows Explorer для перевірки працездатності. Не працювало, і мені це було недостатньо важливо, щоб я заглянув у нього .. замість цього почав переглядати це вікно, а через кілька годин, коли я його закрив, з'явився ще один! І я був як би чорт, закрив це .. інший вискочив! Після 4-5 вікон та багато що **** я помітив, що пакетний файл все ще працює!
Йонас Б

3
Безсоромна самореклама: Я одного разу створив пакет, який може функціонувати як якийсь пул потоків, лише для процесів: stackoverflow.com/questions/672719/…
Joey,

4
Якщо вам потрібно навести аргументи або якщо шлях до команд містить пробіли, не забудьте додати лапки. У цьому випадку вам також потрібно вказати заголовок для вікна, що відкривається: start "" "[шлях до команди]" [аргументи команд]
Pierluigi

Чи є якийсь спосіб сказати за допомогою цієї методики, коли це зроблено? Я починаю ~ 30 копій FILA DESTA, і я хочу, щоб вони були асинхроністами, але я також хочу мати уявлення, коли вони все закінчать.
Дуг

68

Поєднавши пару попередніх відповідей, можна спробувати start /b cmd /c foo.exe.

Для тривіального прикладу, якщо ви хочете роздрукувати версії java / groovy / grails / gradle, ви можете зробити це у пакетному файлі:

@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version

Якщо у вас є щось на кшталт Process Explorer (Sysinternals), ви побачите кілька дочірніх cmd.exe-процесів, кожен з яких виконує процес java (відповідно до наведених вище команд). Вихід буде надрукований на екран у будь-якому порядку, в якому вони закінчуються.

start /b :  Start application without creating a new window. The
             application has ^C handling ignored. Unless the application
             enables ^C processing, ^Break is the only way to interrupt
             the application

cmd /c : Carries out the command specified by string and then terminates

13
це заважає команді відлунати до консолі. У пакетних скриптах іноді ви побачите echo offна початку, що під час виконання сценарію не дозволить всім командам повторюватися до консолі. @Схоже , але тільки для цієї однієї команди. Отже, іноді побачиш @echo off.
djKianoosh

36

Ви можете використовувати команду start для нерестування фонових процесів без запуску нових вікон:

start /b foo.exe

Новий процес не буде перерваний із CTRL-C; ви можете вбити його лише CTRL-BREAK (або закривши вікно, або за допомогою диспетчера завдань.)


5
Де зараз BREAKна клавіатурах?
користувач2023370

1
@ user2023370 Все ще на клавіші " Пауза ". Більшість ноутбуків, у яких відсутні певні клавіші, підтримують приховані комбінації клавіш .
ГерольдБрозер відновлює Моніку


23

Створіть пакетний файл із наступних рядків:

start foo.exe
start bar.exe
start baz.exe 

Команда start запускає вашу команду в новому вікні, тому всі 3 команди будуть працювати асинхронно.


17

Використовуйте команду START :

start [programPath]

Якщо шлях до програми містить пробіли, не забудьте додати лапки. У цьому випадку вам також потрібно вказати заголовок для вікна, що відкривається

start "[title]" "[program path]"

Якщо вам потрібно навести аргументи, додайте їх наприкінці (поза цитатами команд)

start "[title]" "[program path]" [list of command args]

Використовуйте параметр / b, щоб уникнути відкриття нового вікна консолі (але в цьому випадку ви не можете перервати додаток за допомогою CTRL-C


10

Є третій (і, можливо, набагато простіший) варіант. Якщо ви хочете розкручувати кілька примірників однієї програми, використання командного процесора в стилі Unix, наприклад Xargs або GNU Parallel, може зробити це досить простим процесом.

Є клон win32 Xargs під назвою PPX2, що робить це досить просто.

Наприклад, якщо ви хочете перекодувати каталог відеофайлів, ви можете запустити команду:

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"

Розбираючи це, dir /b *.mpgзахоплює список файлів .mpg у моєму поточному каталозі, |оператор передає цей список у ppx2, який потім будує ряд команд, які потрібно виконати паралельно; 4 за раз, як тут вказано -P 4оператором. -L 1Оператор каже ppx2 тільки послати одну лінію нашого каталогу лістинг на FFmpeg в той час.

Після цього ви просто пишете свій командний рядок ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4") і {}автоматично підміняєте кожен рядок списку каталогу.

Це не є загальноприйнятним для кожного випадку, але набагато простіше, ніж використання обхідних пакетних файлів, описаних вище. Звичайно, якщо ви не маєте справу зі списком файлів, ви також можете передавати вміст текстового файлу чи будь-якої іншої програми на вхід pxx2.


1
Останній порт xargs win32 працює добре сьогодні (той, який увійшов у комплект із git для windows).
Пітер М

Це чудово, за винятком випадків, коли він не справляється з файлами, що містять символи unicode. Будь-які плани підтримувати файли Unicode? Дякую.
Gökhan Sever

@ GökhanSever У минулому я працював над цим питанням, використовуючи форму "короткого імені" шляху, який виглядає як C: \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE. Не дуже, але це працює.
линька форма

-1

Я не міг нічого зробити, я закінчився, просто використовуючи powerhell для запуску сценаріїв bat .. інколи навіть запуск cmd / c не працює не впевнений чому .. Я навіть спробував такі речі, як запуск cmd / c блокнота та вихід

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.