У меня есть start.bat
, похожий на следующий:
start npx tailwindcss -i ./www/src/styles/main.css -o ./www/dist/styles/main.css --watch
start caddy run
Он запускает 2 новых приглашения cmd и запускает процессы внутри них (которые оба работают бесконечно). Есть ли способ для этого bat-файла отправить команду kill на созданные им cmds? В идеале у меня была бы одна команда, чтобы убить все созданные «дочерние» процессы.
Нет, PS было бы хорошо. Я просто больше знаком с партиями.
Не называйте пакетный файл командой, start
, потому что в противном случае вы можете непреднамеренно выполнять циклические вызовы…
В качестве отступления: то, что вы создаете, не является экземпляром cmd.exe
, если только исполняемые файлы, которые вы вызываете (npx
, caddy
), не реализуются как пакетные файлы. В противном случае исполняемые файлы запускаются напрямую, без участия оболочки, такой как cmd.exe
.
Решение PowerShell — что приемлемо как подразумеваемый по тегам этого вопроса и как явно указано icanfathom (OP) в комментарии («Нет, PS подойдет») — с использованием командлетов Start-Process
и Stop-Process
:
$processes = & {
Start-Process -PassThru npx 'tailwindcss -i ./www/src/styles/main.css -o ./www/dist/styles/main.css --watch'
Start-Process -PassThru caddy run
}
# ...
# Stop (kill) all launched processes.
$processes | Stop-Process
set "wintitle=my process %time%"
start "%wintitle%" npx tailwindcss -i ./www/src/styles/main.css -o ./www/dist/styles/main.css --watch
start "%wintitle%" caddy run
....
taskkill /FI "WINDOWTITLE eq %wintitle%"
[непроверено] - должно работать в теории...
Всегда лучше использовать start
с заголовком в кавычках, поскольку в противном случае первая строка в кавычках, которую видит команда start
, может быть съедена и использована в качестве заголовка.
Из любопытства, есть ли причина, по которой вам нужно использовать пакетный файл, а не сценарий PowerShell?