想就如何检测(最好是以批处理文件可以使用结果的方式)某个应用程序是否正在运行提出建议,以便采取某些措施。(当然,不是基于 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()]
注意这个场景中的一些事情
我有一个可执行文件正在运行
我的可执行文件的名称 +(.extension) 长度超过 25 个字符
使用
TaskList/fi "imagename eq some_imagename.exe"
,有 25 个字符的限制,其中imagename.exe
将出现使用
TaskList/fi "imagename eq some_imagename.exe"|find "some_imagename.exe"
returnerrorlevel == 0
但是使用下面的命令,由于字段
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
其他资源:
Set /?
Echo /?
Find /?
For /?
For /F /?
Tasklist /?
- 重定向
|
,<
,>
,2>
, ETC。
- 条件执行
Goto :Label
|Call :Label
- 变量和子字符串操作
- 批处理文件中的命令行参数
- 如何将参数传递给批处理文件
- Windows 命令解释器如何
cmd.exe
解析脚本
我需要使用 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
将错误级别设置0
为found
和。1
not found
也可以看看: