如何处理 bat 文件中程序名称中间的“。”?

如何处理 bat 文件中程序名称中间的“。”?

我需要使用 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

由于程序运行落后,我期望返回错误级别 0,但它返回的是 1

我认为问题就出在程序名称中的这个“。”。

答案1

你不必担心如何处理.,这不是这里出现此问题的原因,这仅与tasklist输出中的长度字符长度有关。

参见tasklist命令tasklist | find /i /n "Fls.Core.Portal.UI.Shell.exe" 应该导致:

[263]Fls.Core.Portal.UI.Shell.exe     8900 Console                    1      4,076 K

但这永远不会发生,输出tasklist使用精确姓名长度为 25 个字符并且你试图用一个字符串找到长度为 28 个字符 tasklist | find /i /n "Fls.Core.Portal.UI.Shell.exe"因此,使用这个长度为 28 个字符的字符串你永远不会得到想要的结果:

尝试将字符串缩短至 25 个字符:

tasklist | find /i /n "Fls.Core.Portal.UI.Shell."

如果没有,你将永远得到这个输出exe

[263]Fls.Core.Portal.UI.Shell.     8900 Console                    1      4,076 K

有人建议代码:

@echo off && setlocal enabledelayedexpansion

tasklist | find /I /N "Fls.Core.Portal.UI.Shell." >NUL && (
%__APPDIR__%msg.exe * !errorlevel! zOk, here i'm! & goto Exit:
)|| %__APPDIR__%msg.exe * !errorlevel! nOp, I'm not there! & goto Exit:
   
:Exit:
endlocal

要在运行查询过程中使用全名,请尝试使用wmic

wmic process where name="Fls.Core.Portal.UI.Shell.exe" get processid /value 
wmic process where name="Fls.Core.Portal.UI.Shell.exe" get caption /value
wmic process where name="Fls.Core.Portal.UI.Shell.exe" get name /value
  • 使用:
wmic process where name="Fls.Core.Portal.UI.Shell.exe" get name | find /v "Name"
  • 输出:
Fls.Core.Portal.UI.Shell.exe
  • 获取列出的完整列表描述:
wmic process where name="Fls.Core.Portal.UI.Shell.exe" get * /format:list
  • 结果:

Caption=Fls.Core.Portal.UI.Shell.exe
CommandLine="C:\Users\ecker\AppData\Local\Temp\"Fls.Core.Portal.UI.Shell.exe"
CreationClassName=Win32_Process
CreationDate=20200423222440.079263-180
CSCreationClassName=Win32_ComputerSystem
CSName=LAME_SLUG
Description=Fls.Core.Portal.UI.Shell.exe
ExecutablePath=C:\Users\ecker\AppData\Local\Temp\Fls.Core.Portal.UI.Shell.exe
ExecutionState=
Handle=12752
HandleCount=79
InstallDate=
KernelModeTime=312500
MaximumWorkingSetSize=1380
MinimumWorkingSetSize=200
Name=Fls.Core.Portal.UI.Shell.exe
OSCreationClassName=Win32_OperatingSystem
OSName=Microsoft Windows 10 Pro|C:\Windows|\Device\Harddisk0\Partition4
OtherOperationCount=1505
OtherTransferCount=29348
PageFaults=2228
PageFileUsage=2624
ParentProcessId=11868
PeakPageFileUsage=4236
PeakVirtualSize=2203379519488
PeakWorkingSetSize=4288
Priority=8
PrivatePageCount=2686976
ProcessId=12752
QuotaNonPagedPoolUsage=6
QuotaPagedPoolUsage=46
QuotaPeakNonPagedPoolUsage=6
QuotaPeakPagedPoolUsage=46
ReadOperationCount=14
ReadTransferCount=822
SessionId=1
Status=
TerminationDate=
ThreadCount=1
UserModeTime=0
VirtualSize=2203378040832
WindowsVersion=10.0.18363
WorkingSetSize=4255744
WriteOperationCount=0
WriteTransferCount=0
  • 进一步阅读:

[√]西米克

答案2

您的命令过于复杂了。下面这个就足够了,而且效果更好:

tasklist | find /I /N "Fls.Core.Portal.UI.Shell.exe">NUL

相关内容