我发现这在 stackoverflow 上,它的代码如下:-
@echo off
Set "MyProcess=calc.exe"
echo "%MyProcess%"
tasklist /NH /FI "imagename eq %MyProcess%" 2>nul |find /i "%MyProcess%">nul
If not errorlevel 1 (Echo "%MyProcess%" est en cours d^'execution) else (start "" "%MyProcess%")
pause
但我的问题不同。根据 Header,我想不断检查程序是否正在运行。所以我做了我的像这样的批处理文件。
@echo off
:B
Set "MyProcess=cmd.exe"
echo "%MyProcess%"
tasklist /NH /FI "imagename eq %MyProcess%" 2>nul |find /i "%MyProcess%" >nul
If not errorlevel 1 (Echo "%MyProcess%" est en cours d^'execution) else (start "" "1.bat","" "2.bat", "" "3.bat")
goto B
这似乎也不起作用。
最难的是,我只是批处理方面的初学者,所以我不理解这里的大部分内容
谢谢。
答案1
持续检查某个进程是否正在运行,若未运行则启动多个程序并终止自身
我想持续检查程序是否正在运行
下面的应该可以满足逐个调用批处理脚本的需求,并且基本上只是在机器的内存中确认TASKLIST
运行的命令以确认它正在运行。
如果它没有运行,则依次调用批处理脚本;否则,转到:B
例程并重新开始检查。如果它正在运行,则ECHO
转到"%MyProcess%" est en cours d^'execution
例程:B
并再次检查以确认(持续检查)。
警告: 确保在调用的批处理脚本末尾有 GOTO EOF,EXIT
否则它们不会将控制权交还给调用者,以便原始批处理可以继续其循环检查。(见下面的例子调用脚本示例)。
具有检查逻辑的脚本(使用这个)
@ECHO OFF
:B
SET MyProcess=cmd.exe
ECHO "%MyProcess%"
TASKLIST | FINDSTR /I "%MyProcess%"
IF ERRORLEVEL 1 (GOTO :StartScripts) ELSE (ECHO "%MyProcess%" est en cours d^'execution)
GOTO :B
:StartScripts
::: //-- Put in the full path to the batch scripts to call
::: //-- Be sure the security context this process runs as has access to execute the below called batch scripts
CALL "C:\Path\1.bat"
CALL "C:\Path\2.bat"
CALL "C:\Path\3.bat"
GOTO :B
(我假设被调用的批处理脚本将具有启动确定未在 abobe 脚本运行的机器内存中运行的任何进程的逻辑,因此请确保这GOTO EOF
是所有这些脚本执行的最后一件事。我需要看到这些脚本中的逻辑才能亲自知道这是否可以正常工作。)
调用脚本示例(例如 1.bat、2.bat、3.bat)
<LOGIC>
<LOGIC>
<LOGIC>
<LOGIC>
<LOGIC>
<LOGIC>
<LOGIC>
<END OF LOGIC>
::: Keep GOTO EOF here to pass control back to the caller
GOTO EOF
其他说明
您可以将逻辑放在三个单独调用的批处理脚本运行的同一个批处理脚本中,并将它们称为标签\例程,但我需要查看其中的逻辑才能确认它是否有效。只要它们各自在底部都有
GOTO EOF
,它们就会以相同的方式工作,但这样所有逻辑都会在同一个批处理脚本文件中。批处理脚本逻辑使用
TASKLIST
和FINDSTR
(正如我所料)应该可以正常工作,无需 [/NH /FI imagename eq
] 语法,正如您在问题中展示的示例所示,该语法不起作用。使用FINDSTR
而不是FIND
(如) (在您的示例中)也可以。我有与此类似的批处理逻辑,可以在本地和远程检查服务器上正在运行的进程,这些进程要么像你一样自动更正,要么发送电子邮件来指示某人需要注意某事,所以我已经确认我提供的脚本逻辑的这种方法可以成功运行。我只是没有你所有的逻辑来优化、确认等。