0

在下面的代码块中,我试图在 3 个单独的线程中运行 Get-MyCmdlet,如果 Get-MyCmdlet 没有提供任何内容,每个线程都会打开一个谷歌页面。

Get-MyCmdlet 相当简单,它唯一做的就是 WriteObject("hello world"); (在 c# 代码中定义)。

但是脚本总是打开一个谷歌页面,除非我将 Get-MyCmdlet 更改为 Get-Host(这是系统默认的 cmdlet)。

是因为自定义 cmdlet 不支持多线程吗?任何帮助将不胜感激!

cmdlet:

[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

没有自定义 cmdlet 不是问题。我的猜测是问题在于调用Get-MyCmdlet失败并出现错误,因此未设置 $result 并且感谢您是否启动了浏览器。如果您要检查作业的结果,您会看到一条错误消息。您可能需要确保作业正确初始化,以便调用您的 cmdlet。您可以使用-InitializationScript参数Start-Job为作业导入模块。有关更多信息,请参见此处此处此处

于 2013-06-06T20:36:39.393 回答