about_Object_Creation
簡単な説明
PowerShell でオブジェクトを作成する方法について説明します。
詳細な説明
PowerShell でオブジェクトを作成し、コマンドとスクリプトで作成したオブジェクトを使用できます。
オブジェクトを作成する方法は多数ありますが、この一覧は明確ではありません。
- New-Object: .NET Framework オブジェクトまたは COM オブジェクトのインスタンスを作成します。
- Import-Csv / ConvertFrom-CSV: 文字区切り値として定義された項目からカスタム オブジェクト (PSCustomObject) を作成します。
- ConvertFrom-Json: JavaScript Object Notation (JSON) で定義されたカスタム オブジェクトを作成します。
- ConvertFrom-String: FlashExtract の上に構築され、
ConvertFrom-String
構造化された文字列データからカスタム オブジェクトを作成します。 このトピックでは、これらの各方法について説明します。 - ConvertFrom-StringData: キー値ペアとして定義されたカスタム オブジェクトを作成します。
- Add-Type: でインスタンス化できるクラスを PowerShell セッションで
New-Object
定義できます。 - New-Module: AsCustomObject パラメーターは、スクリプト ブロックを使用して定義するカスタム オブジェクトを作成します。
- Add-Member: 既存のオブジェクトにプロパティを追加します。 次のような
[System.Int32]
単純な型からカスタム オブジェクトを作成するために使用Add-Member
できます。 - 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
PSVersion Name System
--------- ---- ------
4.0 Server30 Server Core
ハッシュ テーブルからカスタム以外のオブジェクトを作成する
ハッシュ テーブルを使用して、非カスタム クラスのオブジェクトを作成することもできます。 非カスタム クラスのオブジェクトを作成する場合は、名前空間修飾型名が必要ですが、初期 システム 名前空間コンポーネントは省略できます。
たとえば、次のコマンドはセッション オプション オブジェクトを作成します。
[System.Management.Automation.Remoting.PSSessionOption]@{
IdleTimeout=43200000
SkipCnCheck=$True
}
ハッシュ テーブル機能の要件 、特にパラメーターなしのコンストラクターの要件により、多くの既存のクラスが不要になります。 ただし、ほとんどの PowerShell オプション クラスは、この機能と、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
...
パラメーター値を設定するときにハッシュ テーブル機能を使用することもできます。 たとえば、の SessionOption パラメーターのNew-PSSession
値です。
コマンドレットにはハッシュ テーブルを指定できます。
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 のジェネリック」を参照してください。
関連項目
PowerShell