如何通过批处理脚本检查可用内存(RAM)?

Posted

技术标签:

【中文标题】如何通过批处理脚本检查可用内存(RAM)?【英文标题】:How to check available memory (RAM) via batch script? 【发布时间】:2012-07-05 18:57:57 【问题描述】:

我想知道如何在批处理脚本中检查可用内存?有没有已经可用的方法?如果在批处理脚本中不可能,那么还有其他方法可以让我们获得可用内存吗?

操作系统:Windows XP / Windows 7

【问题讨论】:

根据您对术语“批处理脚本”的使用,我们是否应该假设您希望在 Windows 上执行此操作?有关您的上下文和环境的其他信息将有助于... 【参考方案1】:

这应该可行:

free_mem=`free | sed -n 2p | awk 'print $4'`

这将为您提供空闲内存。如果您想要总数,请获取第一列 ($1)。

【讨论】:

哦,你说的是batch。我收回这个。【参考方案2】:

不确定 Windows XP,但在 Windows 7 中,您可以使用 systeminfo(外部)命令,如 this ServerFault question。除了在我的计算机上,该命令显示的信息太多,因此您可以将其限制在相关部分:

systeminfo | find "Physical Memory"

上面显示了以下信息:

总物理内存:n,nnn MB 可用物理内存:n,nnn MB

如果您只需要 Available 行,请让您的搜索更具体:

systeminfo | find "Available Physical Memory"

【讨论】:

我很抱歉不接受这个答案,因为在不同的语言环境机器上(除了 EN)它会失败......那里有什么通用的方法吗? @Anand:可能不会。您需要将搜索词更改为用于该语言环境的systeminfo 输出中的搜索词。对不起。我认为,作为一个通用的单命令解决方案,@Alex K.'s 应该适合你(尽管@reuben's 似乎也可以)。【参考方案3】:

此站点有一个示例 VBScript,它检索 内存量:

http://www.computerperformance.co.uk/vbscript/wmi_memory.htm

它可以适应报告可用内存量:

' Memory.vbs
' Sample VBScript to discover how much RAM in computer
' Author Guy Thomas http://computerperformance.co.uk/
' Version 1.3 - August 2010
' -------------------------------------------------------' 

Option Explicit
Dim objWMIService, perfData, entry 
Dim strLogonUser, strComputer 

strComputer = "." 

Set objWMIService = GetObject("winmgmts:" _
& "impersonationLevel=impersonate!\\" _ 
& strComputer & "\root\cimv2") 
Set perfData = objWMIService.ExecQuery _
("Select * from Win32_PerfFormattedData_PerfOS_Memory") 

For Each entry in perfData 
Wscript.Echo "Available memory bytes: " & entry.AvailableBytes
Next

WScript.Quit

您可以通过将其保存到扩展名为 .vbs 的文件(例如 memory.vbs)并使用 cscript.exe 运行它来运行它,例如:

cscript.exe //nologo memory.vbs

...获得如下输出:

Available memory bytes: 4481511424

【讨论】:

非常感谢,这与语言环境无关 :) 这与语言环境无关,但我想它不适用于 64 位 Win 7 操作系统,对吧? 64 位操作系统的查询是什么? 在我的 Win7 x64 上运行良好,并且不依赖于语言环境 @reuben 可能是因为这个查询 (Select * from Win32_PerfFormattedData_PerfOS_Memory) 我解释它不起作用。正如我认为的 64 位机器,它将是 Win64_... 的东西。 @AlexK。太棒了!那么这就是我的解决方案......谢谢reuben【参考方案4】:

替代方案:

C:\>wmic os get freephysicalmemory
FreePhysicalMemory
4946576

解析出一个变量(wmic 输出有一个标题+末尾的额外行)

for /f "skip=1" %%p in ('wmic os get freephysicalmemory') do ( 
  set m=%%p
  goto :done
)
:done
echo free: %m%

free: 4948108

freevirtualmemory 也可用)

【讨论】:

当我在德国机器上运行此命令 (wmic os get freephysicalmemory) 时,我收到以下错误:U:\>wmic os get freephysicalmemory MOF-Datei(en) konnte(n) nicht registriert werden . Nur Mitglieder der Administratorgruppe können WMIC.EXE verwenden。 Ursache:Win32-Fehler: Zugriff verweigert 基本上对于德国机器,我认为应该用德语调用“freephysicalmemory”。 这意味着 wmic 只能由具有本地管理员权限的用户运行【参考方案5】:

这显示了用于批处理脚本和程序的可用内存:

>mem | find "total"
    655360 bytes total conventional memory
   1048576 bytes total contiguous extended memory

键入 MEM /?更多详情

编辑:回复新评论

>mem | find "avail"
    655360 bytes available to MS-DOS
         0 bytes available contiguous extended memory
    941056 bytes available XMS memory

>mem

    655360 bytes total conventional memory
    655360 bytes available to MS-DOS
    599312 largest executable program size

   1048576 bytes total contiguous extended memory
         0 bytes available contiguous extended memory
    941056 bytes available XMS memory
           MS-DOS resident in High Memory Area

【讨论】:

嘿,你为什么有599312 largest executable program size?我只有598832! :) 说真的,不过,我认为您可能应该将“for 批处理脚本和程序”行更改为“for 批处理脚本和 DOS 程序”(或者也许“...和一些遗留程序”)。 有些 Windows 7 机器有,有些没有这个命令。为什么会这样? @RolandPihlakas:我不知道。您可以在网上搜索诸如this one、this one、this one 或...之类的答案。 @Aacini 所以答案可能是“仅在 32 位系统中可用”。【参考方案6】:

WMIC 在 Windows 的 Home/Basic/Starter 版本中不可用。SYSTEMINFO 太慢。 MSHTA 的替代方案应该适用于每个 Windows 系统:

for  /f "usebackq" %%a in (`mshta ^"javascript^:close^(new ActiveXObject^(^'Scripting.FileSystemObject^'^).GetStandardStream^(1^).Write^(GetObject^(^'winmgmts:^'^).ExecQuery^(^'Select * from Win32_PerfFormattedData_PerfOS_Memory^'^).ItemIndex^(0^).AvailableBytes^)^);^"^|more`) do set free_mem=%%a
echo %free_mem%

还有另一种使用 dxdiag 的方法:

@echo off
taskkill /im dxdiag* /f
dxdiag /whql:off /t %cd%\dxdiag.txt
:ckeck_dx
tasklist | find "dxdiag" && ( w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:5  >nul 2>&1 & goto :ckeck_dx )

find "Available OS Memory:" "dxdiag.txt"
del /q /f "%~dp0dxdiag.txt"

【讨论】:

【参考方案7】:

我意识到这是一篇旧帖子,虽然当我使用“WMIC OS get FreePhysicalMemory”命令时,最后一个值是一个空行。所以,因为我知道第二行的值是我想要的,所以我只是使用 find 命令添加行号标志来获取第二行的值:

for /f "tokens=1,2 delims=]" %%p in ('WMIC OS get FreePhysicalMemory^|find /N /V ""') do (IF %%p equ [2 (set MEM=%%q))
echo.WMIC FreePhysicalMemory = %MEM%

【讨论】:

以上是关于如何通过批处理脚本检查可用内存(RAM)?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“内存不足”的问题

您如何在内存非常有限的嵌入式系统上处理大数据传输?

如何通过批处理脚本检查是否正在运行多个进程

怎么查看云服务器内存占用情况?

如何增加内存来处理超大 Lua 表

从汇编语言引导加载程序检查软盘是不是可用