Powershell: разрыв от двух или более петель - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть скрипт, который пингует системы до его завершения. Основной кодовый блок - это функция, которая имеет foreach l oop, вложенный в do до l oop.

## Start
function start-skript{
    Write-Output 'Ping läuft...'
    $Repetition_Counter = 0
    #Start loop
    do {
        #Host loop
        foreach($system in $Hosts_Array) {
            #Ping Function
            Ping-Host -HostToPing $system
            #Write-Host 'Sleep for' $Pause 'sekunde'
            Start-Sleep -Seconds $Pause
        } $Repetition_Counter ++
    } until($Repetition_Counter -eq $Repetition -or (stop-script))
}

start-skript

Работает отлично. Однако, вызывая функцию stop-script, скрипт можно остановить только после того, как функция ping-host была применена ко всем устройствам в $ Hosts_Array. Я хочу иметь возможность остановить сценарий, вызвав функцию stop-script, даже если функциональный Ping-host не применяется ко всем устройствам в массиве $ Hosts_Array. Я думал, что могу сделать, как ниже

## Start
function start-skript{
    Write-Output 'Ping läuft...'
    $Repetition_Counter = 0
    #Start loop
    do {
        #Host loop
        foreach($system in $Hosts_Array) {
            #Ping Function
            Ping-Host -HostToPing $system
            #Write-Host 'Sleep for' $Pause 'sekunde'
            **stop-script**  ## I've just added the function here
            Start-Sleep -Seconds $Pause
        } $Repetition_Counter ++
    } until($Repetition_Counter -eq $Repetition -or (stop-script))
}

start-skript

Я не удался. Он просто выходит из foreach l oop, но затем начинается снова с foreach l oop, bcz foreach l oop находится в до, пока l oop .. Любые предложения ??

1 Ответ

3 голосов
/ 17 апреля 2020

Используйте метку выписки:

:outer
do
{
  :inner
  foreach($i in 1..10){
    if($i -eq 2){
      continue inner
    }
    if($i -gt 5){
      break outer
    }

    $i
  }
}while($true)

Вывод будет:

1
3
4
5

Так как мы continue сделали внутренний l oop на $i -eq 2 и вспыхнули внешнего l oop после $i -eq 5

...