以下のコード ブロックでは、Get-MyCmdlet を 3 つの個別のスレッドで実行しようとしています。Get-MyCmdlet が何も提供しなかった場合、各スレッドは Google ページを開きます。
Get-MyCmdlet はかなり単純で、唯一のことは WriteObject("hello world"); です。(c# コードで定義)。
ただし、Get-MyCmdlet を Get-Host (システムの既定のコマンドレット) に変更しない限り、スクリプトは常に Google ページを開きます。
カスタム コマンドレットがマルチスレッドをサポートしていないためですか? どんな助けでも大歓迎です!
コマンドレット:
[Cmdlet(VerbsCommon.Get, "MyCmdlet ")]
public class GetMyCmdlet : Cmdlet
{
protected override void ProcessRecord()
{
WriteObject("hello world");
}
}
スクリプト:
$ScriptBlock = {
$result = Get-MyCmdlet
if (!$result) {[System.Diagnostics.Process]::Start("http://www.google.com")}
$name = ($result | get-member)[-1].name
$result = $result.$name
return $result
}
....
$threads = 3
for ($i = 0; $i -lt $threads) {
$running = @($jobs | Where-Object {$_.State -match 'Running'})
Write-Host $running.length
if ($running.length -lt $threads) {
$jobs += Start-job -ScriptBlock $ScriptBlock
$i = $i + 1
} else {
get-job | receive-job
$finished = @($jobs | Where-Object ($_.State -match 'Completed'))
if ($finished) {
$finished.getType()
foreach($job in $finished) {
Receive-Job -keep $job | Out-File "Output$.txt"
$i = $i + 1
$finished.Remove($job)
Remove-Job -job $job
}
}
}
}