about_Object_Creation
簡単な説明
PowerShell でオブジェクトを作成する方法について説明します。
詳細な説明
PowerShell でオブジェクトを作成し、コマンドとスクリプトで作成したオブジェクトを使用できます。
オブジェクトを作成する方法は多数ありますが、この一覧は明確ではありません。
- New-Object: .NET Framework オブジェクトまたは COM オブジェクトのインスタンスを作成します。
- Import-Csv/ConvertFrom-CSV: 文字区切り値として定義された項目からカスタム オブジェクト (PSCustomObject) を作成します。
- ConvertFrom-Json: JavaScript Object Notation (JSON) で定義されたカスタム オブジェクトを作成します。
- ConvertFrom-StringData: キー値ペアとして定義されたカスタム オブジェクトを作成します。
- Add-Type:
New-Object
でインスタンス化できるクラスを PowerShell セッションで定義できます。 - New-Module: AsCustomObject パラメーターは、スクリプト ブロックを使用して定義するカスタム オブジェクトを作成します。
- メンバーの追加: 既存のオブジェクトにプロパティを追加します。
Add-Member
を使用して、[System.Int32]
などの単純な型からカスタム オブジェクトを作成できます。 - Select-Object: オブジェクトのプロパティを選択します。
Select-Object
を使用して、既にインスタンス化されているオブジェクトにカスタム プロパティと計算プロパティを作成できます。
この記事では、次の追加の方法について説明します。
- 静的な
new()
メソッドを使用して型のコンストラクターを呼び出す - プロパティ名とプロパティ値のハッシュ テーブルを型キャストする
Static new() メソッド
すべての .NET 型には、インスタンスをより簡単に構築できる new()
メソッドがあります。 また、特定の型に対して使用可能なすべてのコンストラクターを表示することもできます。
型のコンストラクターを表示するには、型名の後に new
メソッド名を指定し、 <ENTER>
キーを押します。
[System.Uri]::new
OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)
これで、適切なコンストラクターを指定して、 System.Uri を作成できます。
[System.Uri]::new("https://www.bing.com")
AbsolutePath : /
AbsoluteUri : https://www.bing.com/
LocalPath : /
Authority : www.bing.com
...
次のサンプルを使用して、インスタンス化するために現在読み込まれている .NET 型を確認できます。
[AppDomain]::CurrentDomain.GetAssemblies() |
ForEach-Object {
$_.GetExportedTypes() |
ForEach-Object { $_.FullName }
}
new()
メソッドを使用して作成されたオブジェクトは、PowerShell コマンドレットによって作成されるのと同じ型のオブジェクトと同じプロパティを持たない場合があります。 PowerShell コマンドレット、プロバイダー、拡張型システムでは、インスタンスに追加のプロパティを追加できます。
たとえば、PowerShell の FileSystem プロバイダーは、Get-Item
によって返される DirectoryInfo オブジェクトに 6 NoteProperty 値を追加します。
$PSDirInfo = Get-Item /
$PSDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
4 CodeProperty
13 Property
6 NoteProperty
1 ScriptProperty
18 Method
DirectoryInfoオブジェクトを直接作成する場合、これらの 6 つのNoteProperty値はありません。
$NewDirInfo = [System.IO.DirectoryInfo]::new('/')
$NewDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
4 CodeProperty
13 Property
1 ScriptProperty
18 Method
拡張型システムの詳細については、「 about_Types.ps1xml」を参照してください。
この機能は PowerShell 5.0 で追加されました
ハッシュ テーブルからオブジェクトを作成する
プロパティとプロパティ値のハッシュ テーブルからオブジェクトを作成できます。
構文は次のとおりです。
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
このメソッドは、パラメーターなしのコンストラクターを持つクラスでのみ機能します。 オブジェクトのプロパティは、パブリックで設定可能である必要があります。
この機能は PowerShell バージョン 3.0 で追加されました
ハッシュ テーブルからカスタム オブジェクトを作成する
カスタム オブジェクトは非常に便利で、ハッシュ テーブル メソッドを使用して簡単に作成できます。 PSCustomObject クラスは、この目的のために特別に設計されています。
カスタム オブジェクトは、関数またはスクリプトからカスタマイズされた出力を返す優れた方法です。 これは、他のコマンドに再フォーマットまたはパイプできない書式設定された出力を返すよりも便利です。
Test-Object function
のコマンドでは、いくつかの変数値を設定し、それらの値を使用してカスタム オブジェクトを作成します。 このオブジェクトは、 Update-Help
コマンドレットのヘルプ トピックの例セクションで使用されています。
function Test-Object {
$ModuleName = "PSScheduledJob"
$HelpCulture = "en-us"
$HelpVersion = "3.1.0.0"
[PSCustomObject]@{
"ModuleName"=$ModuleName
"UICulture"=$HelpCulture
"Version"=$HelpVersion
}
$ModuleName = "PSWorkflow"
$HelpCulture = "en-us"
$HelpVersion = "3.0.0.0"
[PSCustomObject]@{
"ModuleName"=$ModuleName
"UICulture"=$HelpCulture
"Version"=$HelpVersion
}
}
Test-Object
この関数の出力は、既定でテーブルとして書式設定されたカスタム オブジェクトのコレクションです。
ModuleName UICulture Version
--------- --------- -------
PSScheduledJob en-us 3.1.0.0
PSWorkflow en-us 3.0.0.0
ユーザーは、標準オブジェクトと同様に、カスタム オブジェクトのプロパティを管理できます。
(Test-Object).ModuleName
PSScheduledJob
PSWorkflow
PSObject 型オブジェクトは、メンバーがオブジェクトに追加された順序でメンバーのリストを保持します。 Hashtableオブジェクトはキーと値のペアの順序を保証しませんが、リテラルハッシュテーブルをキャストして[pscustomobject]
順序を維持します。
ハッシュテーブルはリテラルである必要があります。 ハッシュテーブルをかっこで囲む場合、またはハッシュテーブルを含む変数をキャストする場合、順序が保持される保証はありません。
$hash = @{
Name = "Server30"
System = "Server Core"
PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System Name PSVersion
------ ---- ---------
Server Core Server30 4.0
ハッシュ テーブルからカスタム以外のオブジェクトを作成する
ハッシュ テーブルを使用して、非カスタム クラスのオブジェクトを作成することもできます。 非カスタム クラスのオブジェクトを作成する場合は、名前空間修飾型名が必要ですが、初期 System 名前空間コンポーネントは省略できます。
たとえば、次のコマンドはセッション オプション オブジェクトを作成します。
[System.Management.Automation.Remoting.PSSessionOption]@{
IdleTimeout=43200000
SkipCnCheck=$True
}
ハッシュ テーブル機能の要件 、特にパラメーターなしのコンストラクターの要件により、多くの既存のクラスが不要になります。 ただし、ほとんどの PowerShell option クラスは、この機能と、 ProcessStartInfo クラスなどの非常に便利なクラスを使用するように設計されています。
[System.Diagnostics.ProcessStartInfo]@{
CreateNoWindow="$true"
Verb="run as"
}
Arguments :
ArgumentList : {}
CreateNoWindow : True
EnvironmentVariables : {OneDriveConsumer, PROCESSOR_ARCHITECTURE,
CommonProgramFiles(x86), APPDATA...}
Environment : {[OneDriveConsumer, C:\Users\user1\OneDrive],
[PROCESSOR_ARCHITECTURE, AMD64],
[CommonProgramFiles(x86),
C:\Program Files (x86)\Common Files],
[APPDATA, C:\Users\user1\AppData\Roaming]...}
RedirectStandardInput : False
RedirectStandardOutput : False
RedirectStandardError : False
...
パラメーター値を設定するときにハッシュ テーブル機能を使用することもできます。 たとえば、New-PSSession
の SessionOption パラメーターの値です。
コマンドレットにはハッシュ テーブルを指定できます。
New-PSSession -ComputerName Server01 -SessionOption @{
IdleTimeout=43200000
SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
Frequency="Daily"
At="15:00"
}
ジェネリック オブジェクト
PowerShell で汎用オブジェクトを作成することもできます。 ジェネリックは、格納または使用される 1 つ以上の型のプレースホルダー (型パラメーター) を持つクラス、構造体、インターフェイス、およびメソッドです。
次の例では、 Dictionary オブジェクトを作成します。
$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One 1
ジェネリックの詳細については、「.NET の Genericsを参照してください。
関連項目
PowerShell