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: 既存のオブジェクトにプロパティを追加します。 次のような[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-ItemDirectoryInfo オブジェクトに 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.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 のジェネリック」を参照してください

関連項目