我希望我的批处理文件在继续执行代码之前检查进程名称是否存在并正在使用TaskList运行,但是不幸的是,如果进程名称超过21个字符,它将无法正常工作。有什么方法可以消除字符数限制或支持超过21个字符的进程名称?
我尝试使用不超过21个字符的任何其他进程名称,并且该代码可以正常工作。我一直在网上查找,但没有尝试过其他任何方法,但是找不到与我的确切问题匹配的任何东西,或者不知道为什么它无法检测到过长的进程名称。我减少了代码,使代码更短,更易于理解。
@echo off
set ProcessName=PROCESSNAME
for /f "tokens=4-7 delims=[.] " %%i in ('ver') do (if %%i==Version (set v=%%j.%%k) else (set version=%%i.%%j))
if "%version%" == "10.0" goto win10
:win10
setlocal
echo Press any key to start...
pause >nul
tasklist /fi "IMAGENAME eq %ProcessName%.exe" 2>NUL | find /I /N "%ProcessName%.exe">NUL
if "%ERRORLEVEL%"=="1" (
goto error
)
echo Process detected.
pause
exit
:error
echo WARNING! This process is not running. Make sure it is running or written properly.
pause
要对此进行测试,您可以创建一个假的.exe并为其指定一个长名称,然后在此行上替换该名称:
set ProcessName=PROCESSNAME
我希望支持22个字符或更多字符的任何进程名称。
答案 0 :(得分:2)
您可以使用tasklist
开关更改/fo
的输出格式:
/FO format Specifies the output format.
Valid values: "TABLE", "LIST", "CSV".
将格式更改为CSV
可以使用更大的进程名称。
尝试一下:
tasklist /fo csv /fi "IMAGENAME eq %ProcessName%.exe" 2>NUL | find /I /N "%ProcessName%.exe">NUL
答案 1 :(得分:0)
一种方法是使用PowerShell获取进程。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET $ProcessName = 'svnserve'
SET "RUNNING=false"
FOR /F "delims=" %%p IN ('powershell -NoLogo -NoProfile -Command ^
"(Get-Process -ProcessName $ProcessName -ErrorAction SilentlyContinue).ProcessName"') DO (
SET "RUNNING=true"
)
ECHO RUNNING is %RUNNING%
答案 2 :(得分:0)
BDM的answer向您展示了如何实现tasklist
还返回更长的进程名称。
让我指出,过滤器选项/FI
(tasklist /FI "ImageName eq process.exe"
)确实接受更长的进程(或图像)名称,只有返回的文本可能会被截断。
无论如何,您不会将进程名称输出到控制台,而是将它们通过管道传递到find
中,因此返回的文本确实有用。
但是,您可以重新搜索以捕获tasklist
消息,而{没有遇到匹配的进程,而不必再次在返回的进程列表中搜索进程名称以检测是否至少有一个这样的进程名称。 {1}}像这样:
findstr
这与您的tasklist /FI "ImageName eq %ProcessName%.exe" | findstr /V /B /C:"INFO: " > nul
命令一样,在找不到匹配过程的情况下设置find
。
ErrorLevel
的替代方法是wmic
命令:
tasklist
并与wmic Process where "Name='%ProcessName%.exe'" get Name,ProcessID
一起:
find