我有3个python文件:1.py,2.py,3.py,并且我试图制作一个bat批处理文件,以防我的python文件由于某种原因被破坏或关闭时重新启动。 我正在尝试以下代码,但是效果不佳:
@echo off
:Restart
start "1" /wait "C:\Users\PC\Desktop\test\1.py"
start "2" /wait "C:\Users\PC\Desktop\test\2.py"
start "3" /wait "C:\Users\PC\Desktop\test\3.py"
goto Restart
我的目标是仅使用一个bat文件来自动重启我的3个文件,以防它们关闭或崩溃。 如果只有其中一个关闭,则仅重新启动,或者如果其中两个关闭,则重新启动,依此类推
答案 0 :(得分:1)
我只是从另一个重复的问题(Batch that monitors and restarts a python)复制粘贴我的答案:
在我的情况下,需要“无限循环”和python文件的组合,这会使您的CPU超负荷。修改一段代码(仅适用于单个文件扩展名(*.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秒,具体取决于您的CPU过载)。
如果它不适合您,请通知我。我尚未安装python,也不知道打开它们时的命名方式:)。
因此,现在(如您所愿)要求您提供完整的答案,让我解释一下我的代码:
setlocal EnableExtensions
)来更改call
命令,如下所示:CALL命令现在接受标签作为CALL的目标。语法 是:
CALL:标签参数
来自call /?
命令。您应该在一个新的cmd中键入它以获得更多信息
我使用start
命令指定了窗口标题,因此我的代码可以使用。在新的cmd窗口中键入start /?
。
我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
子程序进行上述所有操作,直到用户终止或计算机关闭
如稍后在聊天中所讨论的,当我们标准地(使用start "window title"
运行python文件时,窗口标题将是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,该cmd将执行字符串指定的命令,然后终止。
简介:
应该运行命令以获取有关其工作方式的更多信息:
call /?
start /?
goto /?
tasklist /?
findstr /?
cmd /?
我建议在新的cmd窗口中运行以上命令。
一些有趣的参考:
很抱歉让您陷入困境。无论如何,谢谢您为我提供了这么好的信息,以帮助我了解我哪里做错了。