何ですか 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) попавший на вход командлету 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. Разберем пример создания экземпляра этого класса при помощи командлета New-Object с параметром -TypeName:

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 применяется и для работы с СОМ-компонентами. Их довольно много — от поставляемых с сервером сценариев 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

何ですか 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

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster