PowerShellの詳細
第21.1章テクニック番号1.ハッシュテーブルを使用してカスタムオブジェクトを作成します。
独自のオブジェクトを作成する必要がある場合、またはさまざまなオブジェクトの情報を後続の出力のために1つに結合する必要がある場合に通常使用するトリックを始めましょう。 このパスを公式または推奨と呼びます。 コードを簡単に記述し、読み取りが容易になり、最終的には作業を高速化できるので、正確に使用します。
このメソッドを以下のリスト21.2に示します。
# , $os = Get-WmiObject –Class Win32_OperatingSystem –comp localhost $cs = Get-WmiObject –Class Win32_ComputerSystem –comp localhost $bios = Get-WmiObject –Class Win32_BIOS –comp localhost $proc = Get-WmiObject –Class Win32_Processor –comp localhost | Select –First 1 # . $props = @{OSVersion=$os.version Model=$cs.model Manufacturer=$cs.manufacturer BIOSSerial=$bios.serialnumber ComputerName=$os.CSName OSArchitecture=$os.osarchitecture ProcArchitecture=$proc.addresswidth} # $obj = New-Object –TypeName PSObject –Property $props Write-Output $obj
このコードを実行すると、次のような結果が得られます。
Manufacturer : Microsoft Corporation OSVersion : 6.3.9600 OSArchitecture : 64-bit BIOSSerial : 036685734653 ComputerName : RSSURFACEPRO2 Model : Surface Pro 2 ProcArchitecture : 64
なぜなら 出力には、4つ以上のプロパティを持つオブジェクトがあります。 満たしていただけますか
Write-Output $obj | ft
テーブルを取得します。 実際には、4つのオブジェクトの情報を組み合わせて1つのオブジェクトを作成したことに注意してください。 これを行うには、目的のプロパティ名を登録したハッシュテーブルを作成しました。それらの値は他のオブジェクトのプロパティ値です。 これは、ハッシュテーブルで次のことを示したものです。
Manufacturer=$cs.manufacturer
ハッシュテーブルエントリを1行に配置する場合は、各プロパティをセミコロンで区切る必要があります。 各プロパティを別々の行に配置する場合、セミコロンは必要ありません。コードを読んで編集する方がはるかに簡単です。
@記号が前に付いている括弧は、ハッシュテーブルが始まることを示します。 なぜなら テーブルは$ props変数にあり、新しいオブジェクトの-propertyパラメーターで簡単に渡すことができます。 PSObjectは 、この目的のために特別に提供されています。
このアプローチの利点は、その場でハッシュテーブルを簡単に構築し、そこから多くのユーザーオブジェクトを作成できることです。 出力オブジェクトでは、プロパティがテーブルで定義された順序と同じ順序ではないことに気付くかもしれません。 可能な解決策の1つは、カスタムオブジェクト(どの順序で表示するかなどを説明する特別なXMLファイル)のフォーマットを作成することです。または、powershell 3以降を使用する場合は、 orderedプロパティを使用できます。
$props = [ordered]@{ OSVersion=$os.version Model=$cs.model Manufacturer=$cs.manufacturer BIOSSerial=$bios.serialnumber ComputerName=$os.CSName OSArchitecture=$os.osarchitecture ProcArchitecture=$proc.addresswidth}
他のすべては同じです。 これで、オブジェクトのプロパティが書き込まれた順序で表示されます。 Get-Memberに $ objを渡すと、それがPS-CustomObjectであることがわかります。
注PowerShellは、既定ではハッシュテーブル内のアイテムの順序を追跡しません。 そのため、最終的な結論を見ると、そのプロパティは作成した順序ではありません。 PowerShell 3以降では、 [ordered]属性を使用してこれを修正できます。 これにより、順序付けされた辞書(別の名前はテーブルのハッシュ)が作成され、その中の要素の順序が維持されます。
自分から追加します。
実際、この方法は非常に便利です。読みやすく、編集しやすいです。 この方法は、PowerShellで広く使用されています-SMTPを介してメッセージを送信するためのパラメーターの作成から、関数またはスクリプトからの出力のために情報を単一のオブジェクトに結合するまで。