如何检测 Windows 应用程序是否正在运行(无 GUI)

如何检测 Windows 应用程序是否正在运行(无 GUI)

想就如何检测(最好是以批处理文件可以使用结果的方式)某个应用程序是否正在运行提出建议,以便采取某些措施。(当然,不是基于 GUI 的措施)。

答案1

@echo off 

set "_results=Not Running"
set "_imagename=executable_with_imagename_length_greater_than_25_characters.exe"
tasklist.exe /svc /fo list | find.exe /i "%_imagename%" >nul && set "_results=%_results:Not =%"

echo=%_results%
  • 使用:Tasklist /svc /fo list

  • 使用:Find "string" && [if/because return 0 do()] || [if/because return non 0 do()]


在此处输入图片描述


注意这个场景中的一些事情

  1. 我有一个可执行文件正在运行

  2. 我的可执行文件的名称 +(.extension) 长度超过 25 个字符

  3. 使用TaskList/fi "imagename eq some_imagename.exe",有 25 个字符的限制,其中imagename.exe将出现

  4. 使用TaskList/fi "imagename eq some_imagename.exe"|find "some_imagename.exe"returnerrorlevel == 0

  5. 但是使用下面的命令,由于字段errorlevel == 1中的字符限制,我总是得到imagename


为了获得准确的信息(不限于字符长度),请替换:

tasklist /fi "imagename eq executable_with_imagename_length_greater_than_25_characters.exe"|find /i "executable_with_imagename_length_greater_than_25_characters.exe"

Tasklist /svc /fo list | find /i "executable_with_imagename_length_greater_than_25_characters.exe" 

  • 这些命令的作用
   Inhibits echo on commands:  @echo off  

Define status to Not Running:  set "_results=Not Running   
Define The Program.eXtension:  set "_imagename=executable.exe"

                    TaskList:  tasklist.exe /svc /fo list 
                               /SVC  Displays services hosted in each process.
                               /FO   format  Specifies the output format.
                                             Valid values: "TABLE", "LIST", "CSV".

Redirect TaskLis out to Find:   tasklist.exe ... | find ...

 Handles input "%filtering%":   find.exe /i "%_imagename%" 

     Omit find output/string:   >nul

  if command returned 0 runs:   && next_cmd

Replace/Remove 'Not ' in var:   set "_results=%_results:Not =%"

Echoes the current condition:   echo=%_results%

  • 这一切都是为了说明使用带有标志的 TaskList"/fi "imagename eq executable"并不准确/可靠,而不考虑包含文件/程序的名称.eXtension 的字符串:

@echo off 

set "_results=Not Running"
set "_imagename=executable.exe"
tasklist.exe /svc /fo list|find.exe /i "%_imagename%">nul && set "_results=%_results:Not =%"

echo=%_results%


  • 一个简单的替代方案是:
@echo off 

tasklist.exe /svc /fo list | ( 
     find.exe /i "Program_Name.exe" 
   ) >nul && echo;True || echo;False

  • 我会用什么:
@echo off

for /f %%i in ('"tasklist.exe /svc /fo list|find.exe /i "ProgramName.Exe">nul && echo;True||echo;False"
')do set "_bool=%%~i"
   
echo/%_bool%

最好以这样的方式批处理文件可以使用结果

  • 使用参数:
file.cmd program.exe outvar
@echo off

if "%~1" == "" (set "_default=My_Default_Program.exe") else set "_default=%~nx1"
for /f %%i in ('"tasklist.exe /svc /fo list|find.exe /i "%_default%">nul && echo;True||echo;False"
')do set "_bool=%%~i" && set "%~2=%%~i"
 

echo/%_bool%
  • :: 或者使用:lable....
@echo off

for /f %%i in ('"tasklist.exe /svc /fo list|find.exe /i "%~1">nul && echo;True||echo;False"
')do if "%%~i" == "True" goto :True_Label_Job

echo/%~nx1 False
rem :: command for False condition here...
rem :: command for False condition here... 
rem :: command for False condition here... 
exit /b || goto :eof

:True_Label_Job
echo/%~nx1 True
rem :: command for True condition here...
rem :: command for True condition here... 
rem :: command for True condition here... 
exit /b || goto :eof

其他资源:


我需要使用 bat 文件检查程序是否在 tasksheduler 中运行。

最大的问题是这个程序是由外部人员编写的,并且有四个"."
在名字的中间。

我正在使用这个代码:

tasklist /fi "IMAGENAME eq Fls.Core.Portal.UI.Shell.exe" 2>NUL | find /I /N "Fls.Core.Portal.UI.Shell.exe">NUL
msg * %ERRORLEVEL%
goto Exit

由于程序运行落后,我期待着
errorlevel 0但它正在回归1

我认为问题就出"."在程序名称上。


答案2

tasklist 命令 可以搜索给定的进程。

检查批处理文件内部是否成功有点复杂,因为此命令没有设置errorlevel

然后您需要将它与另一个设置它的实用程序结合使用,例如 查找命令 像这样:

echo off
tasklist /fi "imagename eq notepad.exe" | find "notepad.exe" > nul
if errorlevel 0 echo I found notepad.exe

这里的想法是,仅notepad.exe当找到任务时才会出现在输出中,因此find将错误级别设置0found 和。1not found

也可以看看:

相关内容