PowerShell 3 より前
PowerShell の Extensible Type System では、パラメーターで行った方法に対してテストできる具体的な型を作成できませんでした。そのテストが必要ない場合は、上記の他の方法で問題ありません。
サンプルスクリプトのように、キャストまたはタイプチェックできる実際のタイプが必要な場合は、C#またはVB.netで記述してコンパイルしないと実行できません。PowerShell 2 では、「Add-Type」コマンドを使用して非常に簡単に実行できます。
add-type @"
public struct contact {
public string First;
public string Last;
public string Phone;
}
"@
歴史的なメモ: PowerShell 1 では、さらに困難でした。CodeDom を手動で使用する必要がありました。非常に古い関数new-structスクリプトが PoshCode.org にあり、これが役に立ちます。あなたの例は次のようになります。
New-Struct Contact @{
First=[string];
Last=[string];
Phone=[string];
}
Add-Type
orを使用New-Struct
すると、実際にクラスをテストし、param([Contact]$contact)
などを使用して新しいクラスを作成できます$contact = new-object Contact
...
PowerShell 3 では
キャストできる「実際の」クラスが必要ない場合は、Steven と他の人が上で示した Add-Member の方法を使用する必要はありません。
PowerShell 2 以降では、New-Object に -Property パラメーターを使用できます。
$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }
また、PowerShell 3 では、PSCustomObject
アクセラレータを使用して TypeName を追加できるようになりました。
[PSCustomObject]@{
PSTypeName = "Contact"
First = $First
Last = $Last
Phone = $Phone
}
まだ単一のオブジェクトしか取得していないため、すべてのオブジェクトが同じであることを確認する関数を作成する必要がありますが、パラメーターを属性New-Contact
で装飾することにより、パラメーターがそれらの型の 1 つであることを簡単に確認できるようになりました。PSTypeName
function PrintContact
{
param( [PSTypeName("Contact")]$contact )
"Customer Name is " + $contact.First + " " + $contact.Last
"Customer Phone is " + $contact.Phone
}
PowerShell 5 では
PowerShell 5 ではすべてが変更され、最終的に型を定義するための言語キーワードとして and を取得しました (存在しませんclass
が、問題ありません)。enum
struct
class Contact
{
# Optionally, add attributes to prevent invalid values
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
# optionally, have a constructor to
# force properties to be set:
Contact($First, $Last, $Phone) {
$this.First = $First
$this.Last = $Last
$this.Phone = $Phone
}
}
New-Object
:を使用せずにオブジェクトを作成する新しい方法も取得しました[Contact]::new()
。実際、クラスをシンプルに保ち、コンストラクターを定義しない場合は、ハッシュテーブルをキャストすることでオブジェクトを作成できます (ただし、コンストラクターがなければ方法はありません)。すべてのプロパティを設定する必要があることを強制するには):
class Contact
{
# Optionally, add attributes to prevent invalid values
[ValidateNotNullOrEmpty()][string]$First
[ValidateNotNullOrEmpty()][string]$Last
[ValidateNotNullOrEmpty()][string]$Phone
}
$C = [Contact]@{
First = "Joel"
Last = "Bennett"
}