第21章パヌト2-オブゞェクトの䜜成ずオブゞェクトを䜿甚したデヌタの出力 PowerShellの詳现-Don Jones、Richard Siddaway

PowerShellオブゞェクトを䜜成するさたざたな方法を次に瀺したす。 ヒントずコツが蚘茉されおいたす。 テキストが倧きすぎたす。 すべおの孊習者にずっおポシク。



読みやすさ、キヌストロヌクの数、プロパティの順序を維持するための芁件に加えお、これらすべおのメ゜ッドは基本的に同じこずを行いたす。 いく぀かの埮劙な違いテクニック1、ハッシュテヌブル。 通垞、最速の手法2は遅くなり、手法3は倧幅に遅くなりたす。



良いレビュヌで、 learn-powershell.net / 2010/09/19 / custom-powershell-objects-and-performanceは、MVP Boe Proxが䜜成したオブゞェクトの䜜成速床を枬定したした。 3぀の方法の速床を比范するず、Add-Member操䜜は10倍遅くなりたす。 したがっお、これはテクニック1のプラスです。Boeのようにテクニック4をテストしたこずはありたせんが、テスト4はテクニック1より10高速であるこずが瀺されおいたす。





翻蚳自䜓



21.2カスタムオブゞェクトを䜜成するための構文

PowerShellで䜕かを行う方法は垞にいく぀かあるずよく蚀われたしたが、これはカスタムオブゞェクトにも圓おはたりたす。 あなたが人生でそれらに出䌚う可胜性が高いので、私たちはあなたにすべおの䞻な方法を玹介したす。



第21.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]属性を䜿甚しおこれを修正できたす。 これにより、順序付けされた蟞曞別の名前はテヌブルのハッシュが䜜成され、その䞭の芁玠の順序が維持されたす。



21.2.2テクニック2. Select-Objectの䜿甚

このメ゜ッドは、 PowerShell v1で人気があり、今でも人々が䜿甚しおいたす。 読むのがずっず難しいので、私たちはそれが奜きではありたせん。 次のリストは、空のオブゞェクトを䜜成し、これらのプロパティの倀を曞き蟌む手法を瀺しおいたす



リスト21.3。 Select-Objectを䜿甚したオブゞェクトの䜜成

 #      $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 #    Select-Object $obj = 1 | Select-Object ComputerName,OSVersion,OSArchitecture, ProcArchitecture,Model,Manufacturer,BIOSSerial #   $obj.ComputerName = $os.CSName $obj.OSVersion = $os.version $obj.OSArchitecture = $os.osarchitecture $obj.ProcArchitecture = $proc.addresswidth $obj.BIOSSerial = $bios.serialnumber $obj.Model = $cs.model $obj.Manufacturer = $cs.manufacturer Write-Output $obj
      
      







リスト21.3では$ obj = 1が䜜成されおいるこずに泚意しおください;基本的に、倀1は決しお䜿甚されたせん。



ヒント空の文字列を初期化子ずしお䜿甚するず、倚くの䟋が衚瀺されたす。 $ obj = "" | 遞択.... これは、 $ objをオブゞェクトずしお定矩し、パむプラむンに䜕かをドロップしおSelect-Objectに移動し、すべおの䜜業を行うための単なる方法です。



このアプロヌチには欠点がありたす。 Get-Memberに$ objを枡し、結果を確認したす。



 PS C:\> $obj | Get-Member TypeName: Selected.System.Int32 Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() BIOSSerial NoteProperty System.String BIOSSerial= ComputerName NoteProperty System.String ComputerName= WIN-KNBA0R0TM23 Manufacturer NoteProperty System.String Manufacturer= VMware, Inc. Model NoteProperty System.String Model= VMware Virtual Platform OSArchitecture NoteProperty System.String OSArchitecture= 64-bit OSVersion NoteProperty System.String OSVersion= 6.1.7601 ProcArchitecture NoteProperty System.UInt16 ProcArchitecture=64
      
      





プロパティは甚意されおいたすが、TypeNameは問題を匕き起こしたり、混乱を招いたりする可胜性がありたす。すべおは、このオブゞェクトで䜕をしようずしおいるかによっお異なりたす。 この手法を避けるこずをお勧めしたす。



翻蚳挿入

ここで私はこれを意味したす

Get-Memberにリスト21.2の䟋を瀺したす-テヌブルでハッシュを䜜成したした

画像



次に、GMにリスト21.3の䟋を瀺したす-Select-Objectを䜿甚しお䜜成したす

画像





21.2.2テクニック3. Add-Memberの䜿甚

この方法は正匏ず芋なされたす。 私たちは圌が正匏なアプロヌチで人生で䜕が起こっおいるのかを瀺しおいるず信じおいたす。 これは最も蚈算コストが高く、最も遅いため、実際に䜿甚しおいる人を芋぀けるこずはほずんどありたせん。 これは、最も䞀般的なPowerShell v1アプロヌチです。 2぀のバリ゚ヌションがあり、最初のリストはコヌドです。



リスト21.4 Add-Memberを䜿甚したオブゞェクトの䜜成

 #      $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 #      $obj = New-Object –TypeName PSObject #       $obj | Add-Member NoteProperty ComputerName $os.CSName $obj | Add-Member NoteProperty OSVersion $os.version $obj | Add-Member NoteProperty OSArchitecture $os.osarchitecture $obj | Add-Member NoteProperty ProcArchitecture $proc.addresswidth $obj | Add-Member NoteProperty BIOSSerial $bios.serialnumber $obj | Add-Member NoteProperty Model $cs.model $obj | Add-Member NoteProperty Manufacturer $cs.manufacturer Write-Output $obj
      
      





PSObjectを䜜成し、䞀床に1぀のプロパティを远加したす。 静的な倀のみを含むNotePropertyを远加するたびに、メ゜ッドを呌び出す必芁がありたす。 コヌドを削枛するために、Add-Member䜍眮パラメヌタヌを䜿甚したした。 完党な構文を䜿甚するず、各Add-Memberステヌトメントは次のようになりたす。



 Add-Member -MemberType NoteProperty -Name ComputerName -Value $os.CSName
      
      





倚くのコヌドが刀明するこずがわかりたす。



このメ゜ッドのバリ゚ヌションは、Add-Memberコマンドの-PassThru リスト21.5では-Passず略されたす  パラメヌタヌを䜿甚するこずです 。 このパラメヌタヌは、倉曎されたオブゞェクトをパむプラむンに戻すので、次のコマンドなどに枡すこずができたす。



䟋を瀺したす



リスト21.4 -PassThruパラメヌタヌを指定したAdd-Memberを䜿甚したオブゞェクトの䜜成

 #      $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 #      $obj = New-Object –TypeName PSObject #   $obj | Add-Member NoteProperty ComputerName $os.CSName –pass | Add-Member NoteProperty OSVersion $os.version –pass | Add-Member NoteProperty OSArchitecture $os.osarchitecture –Pass | Add-Member NoteProperty ProcArchitecture $proc.addresswidth –pass | Add-Member NoteProperty BIOSSerial $bios.serialnumber –pass | Add-Member NoteProperty Model $cs.model –pass | Add-Member NoteProperty Manufacturer $cs.manufacturer Write-Output $obj
      
      







あなたは人生でこのアプロヌチに出くわすこずができたす。 実際、搟取の芳点から、これは䜕が起こっおいるのかがより明確であるため、これは重芁なテクニックです。 このアプロヌチは構文ラベルに埓っおいないため、段階的に簡単に分解できたす。



翻蚳者挿入

デバッグが簡単になりたす




21.2.4テクニック4.型宣蚀の䜿甚



これは手法1のバリ゚ヌションの1぀であり、PowerShell v3およびv4でのみ機胜したす。この方法はよりコンパクトです。 テヌブルの同じハッシュから始めたす。

 #      $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 $obj = [pscustomobject]@{ OSVersion=$os.version Model=$cs.model Manufacturer=$cs.manufacturer BIOSSerial=$bios.serialnumber ComputerName=$os.CSName OSArchitecture=$os.osarchitecture ProcArchitecture=$proc.addresswidth } Write-Output $obj
      
      







$ props倉数の入力を続けるこずができたす。このテクニックの秘trickは、オブゞェクトのプロパティの順序が[ordered]ディレクティブを䜿甚したかのように保持されるこずです



ヒント。 䜿甚するタむプはPSCustomObjectです。 .NETの甚語では、パラメヌタヌなしでPSObjectコンストラクタヌを䜿甚するため、このタむプを䜿甚する必芁がありたす。 PSCustomObjectの代わりにPSObjectを指定しおコヌドを短くしようずしないでください。目的の結果が埗られたせん。



以前のメ゜ッドでは、プロパティを远加する順序ずは異なる順序でプロパティが远加されるこずに気づいたかもしれたせん。 たずえば、テクニック1では、最初にComputer_Nameを远加したせんでしたが、リストの最初に衚瀺されたす。 心配しないでください。ほずんどの堎合、PowerShellは任意の順序でプロパティを操䜜したす。 テクニック4は、䜿甚する必芁がある堎合、プロパティの順序を保持したす。



21.2.5テクニック5.新しいクラスを䜜成する



あたり䜿甚されないテクニック。 コンベア凊理にいく぀かの利点がありたす。 高床なテクニックずしお評䟡できたすが、すべおのスキルが.NETを掘り䞋げたいずは限りたせん。 しかし、機䌚はオプションずしお利甚可胜です。



リスト21.7クラスを䜿甚したオブゞェクトの䜜成

 $source=@" public class MyObject { public string ComputerName {get; set;} public string Model {get; set;} public string Manufacturer {get; set;} public string BIOSSerial {get; set;} public string OSArchitecture {get; set;} public string OSVersion {get; set;} public string ProcArchitecture {get; set;} } "@ Add-Type -TypeDefinition $source -Language CSharpversion3 #    $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 MyObject –Property $props Write-Output $obj
      
      







リスト21.7は、Cクラス蚘述コヌドを含むレコヌドを䜜成するこずから始たりたす。 クラスにはMyObjずいう名前があり、倚くのクラスプロパティの説明を䜜成したす。 この䟋では、プロパティは文字列ずしお指定されおいたすが、タむプは混圚できたす。 たた、今埌プロパティ蚭定を蚘述する予定はありたせんが、クラス定矩ではGETおよびSETを蚘述する必芁がありたす。そうしないず、PowerShellが䟋倖をスロヌしたす。



Add-Typeはクラスのコンパむルに䜿甚され、その埌PSObjectの代わりに䜿甚できたす。 オブゞェクトのプロパティを蚭定するには、ここずリスト21.6に瀺す手法を䜿甚できたす。

 $obj = [MyObject]@{OSVersion=$os.version Model=$cs.model Manufacturer=$cs.manufacturer BIOSSerial=$bios.serialnumber ComputerName=$os.CSName OSArchitecture=$os.osarchitecture ProcArchitecture=$proc.addresswidth }
      
      





get-memberをテストしたしょう

 PS C:\> $obj | get-member TypeName: MyObject Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() BIOSSerial Property string BIOSSerial {get;set;} ComputerName Property string ComputerName {get;set;} Manufacturer Property string Manufacturer {get;set;} Model Property string Model {get;set;} OSArchitecture Property string OSArchitecture {get;set;} OSVersion Property string OSVersion {get;set;} ProcArchitecture Property string ProcArchitecture {get;set;}
      
      







これはかさばるだけでなく、利点もありたす。 プロパティを文字列ずしお宣蚀し、そこに数倀を曞き蟌もうずするず、゚ラヌメッセヌゞが生成されたす。



21.2.6違いは䜕ですか



読みやすさ、キヌストロヌクの数、プロパティの順序を維持するための芁件に加えお、これらのメ゜ッドはすべお本質的に同じこずを行いたす。



いく぀かの埮劙な違いテクニック1、ハッシュテヌブル。 通垞、最速で、特に耇数のオブゞェクトを操䜜する堎合、手法2は少し遅く、手法3ははるかに遅くなりたす。



良いレビュヌで、 learn-powershell.net / 2010/09/19 / custom-powershell-objects-and-performanceは、MVP Boe Proxが䜜成したオブゞェクトの䜜成速床を枬定したした。 3぀の方法の速床を比范するず、Add-Member操䜜は10倍遅くなりたす。 したがっお、これはテクニック1のプラスです。Boeのようにテクニック4をテストしたこずはありたせんが、テスト4はテクニック1より10高速であるこずが瀺されおいたす。



All Articles