如何通过批处理脚本检查进程是否正在运行
时间: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