如何使用PowerShell从另一个管道输出传递参数到函数

问题描述 投票:0回答:1

我编写了一个名为Wait-UntilJobFailOrSuccess的函数。这将使用管道命令行从Get-Job获取输出。例如。

 Get-Job|Remove-Job

我想为我的功能做同样的事情。例如

Get-Job | Wait-UntilJobFailOrSuccess

我还在下面附上了Wait-UntilJobFailOrSuccess。请告诉我们。有没有人有这方面的解决方案。

Function Wait-UntilJobFailOrSuccess
{
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [System.Object[]]$jobs
        )
    while ($true) {
     if ('Failed' -in $jobs.State) {
        $jobs | Stop-Job 
        Write-Host "Aborting Jobs ${result}"
        break
    }

    Start-Sleep -Milliseconds 500
  }

  foreach ($job in $jobs) {
        if ($job.State -eq 'Failed') {
        Write-Host ($job.ChildJobs[0].JobStateInfo.Reason.Message) -ForegroundColor Red
    } else {
        Write-Host (Receive-Job $job) -ForegroundColor Green 
    }
  }
  $jobs|remove-Job
}
powershell powershell-v3.0
1个回答
1
投票

究竟是什么解决方案?你没有说明问题。

无论如何,在您的代码中,您将参数命名为“Jobs”,然后将其命名为[ValueFromPipelineByPropertyName]。作业对象没有Jobs属性,因此这不起作用。为此考虑一个单独的参数Id。此外,不是将参数键入为[object[]],而是将其键入为[System.Management.Automation.Job[]],即作业对象的类型。

您应该在process块中有逻辑来累积所有Job对象,然后在收集完所有作业后将循环移动到end块。

我已经重新格式化了你的代码并将其清理了一下,但我仍然无法弄清楚你实际上要做什么:

Function Wait-UntilJobFailOrSuccess
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [System.Management.Automation.Job[]]
            $jobs
    )

    begin
    {
        $joblist = @()
    }

    process 
    {
        $joblist += $jobs
    }

    end
    {
        foreach ($job in $joblist)
        {
            if ($job.State -eq 'Failed') 
            {
                Stop-Job -Job $job 
                Write-Host "Aborting Job $(job.name)"
                break
            }
        }

        Start-Sleep -Milliseconds 500

        foreach ($job in $jobslist) 
        {
            if ($job.State -eq 'Failed')
            {
                Write-Host ($job.ChildJobs[0].JobStateInfo.Reason.Message) -ForegroundColor Red
            } 
            else 
            {
                Write-Host (Receive-Job $job) -ForegroundColor Green
            } 
        }
        $joblist | Remove-Job -Force # Is this what you really want to do?
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.