Windows PowerShell: レポートについての再考

テキスト ベースのレポートは、退屈で情報量が少ないので、ぜひ、Windows PowerShell を使用して HTML 形式のレポートを作成してみてください。

Don Jones

Windows PowerShell を使用してレポートを生成する場合、テキスト ベースのレポートよりも自己完結型の HTML 形式のレポートを作成することをお勧めします。私が HTML 形式のレポートを好んでいるのは、作成しやすく、単純なテキストよりも見た目がよく、それでいて電子メールに簡単に添付して社内で閲覧できるからです。

数か月前の Windows PowerShell コラムでは、Windows PowerShell で HTML 形式のレポートを作成するヒントを紹介しました。今月のコラムでは、Windows PowerShell で作成した HTML 形式のレポートを拡張する方法を紹介しましょう。

早速、図 1 のコードを見てみましょう。このコードは、C:\Report.ps1 などのスクリプト ファイルに保存されている必要があります。

図 1 Windows PowerShell で生成した HTML 形式のレポートを拡張する

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-WimObject コマンドレットを 3 回呼び出して、さまざまな情報を取得しています。Get-WimObject コマンドレットを呼び出すたびに、Select-Object コマンドレットを使用して、必要なプロパティを選択しています。多くの場合、私はカスタマイズした列を使用して、メモリなどの値を、わかりやすい単位で表示されるようにしています。

Get-WmiObject コマンドレットの呼び出しの最後では、ConvertTo-HTML コマンドレットを使用して HTML フラグメントを生成しています。つまり、必要なプロパティの値を設定した表を生成するのに必要な HTML を取得しています。

ここでは、私が理解するのに時間がかかったコツがあります。ConvertTo-HTML コマンドレットでは、奇妙なものが生成されます。基本的に、このコマンドレットでは、一連の文字列が生成されますが、この文字列を ConvertTo-HTML コマンドレットに渡すとエラーになります。

この問題は、Out-String コマンドレットを使用して回避しました。この処理は、(HTML フラグメントを Out-String コマンドレットに渡している) 最初の 3 つのブロックで確認できます。この処理により、HTML フラグメントは単純な一連の文字列になります。HTML フラグメントを作成するたびに、作成したフラグメントを変数 $b の最後に追加します。

また、ConvertTo-HTML コマンドレットを使用して、HTML フラグメントにセクション ヘッダーを設定していることも確認できると思います。通常、ConvertTo-HTML コマンドレットでは、pre コンテンツをプレーン テキストとして挿入します。ここでは、HTML でセクション ヘッダーが見出しとして表示されるように <h2> という HTML タグを追加しました。

3 つのブロックを構成した後には、埋め込みの HTML スタイル シートを作成しています。ここでは、スタイルを操作して、最終レポートが希望どおりの表示になるように調整できます。スタイル シートの詳細については、「CSS リファレンス (英語)」を参照してください。比較的シンプルなスタイルを使用するのであれば、CSS は、それほど複雑なものではありません。

私が作成したスクリプトの最終行では、ConvertTo-HTML コマンドレットを使用しています。スタイル シートを HTML のページ ヘッダーに追加し、ページ全体の見出しを追加して、変数 $b に格納されているコンテンツを挿入しました。Internet Explorer で表示した最終的な HTML 形式のレポートは図 2 のとおりです。

スタイル シートを変更して出力を HTML 形式に変換した結果

図 2 スタイル シートを変更して出力を HTML 形式に変換した結果

他のコツをいくつか紹介しましょう。

  1. 最初の 2 つの Select-Object コマンドレットでは、カスタム出力プロパティの構築にハッシュテーブル構文を使用しています。多くの場合、出力列により見た目の良い名前を作成しているに過ぎません。ただし、この 3 つのブロックの場合は、バイト単位の値を GB 単位の値に変換する計算を行っています。
  2. Win32_ComputerSystem をクエリした最初のブロックでは、ConvertTo-HTML コマンドレット (–As LIST パラメーター) を使用して、既定の表形式ではなく、リスト形式で情報の書式設定を行っています。出力内容は 1 台のコンピューター システムに関するものなので、リストにした方がわかりやすいと判断した結果です。
  3. 私が希望する外観を実現するために、スタイル シートを操作する必要がありました。CSS は強力ですが、希望のスタイルを実現するには、調整が必要になります。

スクリプト自体が最終出力をファイルにリダイレクトしていないことを不思議に思っているかもしれませんが、よいところに気付きましたね。私が作成したスクリプトでは、Windows PowerShell のパイプラインに HTML を残しています。つまり、HTML について他の処理を実行したい場合は、HTML をファイルに格納する必要はありません。

たとえば、私は HTML をパイプするカスタム関数を作成しました。このカスタム関数では、HTML コンテンツから HTML 形式の電子メール メッセージを作成します。パイプラインに HTML を残しておくことで、HTML をメール送信関数やファイルにパイプするなど、HTML に対して好きな処理を施すことができます。単に HTML を出力することで、多数の選択肢を手に入れることができます。

何よりも Wirte-Host コマンドレットを使用していません。Write-Host コマンドレットでは、出力を画面に直接送信します。Wirte-Host コマンドレットを使用すると、出力内容をファイルにリダイレクトしたり、電子メール メッセージに変換したりするなどの選択肢はありません。

ConvertTo-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

Don Jones は、Microsoft MVP の受賞者で、『Learn Windows PowerShell in a Month of Lunches』(Manning Publications、2011 年) の著者でもあります。この書籍は、管理者が Windows PowerShell を効率的に使用できるようにすることを目的としています。また、一般ユーザーを対象にオンサイトの Windows PowerShell トレーニングも開催しています。Don に対するお問い合わせについては、彼の Web サイト (ConcentratedTech.com、英語) を参照してください。

関連コンテンツ