Как передать аргумент в функцию из вывода канала другого, используя powershell - PullRequest
0 голосов
/ 24 апреля 2018

Я написал функцию под названием Wait-BeforeJobFailOrSuccess.Это берет вывод из Get-Job, используя командную строку канала.Например.

 Get-Job|Remove-Job

Точно так же, как я хочу сделать для своей функции.Например

Get-Job | Wait-UntilJobFailOrSuccess

Я также прикрепил Wait-tillJobFailOrSuccess ниже.Пожалуйста, дайте нам знать.У кого-нибудь есть решение для этого.

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
}

1 Ответ

0 голосов
/ 24 апреля 2018

Решение для чего именно? Вы не указали проблему.

В любом случае, в своем коде вы называете свой параметр «Работа», а затем задаете его как [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?
    }
}
...