PowerShellでクラス(みたいなもの)を作ってみる

PowerShellでクラス(みたいなもの)を作ってみた。

# コンストラクタ
param([string]$firstName, [string]$lastName)

class Person |
    property FirstName $firstName |
    property LastName $lastName |
    
    def get_FullName {
        return "{0} {1}" -f $this.FirstName, $this.LastName
    }

これを「Person.ps1」というファイル名で保存する。使う時はこんな↓感じ

PS > $obj = Person ディラン マッケイ

このオブジェクトのメンバーを見てみると

PS > $obj | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name         MemberType   Definition
----         ----------   ----------
Equals       Method       System.Boolean Equals(Object obj)
GetHashCode  Method       System.Int32 GetHashCode()
GetType      Method       System.Type GetType()
ToString     Method       System.String ToString()
FirstName    NoteProperty System.String FirstName=ディラン
LastName     NoteProperty System.String LastName=マッケイ
get_FullName ScriptMethod System.Object get_FullName();

「FirstName」「LastName」プロパティと、「get_FullName」メソッドが定義されている。

やってる事は単に以下の関数を作って、それをパイプでつないで使っているだけ。

function New-Class([string]$name) {
    $obj = New-Object PSObject
    $obj
}
Set-Alias class New-Class

filter Add-Property([string]$name, [object]$value) {
    $_ | Add-Member NoteProperty $name $value
    $_
}
Set-Alias property Add-Property

filter Add-Method([string]$name, [ScriptBlock]$method) {
    $_ | Add-Member ScriptMethod $name $method
    $_
}
Set-Alias def Add-Method

特に意味は無いけど、何かに使えるかもしれない。