Комбинация "бесконечного цикла", которая необходима в вашем случае, и файлы python, я думаю, будет сильно перегружать ваш процессор.Есть исправленный кусок кода (работает только с расширениями одного файла (*.bat, *.txt
)).Ниже приведено кое-что более общее.
@echo off
setlocal EnableExtensions
:start_python_files
start "1st" "test1.py"
start "2nd" "test2.py"
start "3rd" "test3.py"
:check_python_files
call:infinite 1st test1.py
call:infinite 2nd test2.py
call:infinite 3rd test3.py
goto:check_python_files
:infinite
tasklist /FI "WINDOWTITLE eq %1 - %2" | findstr /c:PID > nul
rem findstr /c:PID command added above to confirm that tasklist has found the process (errorlevel = 0). If not (errorlevel = 1).
if %errorlevel% EQU 1 (start "%1" "%2")
Ну, этот способ может длиться некоторое время, поэтому, если файл закрыт (~ 2-3 секунды в зависимости от перегрузки вашего процессора).
Пожалуйста, сообщите мне, если это не работает для вас.У меня не установлен python, и я не знаю, как они называются, когда они открываются:).
Итак, теперь, когда вы (любезно ???) запросили полные ответы, позвольте мне объяснить мой код:
- Я разрешаю расширениям (
setlocal EnableExtensions
) изменить команду call
следующим образом:
Команда CALL теперь принимает метки в качестве цели CALL.Синтаксис:
CALL: метка аргументов
Команда call /?
.Вы должны ввести его в новом cmd для получения дополнительной информации
Я указываю заголовок окна с помощью команды start
, поэтому мой код будет работать.Введите start /?
в новом окне cmd.
I call
подпрограмма infinite
, отправляющая ей аргументы (заголовок окна и имя файла).Доступ к ним можно получить с помощью %1
(первый аргумент) и %2
(второй аргумент).
В подпрограмме infinite
я ищу заголовок окна (WINDOWTITLE
)РАВНО (eq
) для форматирования window title - filename
.Даже если он не существует, tasklist
вернет errorlevel
значение 0
с сообщением:
ИНФОРМАЦИЯ: не выполняются никакие задачи, соответствующие указанному критерию.
Поскольку здесь PID
строка не существует (если она будет найдена, она будет существовать), мы ставим findstr
, чтобы найти ее.Если найдено, errorlevel
будет 0
.Иначе, это будет 1
.
Если errorlevel
равно 1
, это означает, что процесс не найден, что означает, что файл закрыт.Итак, мы снова открываем его с отправленными аргументами (start "window title (%1)" "filename (%2)"
).
Поскольку мы call
отредактировали подпрограмму infinite
, после ее завершения мы вернемся к check_python_files
подпрограмма, выполняющая все вышеперечисленное бесконечно, до завершения работы пользователя или выключения компьютера.
Как будет обсуждаться позже в чате, когда мы запускаем файлы python стандартно (с start "window title"
), заголовок окнаполный путь к файлу python.exe
.Я нашел способ исправить это: start
команда cmd /c
.Пересмотренный фрагмент кода:
@echo off
setlocal EnableExtensions
:start_python_files
start "1st" "cmd /c test1.py"
start "2nd" "cmd /c test2.py"
start "3rd" "cmd /c test3.py"
:check_python_files
call:infinite 1st test1.py
call:infinite 2nd test2.py
call:infinite 3rd test3.py
goto:check_python_files
:infinite
tasklist /FI "WINDOWTITLE eq %1" | findstr /c:PID > nul
rem findstr /c:PID command added above to confirm that tasklist has found the process (errorlevel = 0). If not (errorlevel = 1).
if %errorlevel% EQU 1 (start "%1" "cmd /c %2")
Я только что добавил cmd /c
дополнительный (и удалил %2
) из заголовка окна, так как он не нужен.
cmd /c
указывает системе запустить новый cmd, который будет выполнять команду, указанную в строке, а затем завершится.
Сводка:
Команды должны выполняться дляполучить больше информации о том, как они работают :
call /?
start /?
goto /?
tasklist /?
findstr /?
cmd /?
Я предлагаю запустить вышеуказанное в новом новом окне cmd.
Несколько интересных ссылок :
Мне очень жаль, что я попал в этот беспорядок.В любом случае, спасибо, что предоставили мне такую полезную информацию, чтобы понять, в чем я был неправ.