一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

將PowerShell導(dǎo)入到EXCEL

 wghbeyond 2011-03-15
在腳本編寫領(lǐng)域,如果您頭腦中抱定“經(jīng)試用正確”這一方法,就極易變得墨守成規(guī)。 很多時候,您切實希望看到的就是使用相同的方法獲取相同的結(jié)果。
以監(jiān)控為例,通過使用 Windows PowerShell,可輕鬆地獲取本地電腦上進程使用情況的出色快照。 利用 Get-Process cmdlet,您會得到條理清晰的輸出,如圖 1 所示。
圖 1 使用 Get-Process 查看本地進程
Get-Process cmdlet 的結(jié)果在大部分場合都非常有用。 它們顯示了處於打開狀態(tài)的控制碼數(shù)量、各種記憶體佔用視圖以及 CPU 使用率的快照。 當(dāng) Windows PowerShell 2.0 推出後,您甚至可以使用 Get-Process 和 –computername 參數(shù)從遠端電腦檢索這一概述資訊。 既然有這些好處,那麼究竟為什麼有人會不厭其煩地研究其他產(chǎn)品?
問題在於冗長的資料背後隱藏著大量細節(jié)。 資料往往隱藏的是更為重要的細節(jié)。 儘管將來 Windows PowerShell 2.0 會支援 –computername 參數(shù)聽起來令人振奮,但目前它對網(wǎng)路系統(tǒng)管理員而言還是海市蜃樓。 因此,我們不得不使用 Windows 管理規(guī)範(fàn) (WMI) 和 Win32_Process WMI 類來監(jiān)視遠端系統(tǒng)並以實用方式顯示資訊。 如果認為 Get-Process 的輸出內(nèi)容非常豐富,請再仔細看看 Win32_Process 的輸出(如圖 2 所示)。
圖 2 利用 WMI 查看進程
那麼,如果網(wǎng)路系統(tǒng)管理員需要的是易於閱讀的記憶體佔用量報告,這可憐的傢伙該怎麼辦呢?這正是您需要打破慣例思考、走出自己的圈子並轉(zhuǎn)用 Excel 實現(xiàn)自動操作的地方。 很可能您的電腦上已安裝了 Microsoft Office Excel。 可能您像我們一樣並非專家,但由於它是 Microsoft Office 系統(tǒng)的元件,所以也可以利用它。
自動化 Excel 有多難?實際上非常簡單,因為 Microsoft 已創(chuàng)建了專門用於處理 Excel 的自動化模型。 程式 ID 是 Excel.Application,它是一個 COM 物件。 創(chuàng)建 Excel.Application 物件的實例時,Excel 會預(yù)設(shè)啟動並運行,只是您看不見它。 但是,可使用 visible 屬性讓 Excel 顯示出來。
以下代碼顯示了如何創(chuàng)建 Excel.Application 物件、查詢 visible 屬性的狀態(tài),然後將 visible 屬性設(shè)為 true:
PS C:\> $excel = New-Object -ComObject Excel.Application
PS C:\> $excel.Visible
False
PS C:\> $excel.Visible = $true
然後,您會看到一個非常奇怪的 Excel 視圖,它看起來就像 Excel 應(yīng)用程式的一個外殼(如圖 3 所示)。 沒有工作簿、沒有試算表—只是光禿禿的 Excel。
圖 3 光禿禿的 Excel—沒有工作簿或試算表
我們需要將一個工作簿添加到應(yīng)用程式中。 為此,我們借助工作簿物件的 add 方法。 工作簿物件是從主 Excel.Application 物件進行訪問的,正如您在此看到的,我們將工作簿物件存儲在一個名為 $workbook 的變數(shù)中:
$workbook = $excel.Workbooks.add()
現(xiàn)在,需連接特定的試算表。 預(yù)設(shè)情況下,工作簿添加到 Excel 時,會向其中添加三個試算表。 這些試算表可通過數(shù)位進行標識。 在以下代碼行中,連接第一個試算表並將返回的試算表物件存儲在名為 $sheet 的變數(shù)中:
$sheet = $workbook.worksheets.Item(1)
現(xiàn)在,可將資料寫入該試算表。 Excel 試算表中的資訊存儲在儲存格中。 由於儲存格位於試算表之中,所以可使用 $sheet 變數(shù)中存儲的試算表物件訪問特定的儲存格。 具體方法是使用指代試算表中行和列的數(shù)位。 在 Excel 試算表中,行是數(shù)位而列是字母,這一點有些讓人迷惑。 但使用自動化模型時,行和列均為數(shù)字。 第一個數(shù)位是行,第二個數(shù)字是列。 只需對特定儲存格進行賦值即可寫入儲存格:
$sheet.cells.item(1,1) = "Test"
向 Excel.Application 物件添加一個工作簿並將資料添加到試算表中的儲存格後,Excel 工作簿將如 圖 4 所示。
圖 4 向儲存格添加值
瞭解這些內(nèi)容後,讓我們整理出有用的內(nèi)容。 從 WMI 獲取進程資訊集合,將每個進程的名稱和記憶體佔用量寫入 Excel 試算表,然後創(chuàng)建一個圖表來突出顯示所用記憶體。 這正是 WriteProcessInformationToExcel.ps1 的功能所在。 《TechNet 雜誌》網(wǎng)站上有完整的腳本。
腳本首先使用 Get-WmiObject cmdlet 檢索有關(guān)進程的資訊集合。 使用 Win32_Process WMI 類獲取該資訊,並將其存儲在 $processes 變數(shù)中:
$processes = Get-WmiObject -class Win32_Process
現(xiàn)在,創(chuàng)建 Excel.Application 物件的一個實例並將其存儲在變數(shù) $excel 中,然後顯示應(yīng)用程式並添加一個工作簿。 通常,決定執(zhí)行的任意 Excel 自動化都要完成以上步驟。 具體代碼如下:
$excel = new-object -comobject excel.application
$excel.visible = $true
$workbook = $excel.workbooks.add()
Excel 的一個不足是工作簿始終會創(chuàng)建三個試算表。 我們認為這一點非常浪費,因為我們僅使用一個試算表。 幸運的是,可利用自動化刪除多餘的試算表:使用工作表集合連接第三個試算表並調(diào)用 delete 方法。 執(zhí)行相同的操作刪除第二個試算表:
$workbook.workSheets.item(3).delete()
$workbook.WorkSheets.item(2).delete()
接下來,重命名剩餘的試算表。 這一點非常重要,因為如果決定使用 ActiveX 資料物件 (ADO) 來查詢 Excel 試算表,將在連接字串中使用此試算表名稱。 因此,要使代碼易讀且直觀,試算表應(yīng)具有邏輯名稱。 要重命名試算表,只需向特定試算表的 name 屬性賦一個值即可。 以下代碼將第一個試算表重命名為 "Processes":
$workbook.WorkSheets.item(1).Name = "Processes"
現(xiàn)在,需連接重命名後的試算表。 使用工作表物件的 Item 方法並將試算表的名稱指定給它:
$sheet = $workbook.WorkSheets.Item("Processes")
試算表的第一行將包含標頭資訊。 我們將繪製邊框並使屬性名稱顯示為粗體。 由於資料將從第二行開始,因此我們將值 2 賦給計數(shù)器變數(shù) $x:
接下來的四行代碼創(chuàng)建四個枚舉類型。 枚舉類型用於告訴 Excel 允許將哪些值填入特定的選項類型。 例如,xlLineStyle 枚舉用於確定所繪製線條的類型:雙線條、虛線等。 MSDN 上詳細介紹了這些 枚舉值 。
為使代碼更易於閱讀,針對將使用的每個枚舉類型創(chuàng)建一個快捷別名。 實際上,我們將把代表枚舉名稱的字串轉(zhuǎn)換成 [type]。 此技術(shù)實際是一個非常酷的竅門:
$lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type]
$colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type]
$borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type]
$chartType = "microsoft.office.interop.excel.xlChartType" -as [type]
現(xiàn)在需格式化第一行。 使字體為粗體,將線條定義為 xlDashDot,允許自動指定顏色,並將邊框?qū)挾仍O(shè)為中等粗細:
For($b = 1 ; $b -le 2 ; $b++)
{
 $sheet.cells.item(1,$b).font.bold = $true
 $sheet.cells.item(1,$b).borders.LineStyle = $lineStyle::xlDashDot
 $sheet.cells.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
 $sheet.cells.item(1,$b).borders.weight = $borderWeight::xlMedium
}
完成後,通過使用 item 方法選擇儲存格並指定行和列的座標,向第一行賦值。 接下來,使用直接賦值寫入列標題:
$sheet.cells.item(1,1) = "Name of Process"
$sheet.cells.item(1,2) = "Working Set Size"
現(xiàn)在,需將 WMI 查詢產(chǎn)生的 $processes 變數(shù)中存儲的進程資訊放入適當(dāng)?shù)膬Υ娓裰小?使用 foreach 語句遍歷進程資訊集合。 將變數(shù) $process 定義為集合枚舉器(預(yù)留位置),並選擇將名稱和 workingSetSize 屬性分別寫入第一列和第二列。
$x 變數(shù)將在此發(fā)揮作用。 從第二行開始,在遍歷進程集合的同時,遞增 $x 變數(shù)的值以便它始終指向集合中的當(dāng)前行。 通過以下代碼,即可對 $processes 進程資訊集合中存儲的所有資料進行整理分類:
Foreach($process in $processes)
{
 $sheet.cells.item($x, 1) = $process.name
 $sheet.cells.item($x,2) = $process.workingSetSize
 $x++
} #end foreach
填寫完 Excel 試算表後,我們打算調(diào)整列的大小以使儲存格與其中所存儲資料的尺寸相同。 為此,可通過指定要使用的列座標來創(chuàng)建一個範(fàn)圍;但是,也可以只使用試算表的 usedRange 屬性。 創(chuàng)建完範(fàn)圍物件後,選擇 EntireColumn 屬性並使用 AutoFit 方法調(diào)整列的大小。 由於該方法始終會返回資料,我們將結(jié)果傳送給 Out-Null cmdlet。 從而避免主控臺上佈滿了雜亂無用的資訊。 下麵是所用的代碼:
$range = $sheet.usedRange
$range.EntireColumn.AutoFit() | out-null
至此我們已經(jīng)完成了任務(wù),此時的試算表具有所有進程的名稱和記憶體工作集,相當(dāng)不錯。 但讓我們繼續(xù)創(chuàng)建一個圖表。 具體操作非常簡單。 使用工作簿的 charts 物件的 add 方法。 由於該方法還會返回我們並不想要看到的資訊,所以將結(jié)果傳給 Out-Null cmdlet,如下所示:
$workbook.charts.add() | out-null  
以上命令添加了一個直線圖。 如果想要定義另一類型的圖表,需使用一個圖表類型枚舉值。 為此,可使用一個 microsoft.office.interop.excel.xlChartType 枚舉值,如 xl3DPieExploded 類型。 毫無疑問,xl3DPieExploded 類型將創(chuàng)建一個分裂的立體圓形圖。 將這一枚舉類型賦給 ActiveChart 物件的 chartType 屬性。 然後,將圖表的資料來源指定為 $range 變數(shù)中定義的範(fàn)圍。 結(jié)果是線圖閃爍一下,然後 3D 圓形圖在螢?zāi)簧媳ㄩ_來。 以下是相關(guān)代碼:
$workbook.ActiveChart.chartType = $chartType::xl3DPieExploded
$workbook.ActiveChart.SetSourceData($range)
在玩耍時,我們想要旋轉(zhuǎn)圓形圖。 具體實現(xiàn)方法是使用 ActiveChart 物件的 rotation 屬性。 使用 for 語句以 15 為增量將其數(shù)量逐漸增加到 360。 360 是圓圈的度數(shù);圖表將以每次 15 度的增量旋轉(zhuǎn)一整圈。 實際視覺效果相當(dāng)酷。 以下是實現(xiàn)這一功能的代碼:
For($i = 1 ; $i -le 360 ; $i +=15)
{
 $workbook.ActiveChart.rotation = $i
}
最後需要做的一件事是保存試算表。 為此,使用 Test-Path cmdlet 查看試算表是否已存在。 如已存在,使用 Remove-Item cmdlet 刪除舊的試算表,然後將當(dāng)前的工作簿保存到 $strPath 變數(shù)中存儲的位置。 使用 Excel.Application 物件的 ActiveWorkbook 物件以及 SaveAs 方法保存工作簿。 如果並未保存有試算表的副本,使用 ActiveWorkbook 物件的 SaveAs 方法並直接保存:
IF(Test-Path $strPath)
  { 
   Remove-Item $strPath
   $Excel.ActiveWorkbook.SaveAs($strPath)
  }
ELSE
  {
   $Excel.ActiveWorkbook.SaveAs($strPath)
  }
運行腳本時,您將看到如 圖 5 所示的圖表。
圖 5 按進程分裂的圓形圖
試算表本身位於 Processes 選項卡。 圖 6 顯示了列標題、針對邊框選擇的點劃線樣式以及粗體列標題。 進程名稱和工作集大小屬性是我們顯示的兩列資料。
圖 6 完成後的試算表
正如您所看到的,通過使用 Excel.Application 自動化模型,即可利用這一功能豐富且強大的應(yīng)用程式的分析和圖表工具來處理伺服器的資料。 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    香蕉尹人视频在线精品| 不卡在线播放一区二区三区| 欧美大粗爽一区二区三区| 亚洲在线观看福利视频| 欧美韩国日本精品在线| 精品丝袜一区二区三区性色| 欧美一区二区口爆吞精| 精品推荐国产麻豆剧传媒| 欧美精品久久99九九| 亚洲第一区欧美日韩在线| 国产日韩欧美国产欧美日韩 | 91人人妻人人爽人人狠狠| 亚洲国产精品久久综合网| 色无极东京热男人的天堂| 中文字幕日韩一区二区不卡| 国产内射一级一片内射高清视频| 亚洲一区在线观看蜜桃| 免费精品国产日韩热久久| 国产又粗又猛又黄又爽视频免费| 国产毛片对白精品看片| 黄色国产自拍在线观看| 国产av熟女一区二区三区四区| 自拍偷拍一区二区三区| 欧美日韩国产欧美日韩| 好吊一区二区三区在线看| 欧美性猛交内射老熟妇| 国内胖女人做爰视频有没有| 韩日黄片在线免费观看| 色婷婷国产熟妇人妻露脸| 在线日韩欧美国产自拍| 亚洲做性视频在线播放| 在线免费国产一区二区三区| 亚洲精品国产美女久久久99| 日韩一级免费中文字幕视频| 午夜久久精品福利视频| 国产肥妇一区二区熟女精品| 欧美偷拍一区二区三区四区| 青青免费操手机在线视频| 中文字字幕在线中文乱码二区| 亚洲专区中文字幕视频| 久久99一本色道亚洲精品|