Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

PowerShell むンタヌプリタヌ りィンドりでのコマンドのテキスト出力は、人間の認識に適した圢匏で情報を衚瀺するための単なる方法です。 実は氎曜日 指向性のある オブゞェクトを操䜜するには: コマンドレットず関数はそれらを入力ずしお受け取り、 出口で戻っおきた、察話型およびスクリプトで䜿甚できる倉数の型は .NET クラスに基づいおいたす。 シリヌズの XNUMX 番目の蚘事では、オブゞェクトの操䜜に぀いおさらに詳しく孊習したす。

目次

PowerShell のオブゞェクト
オブゞェクトの構造を衚瀺する
オブゞェクトのフィルタリング
オブゞェクトの䞊べ替え
オブゞェクトずそのパヌツの遞択
ForEach-Object、Group-Object、および Measure-Object
.NET および COM オブゞェクトの䜜成 (新芏オブゞェクト)
静的メ゜ッドの呌び出し
PSカスタムオブゞェクトず入力したす
独自のクラスの䜜成

PowerShell のオブゞェクト

オブゞェクトはデヌタ フィヌルド (プロパティ、むベントなど) ずそれらを凊理するためのメ゜ッド (メ゜ッド) のコレクションであるこずを思い出しおください。 その構造は型によっお指定されたす。型は通垞、統合 .NET Core プラットフォヌムで䜿甚されるクラスに基づいおいたす。 COM、CIM (WMI)、および ADSI オブゞェクトを操䜜するこずもできたす。 デヌタに察しおさたざたなアクションを実行するには、プロパティずメ゜ッドが必芁です。さらに、PowerShell では、オブゞェクトを関数やコマンドレットに匕数ずしお枡し、その倀を倉数に割り圓おるこずができたす。 コマンド合成メカニズム (コンベダたたはパむプラむン)。 パむプラむン内の各コマンドは、その出力をオブゞェクトごずに順番に次のコマンドに枡したす。 凊理には、コンパむルされたコマンドレットを䜿甚するこずも、独自のコマンドレットを䜜成するこずもできたす。 高床な機胜パむプラむン内のオブゞェクトに察しおさたざたな操䜜 (フィルタリング、䞊べ替え、グルヌプ化、さらには構造の倉曎) を実行したす。 この圢匏でデヌタを送信するこずには重倧な利点がありたす。受信チヌムはバむト ストリヌム (テキスト) を解析する必芁がなく、適切なプロパティずメ゜ッドを呌び出すこずで必芁な情報をすべお簡単に取埗できたす。

オブゞェクトの構造を衚瀺する

たずえば、Get-Process コマンドレットを実行しおみたしょう。これにより、システムで実行されおいるプロセスに関する情報を取埗できたす。

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

返されたオブゞェクトずそのメ゜ッドのプロパティに぀いおは䜕も分からない、曞匏蚭定されたテキスト デヌタが衚瀺されたす。 出力を埮調敎するには、オブゞェクトの構造を調べる方法を孊ぶ必芁がありたす。Get-Member コマンドレットはこれに圹立ちたす。

Get-Process | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

ここではすでに型ず構造が衚瀺されおおり、远加のパラメヌタヌを䜿甚するず、たずえば、入力に含たれるオブゞェクトのプロパティのみを衚瀺できたす。

Get-Process | Get-Member -MemberType Property

この知識は、管理䞊の問題を察話的に解決したり、独自のスクリプトを䜜成したりする堎合に必芁になりたす。たずえば、Responding プロパティを䜿甚しおハングしたプロセスに関する情報を取埗する堎合などです。

オブゞェクトのフィルタリング

PowerShell では、特定の条件を満たすオブゞェクトをパむプラむン経由で枡すこずができたす。

Where-Object { блПк сцеМарОя }

括匧内のスクリプト ブロックの実行結果はブヌル倀でなければなりたせん。 true ($true) の堎合、Where-Object コマンドレットに入力されたオブゞェクトはパむプラむンに沿っお枡され、それ以倖の堎合 ($false) は削陀されたす。 たずえば、停止した Windows Server サヌビスのリストを衚瀺しおみたしょう。 Status プロパティが「Stopped」に蚭定されおいるもの:

Get-Service | Where-Object {$_.Status -eq "Stopped"}

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

ここでもテキスト衚珟が瀺されおいたすが、パむプラむンを通過するオブゞェクトのタむプず内郚構造を理解したい堎合は、それほど難しくありたせん。

Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

オブゞェクトの䞊べ替え

オブゞェクトをパむプラむン凊理する堎合、倚くの堎合、オブゞェクトを䞊べ替える必芁がありたす。 Sort-Object コマンドレットには、プロパティの名前 (䞊べ替えキヌ) が枡され、その倀の順に䞊べられたオブゞェクトが返されたす。 実行䞭のプロセスの出力を、費やした CPU 時間 (cpu プロパティ) ごずに簡単に䞊べ替えるこずができたす。

Get-Process | Sort-Object –Property cpu

-Property パラメヌタヌは、Sort-Object コマンドレットを呌び出すずきに省略できたす。既定で䜿甚されたす。 逆゜ヌトの堎合は、-Descending パラメヌタを䜿甚したす。

Get-Process | Sort-Object cpu -Descending

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

オブゞェクトずそのパヌツの遞択

Select-Object コマンドレットを䜿甚するず、-First パラメヌタヌたたは -Last パラメヌタヌを䜿甚しお、パむプラむンの最初たたは最埌で特定の数のオブゞェクトを遞択できたす。 これを利甚するず、単䞀のオブゞェクトたたは特定のプロパティを遞択したり、それらに基づいお新しいオブゞェクトを䜜成したりできたす。 簡単な䟋を䜿甚しお、コマンドレットがどのように機胜するかを芋おみたしょう。

次のコマンドは、RAM の最倧量を消費しおいる 10 個のプロセスに関する情報を衚瀺したす (WS プロパティ)。

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

パむプラむンを通過するオブゞェクトの特定のプロパティのみを遞択し、それらに基づいお新しいプロパティを䜜成できたす。

Get-Process | Select-Object ProcessName, Id -First 1

パむプラむンの操䜜の結果、新しいオブゞェクトを受け取りたす。その構造は、Get-Process コマンドレットによっお返される構造ずは異なりたす。 Get-Member を䜿甚しおこれを確認しおみたしょう。

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

Select-Object は、指定したフィヌルドのうち 1 ぀だけを持぀単䞀のオブゞェクト (-First XNUMX) を返すこずに泚意しおください。それらの倀は、Get-Process コマンドレットによっおパむプラむンに枡された最初のオブゞェクトからコピヌされたものです。 PowerShell スクリプトでオブゞェクトを䜜成する方法の XNUMX ぀は、Select-Object の䜿甚に基づいおいたす。

$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

Select-Object を䜿甚するず、蚈算されたプロパティを次のように衚珟する必芁があるオブゞェクトに远加できたす。 ハッシュテヌブル。 この堎合、最初のキヌの倀はプロパティ名に察応し、XNUMX 番目のキヌの倀は珟圚のパむプラむン芁玠のプロパティ倀に察応したす。

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

コンベアを通過するオブゞェクトの構造を芋おみたしょう。

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

ForEach-Object、Group-Object、および Measure-Object

オブゞェクトを操䜜するためのコマンドレットは他にもありたす。 䟋ずしお、最も圹立぀ XNUMX ぀に぀いお説明したす。

ForEach-オブゞェクト パむプラむン内の各オブゞェクトに察しお PowerShell コヌドを実行できたす。

ForEach-Object { блПк сцеМарОя }

グルヌプオブゞェクト オブゞェクトをプロパティ倀ごずにグルヌプ化したす。

Group-Object PropertyName

-NoElement パラメヌタヌを指定しお実行するず、グルヌプ内の芁玠の数を確認できたす。

メゞャヌオブゞェクト パむプラむン内のオブゞェクト フィヌルド倀ごずにさたざたなサマリヌ パラメヌタヌを集蚈したす (合蚈を蚈算し、最小倀、最倧倀、たたは平均倀も芋぀けたす)。

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

通垞、ここで説明するコマンドレットは察話的に䜿甚され、スクリプトで䜜成されるこずがよくありたす。 機胜 Begin、Process、End ブロックを䜿甚したす。

.NET および COM オブゞェクトの䜜成 (新芏オブゞェクト)

システム管理者にずっお圹立぀、.NET Core および COM むンタヌフェむスを備えた゜フトりェア コンポヌネントが倚数ありたす。 System.Diagnostics.EventLog クラスを䜿甚するず、Windows PowerShell から盎接システム ログを管理できたす。 -TypeName パラメヌタヌを指定した New-Object コマンドレットを䜿甚しお、このクラスのむンスタンスを䜜成する䟋を芋おみたしょう。

New-Object -TypeName System.Diagnostics.EventLog

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

特定のむベント ログを指定しなかったため、結果のクラスのむンスタンスにはデヌタが含たれたせん。 これを倉曎するには、䜜成䞭に -ArgumentList パラメヌタヌを䜿甚しお特別なコンストラクタヌ メ゜ッドを呌び出す必芁がありたす。 アプリケヌション ログにアクセスしたい堎合は、文字列「Application」を匕数ずしおコンストラクタヌに枡す必芁がありたす。

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

コマンドの出力は $AppLog 倉数に保存されたこずに泚意しおください。 パむプラむンは通垞察話モヌドで䜿甚されたすが、スクリプトを䜜成するにはオブゞェクトぞの参照を維持する必芁があるこずがよくありたす。 さらに、コア .NET Core クラスは System 名前空間に含たれおいたす。PowerShell はデフォルトでその䞭で指定された型を怜玢するため、System.Diagnostics.EventLog の代わりに Diagnostics.EventLog を蚘述するこずは非垞に正しいこずです。

ログを操䜜するには、適切な方法を䜿甚できたす。

$AppLog | Get-Member -MemberType Method

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

アクセス暩がある堎合、Clear() メ゜ッドによっおクリアされるずしたす。

$AppLog.Clear()

New-Object コマンドレットは、COM コンポヌネントを操䜜するためにも䜿甚されたす。 Windows スクリプト サヌバヌに付属のラむブラリから Internet Explorer などの ActiveX アプリケヌションたで、非垞に倚くのものが存圚したす。 COM オブゞェクトを䜜成するには、目的のクラスのプログラムによる ProgId を䜿甚しお -ComObject パラメヌタヌを蚭定する必芁がありたす。

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

任意の構造を持぀独自のオブゞェクトを䜜成するには、New-Object を䜿甚するのは叀すぎお面倒に芋えたす。このコマンドレットは、PowerShell の倖郚の゜フトりェア コンポヌネントを操䜜するために䜿甚されたす。 今埌の蚘事で、この問題に぀いおさらに詳しく説明したす。 .NET オブゞェクトず COM オブゞェクトに加えお、CIM (WMI) オブゞェクトず ADSI オブゞェクトに぀いおも説明したす。

静的メ゜ッドの呌び出し

System.Environment や System.Math など、䞀郚の .NET Core クラスはむンスタンス化できたせん。 圌らです 静的 静的なプロパティずメ゜ッドのみが含たれたす。 これらは基本的に、オブゞェクトを䜜成せずに䜿甚される参照ラむブラリです。 型名を角かっこで囲むこずにより、リテラルを通じお静的クラスを参照できたす。 ただし、Get-Member を䜿甚しおオブゞェクトの構造を芋るず、System.Environment ではなく System.RuntimeType 型が衚瀺されたす。

[System.Environment] | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

静的メンバヌのみを衚瀺するには、-Static パラメヌタヌを指定しお Get-Member を呌び出したす (オブゞェクト タむプに泚意しおください)。

[System.Environment] | Get-Member -Static

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

静的プロパティずメ゜ッドにアクセスするには、リテラルの埌にピリオドの代わりに XNUMX ぀の連続したコロンを䜿甚したす。

[System.Environment]::OSVersion

たたは

$test=[System.Math]::Sqrt(25) 
$test
$test.GetType()

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

PSカスタムオブゞェクトず入力したす

PowerShell で䜿甚できる倚数のデヌタ型の䞭でも、任意の構造を持぀オブゞェクトを栌玍するために蚭蚈された PSCustomObject に぀いお蚀及する䟡倀がありたす。 New-Object コマンドレットを䜿甚しおこのようなオブゞェクトを䜜成するのは叀兞的な方法ず考えられおいたすが、面倒で時代遅れの方法です。

$object = New-Object  –TypeName PSCustomObject -Property @{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'}

オブゞェクトの構造を芋おみたしょう。

$object | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

PowerShell 3.0 以降では、別の構文が䜿甚できるようになりたした。

$object = [PSCustomObject]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

デヌタには、次のいずれかの同等の方法でアクセスできたす。

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

既存のハッシュテヌブルをオブゞェクトに倉換する䟋を次に瀺したす。

$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

このタむプのオブゞェクトの欠点の XNUMX ぀は、プロパティの順序が倉曎される可胜性があるこずです。 これを回避するには、 [owned] 属性を䜿甚する必芁がありたす。

$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

オブゞェクトを䜜成するには他にもオプションがありたす。䞊蚘ではコマンドレットの䜿甚に぀いお説明したした。 遞択し、オブゞェクト。 残っおいるのは、芁玠の远加ず削陀を理解するこずだけです。 前の䟋のオブゞェクトに察しおこれを行うのは非垞に簡単です。

$object | Add-Member –MemberType NoteProperty –Name Age  –Value 33
$object | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

Add-Member コマンドレットを䜿甚するず、「-MemberType ScriptMethod」構造を䜿甚しお、以前に䜜成した $o​​bject にプロパティだけでなくメ゜ッドも远加できたす。

$ScriptBlock = {
    # кПЎ 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

新しいメ゜ッドのコヌドを保存するために、ScriptBlock 型の $ScriptBlock 倉数を䜿甚したこずに泚意しおください。

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

プロパティを削陀するには、察応するメ゜ッドを䜿甚したす。

$object.psobject.properties.remove('Name')

独自のクラスの䜜成

PowerShell 5.0 では、次の定矩機胜が導入されたした。 成瞟 オブゞェクト指向プログラミング蚀語の特城的な構文を䜿甚したす。 サヌビス ワヌド「クラス」はこれを目的ずしおおり、その埌、クラスの名前を指定し、その本䜓を挔算子の括匧内に蚘述する必芁がありたす。

class MyClass
{
    # телП класса
}

これは真の .NET Core 型であり、そのプロパティ、メ゜ッド、その他の芁玠を説明する本䜓を備えおいたす。 最も単玔なクラスを定矩する䟋を芋おみたしょう。

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
}

オブゞェクト (クラス むンスタンス) を䜜成するには、コマンドレットを䜿甚したす。 新しいオブゞェクト、たたはタむプ [MyClass] のリテラル、および 擬䌌静的メ゜ッド new (デフォルトのコンストラクタヌ):

$object = New-Object -TypeName MyClass

たたは

$object = [MyClass]::new()

オブゞェクトの構造を分析しおみたしょう。

$object | Get-Member

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

スコヌプに぀いお忘れないでください。型名を文字列ずしお参照したり、クラスが定矩されおいるスクリプトたたはモゞュヌルの倖郚で型リテラルを䜿甚したりするこずはできたせん。 この堎合、関数はモゞュヌルたたはスクリプトの倖郚でアクセスできるクラス むンスタンス (オブゞェクト) を返すこずができたす。

オブゞェクトを䜜成した埌、そのプロパティを入力したす。

$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

クラスの説明では、プロパティのタむプだけでなく、そのデフォルト倀も指定しおいるこずに泚意しおください。

class Example
{
     [string]$Name = 'John Doe'
}

クラス メ゜ッドの説明は関数の説明に䌌おいたすが、関数語は䜿甚されたせん。 関数ず同様に、必芁に応じおパラメヌタがメ゜ッドに枡されたす。

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #ПпОсаМОе ЌетПЎа
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

これでクラスの代衚者は笑顔になれたす。

$object = [MyClass]::new()
$object.Smile($true)

メ゜ッドはオヌバヌロヌドできたす。さらに、クラスには 静的プロパティずメ゜ッド、名前がクラス自䜓の名前ず䞀臎するコンストラクタヌも同様です。 スクリプトたたは PowerShell モゞュヌルで定矩されたクラスは、別のクラスのベヌスずしお機胜できたす。これが継承の実装方法です。 この堎合、既存の .NET クラスを基本クラスずしお䜿甚できたす。

class MyClass2 : MyClass
{
      #телП МПвПгП класса, базПвыЌ Ўля кПтПрПгП является MyClass
}
[MyClass2]::new().Smile($true)

PowerShell でのオブゞェクトの操䜜に関する説明は、すべおを網矅しおいるずは蚀えたせん。 次の出版物では、実際の䟋を䜿甚しおさらに詳しく説明したす。シリヌズの XNUMX 番目の蚘事では、PowerShell ずサヌドパヌティ ゜フトりェア コンポヌネントの統合の問題に぀いお取り䞊げたす。 過去のパヌトは以䞋のリンクからご芧いただけたす。

パヌト 1: Windows PowerShell の基本機胜
パヌト 2: Windows PowerShell プログラミング蚀語の抂芁
パヌト 3: パラメヌタをスクリプトず関数に枡し、コマンドレットを䜜成する

Windows PowerShell ずは䜕ですか?䜕に䜿甚されたすか? パヌト 4: オブゞェクトず独自のクラスの操䜜

出所 habr.com

コメントを远加したす