zoukankan      html  css  js  c++  java
  • 使用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  
  • 相关阅读:
    Error: could not open `C:Program FilesJavajre6libi386jvm.cfg'
    异常:java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '/app/userInfoMaint/getProvince.do'
    解析Java反射
    Cause: java.sql.SQLException: 无效的列索引
    Internet Explorer 无法打开该 Internet 站点,请求的站点不可用或无法找到
    解决The JSP specification requires that an attribute name is preceded by whitespace问题
    pl/sql的to_char和to_date
    oracle 在xml中批量插入,批量修改及多组条件查询
    时间转换模板
    Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名
  • 原文地址:https://www.cnblogs.com/kevinzhwl/p/3878867.html
Copyright © 2011-2022 走看看