オブジェクトを生成してプロパティを追加するスクリプト

PowerShellにはオブジェクトに動的にプロパティを追加する「Add-Member」コマンドレットがある。
使い方はこんな感じ。

オブジェクト | Add-Member NoteProperty [プロパティ名] [値]

「NoteProperty」の他にスクリプトを値として追加できる「ScriptProperty」なんかもある。
動的にプロパティを追加できるといっても、本当にオブジェクトのクラス定義をいじってプロパティを追加するわけではなくて、キーと値のペアをオブジェクトに関連付けて、それをPowerShell上ではあたかもプロパティのように見せているだけ。(たぶん)

で、これを利用して、こんなスクリプトを作ってみた。

New-PSObject.ps1
param([Hashtable]$props=@{})

if($args[0] -eq "-?") {
    $commandName = [IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)
	Write-Host @"

Name:
    $commandName

Description:
    Creates new object of PSObject class.

Usage:
    $commandName [[-props] <Hashtable>]
    
    -props <Hashtable>
        The collection of Property name/value pairs.
        
"@ -foregroundColor Yellow
	exit 1
}
$obj = New-Object PSObject
$props.GetEnumerator() | % { $obj | Add-Member NoteProperty $_.Key $_.Value }
$obj

やってる事は単純でPSObjectをインスタンス化して、引数として渡したHashtableのキーと値をプロパティとして、オブジェクトに追加するだけ。

使い方
PS > $obj = New-PSObject @{ Number=100; Name="Hoge" }
出力
PS > $obj | Format-Table -autoSize

Name Number
---- ------
Hoge    100