PowerShellでDelegate使いたいと思って動かしていたのですが、結局ScriptBlockが一番近いのかなと思いメモです。
#ScriptBlockを変数に割り当てます PS>$d = {param($p) return $p * 2} PS>$d.gettype() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True ScriptBlock System.Object #Invokeメソッドで呼び出せます PS>$d.Invoke(5) 10 PS>$d.Invoke(100) 200
Get-Timeでも。実行時の時間とれます。
PS>$time = {(Get-Date -Format HH:mm:ss)} PS>$time.Invoke() 22:38:10 PS>$time.Invoke() 22:38:15
Jobを使えば並列実行もできます。当たり前ですが、タスクマネージャーから見ればちゃんと10並列で動いています。
PS>$waitsec = {param($sec) sleep $sec; "done";} PS>1..10 | foreach{Start-Job -ScriptBlock $waitsec -Args 10} Id Name PSJobTypeName State HasMoreData Location -- ---- ------------- ----- ----------- -------- 5 Job5 BackgroundJob Running True localhost 7 Job7 BackgroundJob Running True localhost 9 Job9 BackgroundJob Running True localhost 11 Job11 BackgroundJob Running True localhost 13 Job13 BackgroundJob Running True localhost 15 Job15 BackgroundJob Running True localhost 17 Job17 BackgroundJob Running True localhost 19 Job19 BackgroundJob Running True localhost 21 Job21 BackgroundJob Running True localhost 23 Job23 BackgroundJob Running True localhost PS>Get-Job | Wait-Job | Receive-Job
Function(関数)使っても同じようなことできます。
function Test-Function{param($p) return $p * 2} $func = ${function:Test-Function} $func.Invoke(3) # 6が出力されます