読者です 読者をやめる 読者になる 読者になる

PowerShellでDelegateに近いことことしてみた(並列実行など)

PowerShell

PowerShellDelegate使いたいと思って動かしていたのですが、結局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が出力されます