照片美化那个软件最好:将PowerShell导入到EXCEL

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