Windows PowerShell:重談報表

文字報表可能既無趣又無益,何不使用 Windows PowerShell 來產生 HTML 報表呢?

唐 · 鐘斯

如果你要生成 Windows PowerShell 的報告,自包含的 HTML 報告是基於文本的報告比更好的選擇。 我的偏好來自 HTML 報告顯著更容易創建,比純文字,那麼多好看,仍然易於將附加到電子郵件和發送各地辦事處的事實。

幾個月前在此列,我給你一些提示生產 Windows PowerShell 的 HTML 報告。 這個月,讓我們看看如何加強這些報告。

讓我們只是跳轉到的代碼所示直圖 1。 應將它保存到指令檔中,如 C:\Report.ps1。

圖 1 加強這些 HTML Windows PowerShell 報告。

param([string]$computername) $b = Get-WmiObject -class Win32_ComputerSystem -ComputerName $computername | Select-Object -Property Manufacturer,Model, @{n='Memory(GB)';e={$_.TotalPhysicalMemory / 1GB -as [int]}}, @{n='Architecture';e={$_.SystemType}}, @{n='Processors';e={$_.NumberOfProcessors}} | ConvertTo-HTML -Fragment -As LIST -PreContent "<h2>Computer Hardware:</h2>" | Out-String $b += Get-WmiObject -class Win32_LogicalDisk -ComputerName $computername | Select-Object -Property @{n='DriveLetter';e={$_.DeviceID}}, @{n='Size(GB)';e={$_.Size / 1GB -as [int]}}, @{n='FreeSpace(GB)';e={$_.FreeSpace / 1GB -as [int]}} | ConvertTo-Html -Fragment -PreContent "<h2>Disks:</h2>" | Out-String $b += Get-WmiObject -class Win32_NetworkAdapter -ComputerName $computername | Where { $_.PhysicalAdapter } | Select-Object -Property MACAddress,AdapterType,DeviceID,Name | ConvertTo-Html -Fragment -PreContent "<h2>Physical Network Adapters:</h2>" | Out-String $head = @' \<style\> body { background-color:\#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } \</style\> '@ ConvertTo-HTML -head $head -PostContent $b -Body "<h1>Hardware Inventory for $ComputerName</h1>"

您將在其中運行報告圖 1 ,如下所示:

C:\Report –computername localhost > output.htm

這裡是我做了什麼 — — 你可以看到我使用 Get WmiObject 三個調用以檢索資訊的不同位。 每一次,我正在使用選擇物件選擇的屬性,我很感興趣。 在大多數情況下,我很創建自訂的列,所以像記憶體值顯示在一個更方便的度量單位。

每個月底,我用信仰 HTML 生成 HTML 片段。 這意味著我正準備生產與我所需屬性工作表所需的 HTML。

有訣竅,在這裡我花了很長時間才能弄清楚。 信仰 HTML 會產生一些古怪的念頭。 基本上,它將產生的字串的集合。 請嘗試喂,到最後的信仰 HTML,你將得到一個錯誤。

我工作圍繞問題使用 Out-String。 您可以看到這首三個街區,我哪裡輸送的 HTML 片段,每到 Out-String。 這可確保每個片段都是一群只是簡單的字串。 在創建每個 HTML 片段時,我將其追加到 $b 變數中。

您還會注意我用信仰 HTML 應用於這些 HTML 片段的節標頭。 通常情況下,信仰 HTML 作為純文字只是插入該"預內容"。 我已經添加了 <h2> HTML 標記,所以我節頁眉顯示為 HTML 中的標題。

後構建三個街區,我創建了一個嵌入式的 HTML 樣式表。 這是玩得到你想要的最後報告的外觀樣式。 檢查引用以階層式樣式表 (CSS) 語言更多關於樣式表。 只要你可以生活在相對簡單的造型,CSS 並不太複雜。

我的腳本的最後一行使用最後的信仰 HTML。 我將插入 HTML 頁標題的樣式表、 添加頁面整體標題和插入 $b 的內容。 在最後的 HTML 互聯網資源管理器中可以看到圖 2

After modifying the style sheets and converting output to HTML, this is the result

圖 2 後修改樣式表,並將輸出轉換為 HTML,這就是結果。

下麵是一些其他技巧,我想指出:

  1. 在我前兩個的選擇物件命令,請注意我已經用於雜湊表語法構造自訂輸出屬性。 在大多數情況下,我只構造美麗的輸出列的名稱。 在三種情況下,不過,我在做一些數學將轉換為千百萬位元組的位元組數。
  2. 在那裡我查詢 Win32_ComputerSystem 的第一個塊,我有信仰 HTML 格式的清單,而不是預設的表樣式 (–As 清單參數) 中的資訊。 輸出將只包括一個電腦系統,因為我以為清單看起來更好。
  3. 我不得不玩玩樣式表很有點讓它看起來像我想要。 CSS 是功能強大,但它可以略微調整獲得所需的確切的樣式。

您可能想知道為什麼腳本本身並不將最後的輸出重定向到檔,並會是一個好的問題。 我的腳本在 Windows PowerShell 管道,這意味著不能把它放到一個檔中,如果寧可做別的東西,葉 HTML。

例如,寫了一個自訂的函數,它可以讓我在 HTML 中的管道。 它構造從該內容的 HTML 格式的電子郵件。 讓我離開管道中的 HTML 的腳本,我可以管我發送郵件的功能,HTML 管 HTML 檔,或做任何其他我想用它做。 只輸出 HTML 留給我最多的選項。

重要的是,我並沒有用寫主機。 寫入主機將輸出到螢幕直接發送。 它給你沒有的選項將重定向到檔,把它變成一條電子郵件消息或別的什麼。

因為我用信仰 HTML,Windows PowerShell 正在做各項工作的實際格式設置我的輸出。 我沒有欺騙,要麼。 通過簡單地玩弄 CSS,我可以輕鬆地更改最終輸出的外觀。

您可以甚至插入螢幕上顯示的樣式表,並單獨的樣式表的列印輸出。 這樣一來,如果有人列印您的報告,它們可以具有的格式適當的印刷版。 要這樣做,只是建立你的樣式表,像圖 3

圖 3 不同的樣式表允許的螢幕上顯示和列印的輸出。

$head = @' \<style media='screen'> body { background-color:#dddddd; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; } </style> <style media='print'> // Put alternate hardcopy styles here </style> '@

這是因為它真的利用模式和技術的 Windows PowerShell 生成報表的好方法。 它很容易擴展以包括其他資訊的報告。 生成報表的腳本是遵循一個可能需要進行維護的人比較容易的。 報告的每個部分由單個 (儘管冗長) 的 Windows PowerShell 命令列,所以他們很容易就能重新排列、 調整其用途和重複使用。

Don Jones

**唐 · 鐘斯**是 Microsoft MVP 獎得主和"學習 Windows PowerShell 中月的午餐 」 (曼甯發佈 2011年),旨在説明成為有效的 Windows PowerShell 任何管理員一本書的作者。 鐘斯還提供公共和現場 Windows PowerShell 培訓。 與他聯繫通過他的網站 ConcentratedTech.com

相關的內容