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: を使用してインスタンス化できるクラスを PowerShell セッションで New-Object定義できます。
  • New-Module: AsCustomObject パラメーターは、スクリプト ブロックを使用して定義するカスタム オブジェクトを作成します。
  • Add-Member: 既存のオブジェクトにプロパティを追加します。 を使用 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]順序を維持します。

ハッシュテーブルはリテラルである必要があります。 Tf ハッシュテーブルをかっこで囲むか、ハッシュテーブルを含む変数をキャストした場合、順序が保持される保証はありません。

$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 オプション クラスは、この機能だけでなく、 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 のジェネリック」を参照してください。

こちらもご覧ください