使用WSH和WMI实现定时记录系统CPU和内存使用率

WSH 是"Windows Scripting Host"的缩略形式, 其通用的中文译名为"Windows 脚本宿主", 为内嵌于 Windows 操作系统中的脚本语言工作环境. 我们也可以通过了解 WSH 的内置对象来探寻 WSH 可以实现的功能. WSH 共有 14 个内置对象, 它们各自有着明确分工.   对象的功能如下:

  1. 1. Wscript : 主要作用是提取命令行变量, 确定脚本文件名, 确定 WSH 执行文件名(wscript.exe 还是 cscript.exe), 确认 Host 版本信息, 创建, 关连及分离 COM 对象, 写入事件, 按程序结束一个脚本文件的运行, 向默认的输出设备(如对话框, 命令行)输出信息等.   
  2. 2. WshArguments : 主要作用是获取全部的命令行变量.   
  3. 3. WshNamed : 负责获取指定的命令行参数集.   
  4. 4. WshUnnamed : 负责获取未经指定的命令行参数集.   
  5. 5. WshNetwork : 主要作用是开放或关闭网络共享, 连接或断开网络打印机, 映射或取消网络中的共享, 获取当前登陆用户的信息.   
  6. 6. WshController : 创建一个远程脚本对象.   
  7. 7. WshRemote : 实现网络中对计算机系统的远程管理, 也可按计划对其它程序或脚本进行处理.   
  8. 8. WshRemote Error : 作用是当一个远程脚本(WshRemote 对象)因脚本错误而终止时, 获取可用的错误信息.   
  9. 9. WshShell : 主要负责程序的本地运行, 处理注册表项, 创建快捷方式, 获取系统文件夹信息, 处理环境变量等.   
  10. 10. WshShortcut : 主要用于按计划创建快捷方式.   
  11. 11. WshSpecialFolders : 用于获取任意一个 Windows 特殊文件夹的信息.   
  12. 12. WshURLShortcut : 用于按程序要求创建进入互联网资源的快捷方式.   
  13. 13. WshEnvironment : 用于获取任意的环境变量(如 WINDIR, PATH, 或 PROMPT).   
  14. 14. WshScriptExec : 用于确定一个脚本文件的运行状态及错误信息.  


       WSH 的正常工作的前提, 是你必须安装了微软 3.0 或更高版本的 IE, 因为 WSH 在工作时会调用 IE 中的 VBScript (*.vbs) 和 JScript (*.js) 解析引擎. WSH 的优点在于它使我们可以充分利用脚本来实现计算机工作的自动化. 但不可否认, 也正是它的这一特点, 使我们的系统又有了新的安全隐患. 许多计算机病毒制造者正在热衷于用脚本语言来编制病毒, 并利用 WSH 的支持功能, 让这些隐藏着病毒的脚本在网络中广为传播.

       WMI 是 "Windows Management Instrumentation" 的缩写, 即Windows管理规范. WMI有许多用途, 其中之一就是通过脚本编程实现管理自动化. 他是Windows 2K/XP管理系统的核心. 对于其他的Win32操作系统, WMI 是一个有用的插件. WMI 以 CIMOM 为基础, CIMOM即公共信息模型对象管理器 (Common Information Model Object Manager), 是一个描述操作系统构成单元的对象数据库, 为 MMC 和脚本程序提供了一个访问操作系统构成单元的公共接口. 有了WMI, 工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的 API.   你可以下载 WMI SDK , 并且可以下载 WMI Code Creator v1.0 来生成 WMI 操作脚本.

以下脚本将实现每隔1分钟记录CPU和内存的使用率到C盘的 "Usage.log" 文件中, 当然你也可以使用文本编辑器修改这些参数, 请将以下脚本为存为 "WriteUsage.vbs", 双击运行或加入系统启动项中均可, 需要中断执行请结束 "wscript.exe" 程序:

  1. '/************************************************************************/   
  2. '   
  3. ' FileName: WriteUsage.vbs   
  4. '   
  5. '    Author: Chinafish   
  6. '   
  7. '     Email: china_fish@163.com   
  8. '   
  9. ' Homepage: http://www.csinx.org   
  10. '   
  11. '      Desc: Write CPU & Memory usage   
  12. '   
  13. '/************************************************************************/   
  14.   
  15. on error resume next   
  16.   
  17. const TargetFile = "C:/Usage.log"   
  18.   
  19. Dim dwTotalMem, dwAvailMem   
  20.   
  21. '定时循环记录   
  22. do while true   
  23.   
  24.      const ForReading = 1   
  25.      const ForWriting = 2   
  26.   
  27.      Set fso = CreateObject( "Scripting.FileSystemObject" )   
  28.   
  29.      '没有文件先创建文件   
  30.      Set MyFile = fso.CreateTextFile(TargetFile, false)   
  31.      MyFile.Close   
  32.   
  33.      '打开创建的文件读出原来的内容   
  34.      Set MyFile = fso.OpenTextFile(TargetFile, ForReading)   
  35.      strContent = MyFile.ReadAll   
  36.      MyFile.Close   
  37.   
  38.      '先写原文件内容   
  39.      Set MyFile = fso.OpenTextFile(TargetFile, ForWriting)   
  40.   
  41.      '文件无内容时写文件头   
  42.      if strContent <> "" then   
  43.          MyFile.WriteLine(strContent)   
  44.      else   
  45.          MyFile.WriteLine( "/*Usage.log file write by Chinafish.*/" )   
  46.          MyFile.WriteBlankLines 1   
  47.      End if   
  48.   
  49.      '写开始时间   
  50.      MyFile.WriteLine( "程序启动时间: " & Now())   
  51.   
  52.      '本地电脑   
  53.      strComputer = "."   
  54.   
  55.      '连接到本地电脑   
  56.      Set objWMIService = GetObject( "winmgmts://" & strComputer & " /root/cimv2")   
  57.   
  58.      Set colItems = objWMIService.InstancesOf( "Win32_LogicalMemoryConfiguration" )   
  59.   
  60.      '总计物理内存   
  61.      For Each colItem In colItems   
  62.          dwTotalMem = CLng (colItem.TotalPhysicalMemory / 1024)   
  63.          MyFile.WriteLine( "总计物理内存: " & CLng (colItem.TotalPhysicalMemory / 1024) & "MB" )   
  64.      Next   
  65.   
  66.      '剩余内存   
  67.      Set colItems = objWMIService.ExecQuery( "Select * from Win32_PerfRawData_PerfOS_Memory" ,,48)   
  68.   
  69.      For Each objItem in colItems   
  70.          dwAvailMem = objItem.AvailableMBytes   
  71.          MyFile.WriteLine( "剩余物理内存: " & objItem.AvailableMBytes & "MB" )   
  72.      Next   
  73.   
  74.      '物理内存使用率(第一行精确到小数后2位, 第二行取整数)   
  75.      'MyFile.WriteLine("物理内存使用: " & CInt((1 - dwAvailMem/dwTotalMem)*100*100)/100 & "%")   
  76.      MyFile.WriteLine( "物理内存使用: " & CInt ((1 - dwAvailMem/dwTotalMem)*100) & "%" )   
  77.   
  78.      'CPU数和使用率   
  79.      Set colItems = objWMIService.ExecQuery( "Select * from Win32_Processor" ,,48)   
  80.      i = 0   
  81.   
  82.      For Each objItem in colItems   
  83.          MyFile.WriteLine( "CPU(" & i & ")使用率: " & objItem.LoadPercentage & "%" )   
  84.          i = i + 1   
  85.      Next   
  86.   
  87.      '写结束时间   
  88.      MyFile.WriteLine( "程序结束时间: " & Now())   
  89.      MyFile.Close   
  90.   
  91.      Set fso = Nothing   
  92.      Set MyFile = Nothing   
  93.   
  94.      '睡眠达到定时操作目的 参数是ms 1000是1秒   
  95.      WScript.Sleep 1000*60*1   
  96.   
  97. Loop   



以下为记录文件的效果:

 

/*Usage.log file write by Chinafish.*/   

  1.   
  2. 程序启动时间: 2008-6-10 16:57:43   
  3. 总计物理内存: 1535MB   
  4. 剩余物理内存: 881MB   
  5. 物理内存使用: 43%   
  6. CPU(0)使用率: 4%   
  7. CPU(1)使用率: 5%   
  8. 程序结束时间: 2008-6-10 16:57:45   
  9.   
  10. 程序启动时间: 2008-6-10 16:58:06   
  11. 总计物理内存: 1535MB   
  12. 剩余物理内存: 882MB   
  13. 物理内存使用: 43%   
  14. CPU(0)使用率: 10%   
  15. CPU(1)使用率: 7%   
  16. 程序结束时间: 2008-6-10 16:58:08  
posted @ 2011-04-06 09:25  kevinzhwl  阅读(571)  评论(0编辑  收藏  举报