love0.com 爱网首页 爱网论坛 爱网商城 爱网相册 原创() 爱情域名 小工具 空间乱弹   管理我的空间 登录 注册  

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

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

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

程序代码

''''/************************************************************************/
''''
'''' FileName: WriteUsage.vbs
''''
''''   Author: Chinafish
''''
''''    Email: china_fish@163.com
''''
'''' Homepage: http://www.csinx.org
''''
''''     Desc: Write CPU & Memory usage
''''
''''/************************************************************************/

on error resume next

const TargetFile = "C:\Usage.log"

Dim dwTotalMem, dwAvailMem

''''定时循环记录
do while true

    const ForReading = 1
    const ForWriting = 2

    Set fso = CreateObject("Scripting.FileSystemObject")

    ''''没有文件先创建文件
    Set MyFile = fso.CreateTextFile(TargetFile, false)
    MyFile.Close

    ''''打开创建的文件读出原来的内容
    Set MyFile = fso.OpenTextFile(TargetFile, ForReading)
    strContent = MyFile.ReadAll
    MyFile.Close

    ''''先写原文件内容
    Set MyFile = fso.OpenTextFile(TargetFile, ForWriting)

    ''''文件无内容时写文件头
    if strContent <> "" then
        MyFile.WriteLine(strContent)
    else
        MyFile.WriteLine("/*Usage.log file write by Chinafish.*/")
        MyFile.WriteBlankLines 1
    End if

    ''''写开始时间
    MyFile.WriteLine("程序启动时间: " & Now())

    ''''本地电脑
    strComputer = "."

    ''''连接到本地电脑
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

    Set colItems = objWMIService.InstancesOf("Win32_LogicalMemoryConfiguration")

    ''''总计物理内存
    For Each colItem In colItems
        dwTotalMem = CLng(colItem.TotalPhysicalMemory / 1024)
        MyFile.WriteLine("总计物理内存: " & CLng(colItem.TotalPhysicalMemory / 1024) & "MB")
    Next

    ''''剩余内存
    Set colItems = objWMIService.Exec Query("Select * from Win32_PerfRawData_PerfOS_Memory",,48)

    For Each objItem in colItems
        dwAvailMem = objItem.AvailableMBytes
        MyFile.WriteLine("剩余物理内存: " & objItem.AvailableMBytes & "MB")
    Next

    ''''物理内存使用率(第一行精确到小数后2位, 第二行取整数)
    ''''MyFile.WriteLine("物理内存使用: " & CInt((1 - dwAvailMem/dwTotalMem)*100*100)/100 & "%")
    MyFile.WriteLine("物理内存使用: " & CInt((1 - dwAvailMem/dwTotalMem)*100) & "%")

    ''''CPU数和使用率
    Set colItems = objWMIService.Exec Query("Select * from Win32_Processor",,48)
    i = 0

    For Each objItem in colItems
        MyFile.WriteLine("CPU(" & i & ")使用率: " & objItem.LoadPercentage & "%")
        i = i + 1
    Next

    ''''写结束时间
    MyFile.WriteLine("程序结束时间: " & Now())
    MyFile.Close

    Set fso = Nothing
    Set MyFile = Nothing

    ''''睡眠达到定时操作目的 参数是ms 1000是1秒
    WScript.Sleep 1000*60*1

Loop


以下为记录文件的效果:
程序代码

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

程序启动时间: 2008-6-10 16:57:43
总计物理内存: 1535MB
剩余物理内存: 881MB
物理内存使用: 43%
CPU(0)使用率: 4%
CPU(1)使用率: 5%
程序结束时间: 2008-6-10 16:57:45

程序启动时间: 2008-6-10 16:58:06
总计物理内存: 1535MB
剩余物理内存: 882MB
物理内存使用: 43%
CPU(0)使用率: 10%
CPU(1)使用率: 7%
程序结束时间: 2008-6-10 16:58:08


添加到书签:
点击复制网址推荐给好友:
论坛相关帖子:
发表于:2008-7-6 14:27:30| 评论:2 | 查看次数:109
[2008-7-6 14:33:04]
学习
[2008-7-8 1:06:07]
学习。第一次见这个。。
发表评论
   用户: 密码:
内容: