PowerShell インタープリター ウィンドウでのコマンドのテキスト出力は、人間の認識に適した形式で情報を表示するための単なる方法です。 実は水曜日 オブジェクトを操作するには: コマンドレットと関数はそれらを入力として受け取り、 、対話型およびスクリプトで使用できる変数の型は .NET クラスに基づいています。 シリーズの XNUMX 番目の記事では、オブジェクトの操作についてさらに詳しく学習します。
目次:
PowerShell のオブジェクト
オブジェクトはデータ フィールド (プロパティ、イベントなど) とそれらを処理するためのメソッド (メソッド) のコレクションであることを思い出してください。 その構造は型によって指定されます。型は通常、統合 .NET Core プラットフォームで使用されるクラスに基づいています。 COM、CIM (WMI)、および ADSI オブジェクトを操作することもできます。 データに対してさまざまなアクションを実行するには、プロパティとメソッドが必要です。さらに、PowerShell では、オブジェクトを関数やコマンドレットに引数として渡し、その値を変数に割り当てることができます。 (コンベヤまたはパイプライン)。 パイプライン内の各コマンドは、その出力をオブジェクトごとに順番に次のコマンドに渡します。 処理には、コンパイルされたコマンドレットを使用することも、独自のコマンドレットを作成することもできます。 パイプライン内のオブジェクトに対してさまざまな操作 (フィルタリング、並べ替え、グループ化、さらには構造の変更) を実行します。 この形式でデータを送信することには重大な利点があります。受信チームはバイト ストリーム (テキスト) を解析する必要がなく、適切なプロパティとメソッドを呼び出すことで必要な情報をすべて簡単に取得できます。
オブジェクトの構造を表示する
たとえば、Get-Process コマンドレットを実行してみましょう。これにより、システムで実行されているプロセスに関する情報を取得できます。

返されたオブジェクトとそのメソッドのプロパティについては何も分からない、書式設定されたテキスト データが表示されます。 出力を微調整するには、オブジェクトの構造を調べる方法を学ぶ必要があります。Get-Member コマンドレットはこれに役立ちます。
Get-Process | Get-Member 
ここではすでに型と構造が表示されており、追加のパラメーターを使用すると、たとえば、入力に含まれるオブジェクトのプロパティのみを表示できます。
Get-Process | Get-Member -MemberType Propertyこの知識は、管理上の問題を対話的に解決したり、独自のスクリプトを作成したりする場合に必要になります。たとえば、Responding プロパティを使用してハングしたプロセスに関する情報を取得する場合などです。
オブジェクトのフィルタリング
PowerShell では、特定の条件を満たすオブジェクトをパイプライン経由で渡すことができます。
Where-Object { блок сценария }Результатом выполнения блока сценария в операторных скобках должно быть логические значение. Если оно истинно ($true) попавший на вход командлету Where-Object объект будет передан по конвейеру дальше, в противном случае (значение $false) он будет удален. Для примера выведем список остановленных служб Windows Server, т.е. таких, у которых свойство Status имеет значение «Stopped»:
Get-Service | Where-Object {$_.Status -eq "Stopped"} 
ここでもテキスト表現が示されていますが、パイプラインを通過するオブジェクトのタイプと内部構造を理解したい場合は、それほど難しくありません。
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member 
オブジェクトの並べ替え
オブジェクトをパイプライン処理する場合、多くの場合、オブジェクトを並べ替える必要があります。 Sort-Object コマンドレットには、プロパティの名前 (並べ替えキー) が渡され、その値の順に並べられたオブジェクトが返されます。 実行中のプロセスの出力を、費やした CPU 時間 (cpu プロパティ) ごとに簡単に並べ替えることができます。
Get-Process | Sort-Object –Property cpu-Property パラメーターは、Sort-Object コマンドレットを呼び出すときに省略できます。既定で使用されます。 逆ソートの場合は、-Descending パラメータを使用します。
Get-Process | Sort-Object cpu -Descending 
オブジェクトとそのパーツの選択
Select-Object コマンドレットを使用すると、-First パラメーターまたは -Last パラメーターを使用して、パイプラインの最初または最後で特定の数のオブジェクトを選択できます。 これを利用すると、単一のオブジェクトまたは特定のプロパティを選択したり、それらに基づいて新しいオブジェクトを作成したりできます。 簡単な例を使用して、コマンドレットがどのように機能するかを見てみましょう。
次のコマンドは、RAM の最大量を消費している 10 個のプロセスに関する情報を表示します (WS プロパティ)。
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 
パイプラインを通過するオブジェクトの特定のプロパティのみを選択し、それらに基づいて新しいプロパティを作成できます。
Get-Process | Select-Object ProcessName, Id -First 1パイプラインの操作の結果、新しいオブジェクトを受け取ります。その構造は、Get-Process コマンドレットによって返される構造とは異なります。 Get-Member を使用してこれを確認してみましょう。
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member 
Select-Object は、指定したフィールドのうち 1 つだけを持つ単一のオブジェクト (-First XNUMX) を返すことに注意してください。それらの値は、Get-Process コマンドレットによってパイプラインに渡された最初のオブジェクトからコピーされたものです。 PowerShell スクリプトでオブジェクトを作成する方法の XNUMX つは、Select-Object の使用に基づいています。
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType() 
Select-Object を使用すると、計算されたプロパティを次のように表現する必要があるオブジェクトに追加できます。 。 この場合、最初のキーの値はプロパティ名に対応し、XNUMX 番目のキーの値は現在のパイプライン要素のプロパティ値に対応します。
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} 
コンベアを通過するオブジェクトの構造を見てみましょう。
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member 
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. Разберем пример создания экземпляра этого класса при помощи командлета New-Object с параметром -TypeName:
New-Object -TypeName System.Diagnostics.EventLog 
特定のイベント ログを指定しなかったため、結果のクラスのインスタンスにはデータが含まれません。 これを変更するには、作成中に -ArgumentList パラメーターを使用して特別なコンストラクター メソッドを呼び出す必要があります。 アプリケーション ログにアクセスしたい場合は、文字列「Application」を引数としてコンストラクターに渡す必要があります。
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog 
コマンドの出力は $AppLog 変数に保存されたことに注意してください。 パイプラインは通常対話モードで使用されますが、スクリプトを作成するにはオブジェクトへの参照を維持する必要があることがよくあります。 さらに、コア .NET Core クラスは System 名前空間に含まれています。PowerShell はデフォルトでその中で指定された型を検索するため、System.Diagnostics.EventLog の代わりに Diagnostics.EventLog を記述することは非常に正しいことです。
ログを操作するには、適切な方法を使用できます。
$AppLog | Get-Member -MemberType Method 
アクセス権がある場合、Clear() メソッドによってクリアされるとします。
$AppLog.Clear()Командлет New-Object применяется и для работы с СОМ-компонентами. Их довольно много — от поставляемых с сервером сценариев Windows библиотек до приложений ActiveX, таких, например, как Internet Explorer. Чтобы создать СОМ-объект, требуется задать параметр -ComObject с программным идентификатора ProgId нужного класса:
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 
静的メンバーのみを表示するには、-Static パラメーターを指定して Get-Member を呼び出します (オブジェクト タイプに注意してください)。
[System.Environment] | Get-Member -Static 
静的プロパティとメソッドにアクセスするには、リテラルの後にピリオドの代わりに XNUMX つの連続したコロンを使用します。
[System.Environment]::OSVersionまたは
$test=[System.Math]::Sqrt(25)
$test
$test.GetType() 
PSカスタムオブジェクトと入力します
PowerShell で使用できる多数のデータ型の中でも、任意の構造を持つオブジェクトを格納するために設計された PSCustomObject について言及する価値があります。 New-Object コマンドレットを使用してこのようなオブジェクトを作成するのは古典的な方法と考えられていますが、面倒で時代遅れの方法です。
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
オブジェクトの構造を見てみましょう。
$object | Get-Member 
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()

このタイプのオブジェクトの欠点の XNUMX つは、プロパティの順序が変更される可能性があることです。 これを回避するには、 [owned] 属性を使用する必要があります。
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
オブジェクトを作成するには他にもオプションがあります。上記ではコマンドレットの使用について説明しました。 。 残っているのは、要素の追加と削除を理解することだけです。 前の例のオブジェクトに対してこれを行うのは非常に簡単です。
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member

Add-Member コマンドレットを使用すると、「-MemberType ScriptMethod」構造を使用して、以前に作成した $object にプロパティだけでなくメソッドも追加できます。
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
新しいメソッドのコードを保存するために、ScriptBlock 型の $ScriptBlock 変数を使用したことに注意してください。

プロパティを削除するには、対応するメソッドを使用します。
$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 
スコープについて忘れないでください。型名を文字列として参照したり、クラスが定義されているスクリプトまたはモジュールの外部で型リテラルを使用したりすることはできません。 この場合、関数はモジュールまたはスクリプトの外部でアクセスできるクラス インスタンス (オブジェクト) を返すことができます。
オブジェクトを作成した後、そのプロパティを入力します。
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

クラスの説明では、プロパティのタイプだけでなく、そのデフォルト値も指定していることに注意してください。
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 とサードパーティ ソフトウェア コンポーネントの統合の問題について取り上げます。 過去のパートは以下のリンクからご覧いただけます。
出所: habr.com
