如何通过批处理脚本检查进程是否正在运行

时间:2020-03-06 15:01:34  来源:igfitidea点击:

我如何检查应用程序是否正在从批处理文件(cmd)运行?

如果程序已经在运行,则无需启动另一个实例。 (我不能将应用程序更改为仅使其成为单个实例。)

该应用程序也可以以任何用户身份运行。

解决方案

我们应该检查父进程的名称,请参阅有关基于.NET的解决方案**的代码项目文章。

一种非编程方式检查:

  • 启动Cmd.exe
  • 启动一个应用程序(例如," c:\ windows \ notepad.exe")
  • 在进程资源管理器中检查Notepad.exe进程的属性
  • 检查父进程(显示cmd.exe)

可以通过获取父进程名称来检查是否相同。

我在这里假设窗户。因此,我们将需要使用WMI来获取该信息。请查看Scripting Guy的档案,以获取有关如何从脚本中使用WMI的许多示例。

这是我的解决方法:

tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end

start notepad.exe

:end

del search.log

如果记事本尚未运行,则上面的内容将打开它。

编辑:请注意,这将找不到任务列表中隐藏的应用程序。这将包括以其他用户身份运行的所有计划任务,因为这些任务会自动隐藏。

我不知道如何使用内置的CMD来执行此操作,但是如果我们有grep,则可以尝试以下操作:

tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"

我使用安装在Program Files \ PV中的http://www.teamcti.com/pview/prcview.htm中的PV.exe带有如下批处理文件:

@echo off
PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\YourProgram
PV.EXE YourProgram.exe >nul
if ERRORLEVEL 1 goto Process_NotFound
:Process_Found
echo YourProgram is running
goto END
:Process_NotFound
echo YourProgram is not running
YourProgram.exe
goto END
:END

受grep启发,我想到的另一种可能性是:

tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /N "myapp.exe">NUL
if "%ERRORLEVEL%"=="0" echo Program is running

它不需要保存额外的文件,因此我更喜欢这种方法。

我使用了Matt(2008-10-02)提供的脚本。我唯一遇到的麻烦是它不会删除search.log文件。我期望是因为必须将cd转到另一个位置才能启动程序。我将其恢复为BAT文件和search.log所在的位置,但仍不会删除。因此,我通过首先删除而不是最后删除search.log文件来解决此问题。

del search.log

tasklist /FI "IMAGENAME eq myprog.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%-zA EQU 0 GOTO end

cd "C:\Program Files\MyLoc\bin"

myprog.exe myuser mypwd

:end