无法在批处理脚本中获取算术计算答案



我正在尝试获取特定进程 PID 的内存使用百分比,但只打印值而不是计算输出值。

@echo off
setlocal enableextensions EnableDelayedExpansion
set PID=5716
for /f "tokens=5 delims= " %%F in ('tasklist /nh /FI "PID eq !PID!"') do (
for /f "tokens=2 delims==" %%a in ('wmic computersystem get TotalPhysicalMemory /value')  do (
set "MEM=((%%F*100) /%%a)"
)
)
)
echo PercentageMemory = %MEM%

我是批处理脚本的新手。我错过了什么吗?

根据我在评论中提供的建议,并使用不同的方法来确定与 PID 关联的过程,您可以这样做,(根据需要在线2更改 PID、5716

@SetLocal EnableExtensions
@Set "PID=5716"
@Set "$Mem="
@For /F "Tokens=2 EOL=N Delims=," %%G In (
'%__AppDir__%wbemWMIC.exe OS Get TotalVirtualMemorySize^,Version^
/Format:CSV 2^>NUL')Do @For /F "Tokens=2 EOL=N Delims=," %%H In (
'%__AppDir__%wbemWMIC.exe Path Win32_PerfFormattedData_PerfProc_Process^
Where "IDProcess='%PID%'" Get WorkingSet^,WorkingSetPrivate /Format:CSV^
2^>NUL')Do @Set /A "$Mem=%%H/1024*100/%%G">NUL 2>&1
@If Defined $Mem Echo %$Mem%%%&Pause

但请注意,如果算术满足超过 32 位有符号整数Set /A限制的数字,则该方法将失败。另外,您应该注意,由于我们使用的是整数,因此结果将始终向下舍入到最接近的整数。这意味着低于1%的任何内容都将显示为0%

如果我没记错的话,当您在任何会话中第一次使用此方法时都会有延迟,之后,您通常会注意到速度显着提高。


如果您已经知道进程的名称,通常是不带扩展名的可执行文件的名称,则可以使用它代替 PID(根据需要将第2行上的ExecutableFile字符串更改为进程名称(:
@SetLocal EnableExtensions
@Set "MyProcess=ExecutableFile"
@Set "$Mem="
@For /F "Tokens=2 EOL=N Delims=," %%G In (
'%__AppDir__%wbemWMIC.exe OS Get TotalVirtualMemorySize^,Version^
/Format:CSV 2^>NUL')Do @For /F "Tokens=2 EOL=N Delims=," %%H In (
'%__AppDir__%wbemWMIC.exe Path Win32_PerfFormattedData_PerfProc_Process^
Where "Name='%MyProcess%'" Get WorkingSet^,WorkingSetPrivate /Format:CSV^
2^>NUL')Do @Set /A "$Mem=%%H/1024*100/%%G">NUL 2>&1
@If Defined $Mem Echo %$Mem%%%&Pause

最新更新