启动 .exe 后保持 运行 批处理循环
Keep running batch loop after starting .exe
我的 program.exe 有时会停止。我制作了批处理脚本,用于检查程序是否为 运行,如果不在循环中则启动它。
问题是在 program.exe 启动并运行后循环正在退出。
我需要保持 运行 循环以每 5 分钟检查一次程序是否仍然 运行 或需要重新启动。
set loopcount=10000
:loop
tasklist /FI "IMAGENAME eq program.exe" /FO CSV > search.log
FINDSTR program.exe search.log > found.log
FOR /F %%A IN (found.log) DO IF %%~zA EQU 0 GOTO end
echo Starting..
start /b C:\_Program\program.exe
:end
del search.log
del found.log
echo Waiting..
timeout /t 300 /nobreak
if %loopcount%==0 goto exitloop
goto loop
:exitloop
pause
批处理文件
如果你必须使用批处理文件,我建议:
- 删除循环
- 运行使用计划任务每 5 分钟更新一次
在进程崩溃的情况下,计划任务比无限循环更可靠。
运行 这一次安排一个任务,每 5 分钟重复一次:
schtasks /CREATE /SC DAILY /MO 1 /TN 'Name To Give the Scheduled Task' /TR 'C:\path\to\your\script.bat' /ST 0:00 /RI 5 /DU 24:00
PowerShell
如果你会用PowerShell,等价的就简单一点:
if ($null -eq (ps program -ErrorAction SilentlyContinue)) {
saps C:\_Program\program.exe
}
运行 这一次安排一个任务,每 5 分钟重复一次:
schtasks /CREATE /SC DAILY /MO 1 /TN 'Name To Give the Scheduled Task' /TR 'powershell -EB C:\path\to\your\script.ps1' /ST 0:00 /RI 5 /DU 24:00
这里有一个例子来测试。
实现连续检查(in loop)进程"WinRAR.exe"是否存在(以应用为例进行检查);因此您当然可以更改要检查的路径和进程名称。
@echo off
Set "MyApplication=%Programfiles%\WinRAR\WinRAR.exe"
Set "MyProcess=WinRAR.exe"
Color 9B
Title Check Running process "%MyProcess%"
mode con cols=75 lines=2
:Loop
cls
tasklist /nh /fi "imagename eq %MyProcess%" 2>nul |find /i "%MyProcess%" >nul
If not errorlevel 1 (Echo "%MyProcess%" is running) else (start "" "%MyApplication%")
ping -n 60 127.0.0.1 >nul
goto Loop
它可能很简单:
@echo off
:repeat
tasklist | findstr /i "program.exe">nul
if not %errorlevel% equ 0 start /b "C:\_Program\program.exe"
timeout /t 10 /nobreak>nul && goto :repeat
这是任务列表,我们使用 findstr
确定 errorlevel
如果没有 0
启动程序,timeout
10 秒并重复,不需要外部文件。
我的 program.exe 有时会停止。我制作了批处理脚本,用于检查程序是否为 运行,如果不在循环中则启动它。
问题是在 program.exe 启动并运行后循环正在退出。
我需要保持 运行 循环以每 5 分钟检查一次程序是否仍然 运行 或需要重新启动。
set loopcount=10000
:loop
tasklist /FI "IMAGENAME eq program.exe" /FO CSV > search.log
FINDSTR program.exe search.log > found.log
FOR /F %%A IN (found.log) DO IF %%~zA EQU 0 GOTO end
echo Starting..
start /b C:\_Program\program.exe
:end
del search.log
del found.log
echo Waiting..
timeout /t 300 /nobreak
if %loopcount%==0 goto exitloop
goto loop
:exitloop
pause
批处理文件
如果你必须使用批处理文件,我建议:
- 删除循环
- 运行使用计划任务每 5 分钟更新一次
在进程崩溃的情况下,计划任务比无限循环更可靠。
运行 这一次安排一个任务,每 5 分钟重复一次:
schtasks /CREATE /SC DAILY /MO 1 /TN 'Name To Give the Scheduled Task' /TR 'C:\path\to\your\script.bat' /ST 0:00 /RI 5 /DU 24:00
PowerShell
如果你会用PowerShell,等价的就简单一点:
if ($null -eq (ps program -ErrorAction SilentlyContinue)) {
saps C:\_Program\program.exe
}
运行 这一次安排一个任务,每 5 分钟重复一次:
schtasks /CREATE /SC DAILY /MO 1 /TN 'Name To Give the Scheduled Task' /TR 'powershell -EB C:\path\to\your\script.ps1' /ST 0:00 /RI 5 /DU 24:00
这里有一个例子来测试。 实现连续检查(in loop)进程"WinRAR.exe"是否存在(以应用为例进行检查);因此您当然可以更改要检查的路径和进程名称。
@echo off
Set "MyApplication=%Programfiles%\WinRAR\WinRAR.exe"
Set "MyProcess=WinRAR.exe"
Color 9B
Title Check Running process "%MyProcess%"
mode con cols=75 lines=2
:Loop
cls
tasklist /nh /fi "imagename eq %MyProcess%" 2>nul |find /i "%MyProcess%" >nul
If not errorlevel 1 (Echo "%MyProcess%" is running) else (start "" "%MyApplication%")
ping -n 60 127.0.0.1 >nul
goto Loop
它可能很简单:
@echo off
:repeat
tasklist | findstr /i "program.exe">nul
if not %errorlevel% equ 0 start /b "C:\_Program\program.exe"
timeout /t 10 /nobreak>nul && goto :repeat
这是任务列表,我们使用 findstr
确定 errorlevel
如果没有 0
启动程序,timeout
10 秒并重复,不需要外部文件。