прерывание сеанса работы powershell при сбое одного из заданий - PullRequest
0 голосов
/ 24 апреля 2018

Привет! Я пишу сценарий задания на PowerShell, который может выполнять его параллельно.

Пример кода, прикрепленный ниже для имитации сценария.Сценарий завершается ошибкой, когда мы передаем аргумент как «b» в блок сценария.

$createZip = {
    Param ( [String] $source, [String] $zipfile )

    if ($source -eq "b") {
        throw "Failed to create $zipfile"
    }
    else {
        return "Successfully created $zipfile"
    }
}

$jobs = @()                          
$sources = "a", "b", "c"

foreach ($source in $sources) {
    Start-Job -Name $source -ScriptBlock $createZip -ArgumentList $source, "${source}.zip"
}


Get-Job | Wait-Job | Out-Null

Если кто-то из заданий получает сбой, мне нужно прервать все запущенные задания.Как мне это сделать в PowerShell.

1 Ответ

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

Если вы хотите отменить все задания в случае сбоя одного из них, вы можете сделать это следующим образом:

$jobs = Get-Job

while ('Running' -in $jobs.State) {
    if ('Failed' -in $jobs.State) {
        $jobs | Stop-Job | Remove-Job
        break
    }

    Start-Sleep -Milliseconds 500
}

Редактировать:
Вот пример того, что ваш код должно выглядеть так:

$createZip = {
    param(
        [Parameter(Position = 0, Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string] $source,

        [Parameter(Position = 1, Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string] $zipfile
    )

    if ($source -eq 'b') {
        throw "Failed to create $zipfile"
    } else {
        "Successfully created $zipfile"
    }
}

$sources = 'a', 'b', 'c'    
$jobs = foreach ($source in $sources) {
    Start-Job -Name $source -ScriptBlock $createZip -ArgumentList $source, "$source.zip"
}

'Queued'

while ('Running' -in $jobs.State) {
    $jobs.State

    if ('Failed' -in $jobs.State) {
        $jobs | Stop-Job | Remove-Job
        'Aborting jobs'
        break
    }

    Start-Sleep -Milliseconds 500
}
...