gpt4 book ai didi

multithreading - Powershell:Receive-Job中出现意外结果

转载 作者:行者123 更新时间:2023-12-03 01:21:36 25 4
gpt4 key购买 nike

我试图更好地了解Powershell如何处理作业。

这些文章都对我们有很大帮助:

  • Multi-Threading in powershell
  • Pass array to Start-Job

  • 但是,使用以下示例脚本,我在调用Receive-Job时得到了意外的结果。我希望每行都有一个结果,但是有时我会看到每行有多个结果或额外的空白回车。关于如何只写出每个作业从控制台流入的信息的任何想法?
    $loops = 1..10
    $jobs = new-object System.Collections.ArrayList

    $loops | % {
    $jobs.add(
    (start-job -ScriptBlock {
    param($list)
    $list | % {
    sleep -seconds (get-random -Maximum 3 -Minimum 1)
    write-host "Number is: $_"
    }
    } -ArgumentList (,$loops))
    ) | out-null
    }


    while ($jobs.count -gt 0)
    {
    if ($jobs -ne $null)
    {
    $list = $jobs | ? { $_.HasMoreData -eq $true }
    $list | % { Receive-Job -Job $_ }
    $list2 = $jobs.Clone() | ? { $_.State -eq "Completed" }
    $list2 | % {
    $jobs.Remove($_) | out-null
    }
    $list = $null
    }
    }

    输出可以是...

    数是:1
    数是:1
    数是:2

    有时

    数是:1
    数是:2
    数字是:1数字是:2
    数字是:1数字是:2数字是:2

    最佳答案

    您使这个复杂化了很多。您不需要所有这些循环即可手动处理事物。您应该利用可用的cmdlet。这应该可以实现所需的基础知识:

    $loops = 1..10

    $scriptBlock = {
    param($list)
    $list | % {
    sleep -seconds (get-random -Maximum 3 -Minimum 1)
    write-host "Number is: $_"
    }
    }

    $jobs = $loops | % { start-job -ScriptBlock $scriptBlock -ArgumentList (,$loops) }

    $jobs | Wait-Job | Receive-Job

    但是,这会将所有输出分组在一起,但是没有任何办法知道什么工作做了什么。而且,您使用 Write-Host的事实意味着您实际上无法访问数据,只是将数据打印到屏幕上。

    如果要实际存储或处理结果作业输出,可以执行以下操作:
    $loops = 1..10

    $scriptBlock = {
    param($list)
    $list | % {
    sleep -seconds (get-random -Maximum 3 -Minimum 1)
    "Number is: $_" # don't use write-host, just output the string
    }
    }

    $jobs = $loops | % { start-job -ScriptBlock $scriptBlock -ArgumentList (,$loops) }

    $jobs | Wait-Job # wait for all jobs to be complete
    $jobs |%{
    $output = $_ | Receive-Job
    # process $output here, do what you want with it
    }

    关于multithreading - Powershell:Receive-Job中出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12084159/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com