about_Object_Creation

簡単な説明

PowerShell でオブジェクトを作成する方法について説明します。

長い説明

PowerShell でオブジェクトを作成し、コマンドとスクリプトで作成したオブジェクトを使用できます。

オブジェクトを作成する方法は多数ありますが、この一覧は明確ではありません。

  • New-Object: オブジェクトまたは COM オブジェクト.NET Frameworkインスタンスを作成します。
  • Import-Csv/ ConvertFrom-CSV: コンマ区切り値として定義された項目からカスタム オブジェクト (PSCustomObject) を作成します。
  • ConvertFrom-Json: JSON (Json) で定義されたカスタム JavaScript Object Notation作成します。
  • ConvertFrom-StringData: キーと値のペアとして定義されたカスタム オブジェクトを作成します。
  • [追加の種類]: を使用してインスタンス化できるクラスを PowerShell セッションで定義できます New-Object
  • New-Module: AsCustomObject パラメーターは、スクリプト ブロックを使用して定義するカスタム オブジェクトを作成します。
  • Add-Member: 既存の オブジェクトにプロパティを追加します。 を使用して、 Add-Member のような単純型からカスタム オブジェクトを作成できます [System.Int32]
  • Select-Object: オブジェクトのプロパティを選択します。 を使用すると、 Select-Object 既にインスタンス化されたオブジェクトに対してカスタムプロパティと計算プロパティを作成できます。

この記事では、次の追加の方法について説明します。

  • 静的メソッドを使用して型のコンストラクターを呼び出 new()
  • プロパティ名とプロパティ値のハッシュ テーブルを型キャストする

静的 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 プロバイダーは、 によって返される DirectoryInfo オブジェクトに 6 つの NoteProperty 値を追加しますGet-Item

$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

ハッシュ テーブルから非カスタム オブジェクトを作成する

また、ハッシュ テーブルを使用して、非カスタム クラスのオブジェクトを作成することもできます。 非カスタム クラスのオブジェクトを作成する場合は、名前空間修飾型名が必要ですが、初期 の 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 の ジェネリック」を参照してください

関連項目