Ruby win32ole 查看系統信息(windows)

require 'win32ole'

class winManage
def initialize
@winobj = WIN32OLE.connect("winmgmts://")
end

# 說明:獲取系統總物理內存,空閒內存方法
# TotalVisibleMemorySize : 系統有效內存大小; FreePhysicalMemroy:系統未佔用內存大小
# 結果:返回hash數組 
sysFreeMemory: 系統空閒內存
# sysUseMemory :系統已使用內存
# sysTotalMemory: 系統總物理內存
# sysUseRateMemory: 內存使用率
def getSysMemoryInfo()
memoryObj = @winobj.ExecQuery("select * from Win32_OperatingSystem")
memoryObj.each do |item|
  return { :sysFreeMemory =>item.FreePhysicalMemory.to_i/1024,
  :sysUseMemory => (item.TotalVisibleMemorySize.to_i - item.FreePhysicalMemory.to_i)/1024,
      :sysTotalMemory => item.TotalVisibleMemorySize.to_i/1024,
    :sysUseRateMemory => (((item.TotalVisibleMemorySize.to_i - item.FreePhysicalMemory.to_i).to_f/item.TotalVisibleMemorySize.to_i).to_f * 100).to_i
}
end
end

# 獲取系統CPU使用率
def getCpuUseRate
cpuObj = @winobj.ExecuQuery("select * from Win32_Processor")
cpuObj.each do |item|
retrun {:sysCpuUseRate => item.LoadPercentage}
end
end

# 說明:根據指定key和value查找進程,key爲findProcessName表示查詢線程名爲其對應的值
# 參數:args,hash數組,特別說明::findProcessName => 對應得值爲想查詢線程得名稱
# 原理說明: 每個進程可以通過CommandLine 及 Name等查詢值確定
# 結果:返回傳入條件查詢到的進程ID數組
def getProcessByKeys(args={})
queryCondition = ""
queryNameCondition = ""
args.each do |key, value|
if key.to_s != "findProcessName" 
(queryCondition == "")? (queryCondition += "where CommandLine like '%value%'"):(queryCondition += " and CommandLine like '%value%'") 
else
queryNameCondition += " and Name like '%value%'" 
end
end
processes = @winobj.ExecQuery("select * from Win32_process" + queryCondition + queryNameCondition)
processIds = []
processes.each do |process|
processIds << process.processID
end
return processIds
end

# 說明:監聽進程方法,當指定監聽的相關進程掛掉或超時情況時,分別對應做不同處理
# 參數:engineProcessId,int整數,待監聽進程ID整數,timeOut:監聽超時時間
# 結果:execFlag:0 進程超時,1 進程正常結束 
def processMonitor(engineProcessId, timeOut)
sleep 5 #休眠5秒,防止被監聽進程還未啓動
execFlag = 0
timeCount = 1
while true
timeCount += 2
if timeCount >= timeOut
execFlag = 0
break
end
processes = @winobj.ExecQuery("select * from win32_process where ProcessID = #{engineProcessID}")
processIsExist = false
processes.each do |process|
processIsExist = true
end
if processIsExist
sleep 2
else
execFlag = 1
break
end
end
return execFlag
end

# 說明:根據傳入得進程ID殺死進程
# 參數:processId : 待kill進程ID,int,必選
# 結果:無返回結果
def killProcessById(processId)
processes = @winobj.ExecQuery("select * from win32_process where ProcessID = #{processId}")
processes.each do |process|
process.terminate()
end
end
end

















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章