2

次のような psobject があるとします。

$o=New-Object PSObject -Property @{"value"=0}
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value {
    echo "the square root of $($this.value) is $([Math]::Round([Math]::Sqrt($this.value),2))"
} -inputObject $o

value 属性が変更されたときにメソッド Sqrt() が実行されるようにイベントを添付することは可能ですか? すなわち:

PS>$o.value=9

生産します

the square root of 9 is 3

アップデート

@Richardの回答によると、これは実用的なレシピです:

$o=New-Object PSObject -property @{"_val"=1}
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value {
    write-host "the square root of $($this._val) is $([Math]::Round([Math]::Sqrt($this._val),2))"
} -inputObject $o


Add-Member -MemberType ScriptProperty -Name 'val' -Value{ $this._val }  -SecondValue { $this._val=$args[0];$this.Sqrt() } -inputObject $o
4

1 に答える 1

4

valueこれには、NotePropertyを にするのではなくScriptProperty、フィールドを直接変更するのではなく、呼び出される個別の get メソッドと set メソッドを定義することが含まれます。

$theObject | Add-Member -MemberType ScriptProperty -Name 'Value' 
                        -Value{ $this._value }
                        -SecondValue { $this._value = $args[0]; $this.Sqrt }

( get メソッド、 setValueを定義します。)SecondValue

PowerShell にはデータをカプセル化する機能がないため、基になるフィールドには引き続き呼び出し元がアクセスできることに注意してください。C# (または他の .NET 言語) でカスタム型をコーディングして を使用すると、Add-Typeこれを回避できますが、ルールに従わない呼び出し元が実際にいない限り、その価値はほとんどありません。

第二号

ScriptProperty には出力パイプがない (すべての出力が破棄される) ため、echo(のエイリアスであることWrite-Output) は何の役にも立ちません。それを交換するとWrite-Host動作します。一般に、プロパティの get または set (出力を含む) での副作用は不適切な方法です (これらを使用すると、オーバーヘッドが低くなることが予想されます)。

于 2013-09-18T08:10:10.007 に答える