0

以下のコード ブロックでは、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
                }
            }  
        }   
    }
4

1 に答える 1

1

カスタム コマンドレットは問題になりません。私の推測では、呼び出しGet-MyCmdletがエラーで失敗するため、 $result が設定されておらず、ブラウザーが起動されている場合はあなたのおかげです。ジョブの結果を確認すると、エラー メッセージが表示されます。コマンドレットを呼び出すことができるように、ジョブが正しく初期化されていることを確認する必要があります。-InitializationScriptのパラメーターを使用しStart-Jobて、ジョブのモジュールをインポートできます。詳細については、ここここ、およびここを参照してください。

于 2013-06-06T20:36:39.393 に答える