Переход к списку IP-адресов в foreach

#powershell

#powershell

Вопрос:

Я работаю над небольшим скриптом, чтобы собрать некоторые знания и опции в одном скрипте. На потом и для себя. Это простой способ, но с большим количеством информации и возможностью «повторного использования».

Сейчас я пытаюсь выполнить переход в «запущенном» процессе списка. Все, о чем я мог думать до сих пор, — это достичь этого с помощью регулярного выражения. Но я не могу правильно использовать регулярное выражение.

 #Custom Ping to identify the scenario
function Custom-Ping {
    Param(
        [string]$Address
    )
    $ping = ping $Address /w 1 /n 1
    if (![string]::IsNullOrEmpty($ping -Like "*(100% loss)*")) {
        $result = "Error"
    } elseif(![string]::IsNullOrEmpty($ping -Like "*expired*")) {
        $result = "Warning"
    } else {
        $result = "succeded"
    }
    return $result
}

$ErrorActionPreference = "SilentlyContinue"

$tstart = Get-Date
$counter = 0
$unreachable = 0

$IPlist = foreach ($Network in 1..29) {
    foreach ($Range in 1..254) {
        "10.10.$Network.$Range"
    }
}

foreach ($IP in $IPlist) {
    $counter   
    try {
        if ($unreachable -lt 6) {
            #SwitchCase
            $case = Custom-Ping $IP

            switch ($case) {
                succeded {
                    Write-Host "Response from: $IP" -ForegroundColor Green
                    #$IP | Export-Csv -Path D:somepath.csv -Append
                }
                Error {
                    Write-Host "No Response from: $IP" -ForegroundColor Red
                    #$IP | Export-Csv -Path D:somepath.csv -Append
                }
                Warning {
                    Write-Host "Time Expired on: $IP" -ForegroundColor Yellow
                    #$IP | Export-CSV -path D:somepath.csv -Append
                    $unreachable   
                }
                default {
                    Write-Warning "An Error Occured while processing"
                }
            }
        } else {
            #Hop to the next range as this range isnt accesibble
            #$IPswap = $IP
            #newIP = $Ipswap "$Network from 2 to 3"
            #$IP=$newIP
            $unreachable = 0
            Write-Host "The Network xxxx cant be reached"
        }
    } catch {
        Write-Warning "Other Error"
    }
}

$tend = Get-Date
Write-Host "$counter Completed Ping requests"
New-TimeSpan -Start $tstart -End $tend | select Minutes, Seconds
  

Пока это сценарий… До сих пор я не нашел способа выполнить этот переход в «сети».

Например, он получил 5 недоступных в сети 10.10.2.0, а затем устанавливает значение 10.10.3.0 network и снова запускает там процесс.

Мне было интересно, возможно ли это вообще в этом сценарии.

Ответ №1:

Вместо этого используйте вложенные циклы и метки:

 :Network # Now we can jump into the next iteration of this loop from an inner loop
foreach ($Network in 0..29)
{
    :Host
    foreach($Node in 0..254){
        $IP = "10.10.$Network.$Node"

        #Counter for "Statistic"
        $counter   
        try
        {
            #Check error sum for Range Hop
            if($unreachable -lt 6)
            {
                #SwitchCase
                $case = Custom-Ping $IP

                switch ($case)
                {
                succeded
                {           
                    Write-Host "Response from: $IP" -ForegroundColor Green
                    #$IP | Export-Csv -Path D:somepath.csv -Append
                }
                Error
                {     
                    Write-Host "No Response from: $IP" -ForegroundColor Red
                    #$IP | Export-Csv -Path D:somepath.csv -Append
                }
                Warning
                {
                    Write-Host "Time Expired on: $IP" -ForegroundColor Yellow
                    #$IP | Export-CSV -path D:somepath.csv -Append
                    $unreachable   
                }
                default
                {
                    Write-Warning "An Error Occured while processing"
                }
                }
            }
            else
            {
                $unreachable = 0
                Write-Host "The Network 10.10.$Network.0/24 cant be reached, jumping to 10.10.$($Network   1).0/24"

                # jump forward to the next iteration of the outer "Network" loop
                continue Network
            }
        }
        catch
        {
            Write-Warning "Other Error" 
        }
    }
}
  

Комментарии:

1. ах, хорошо, я думаю, я разбираюсь в этом, просто для наглядности; :Network и :Host — это своего рода «указатель стека», я не прав с этим?

2. Не совсем, но это полезный способ его интерпретации — операторы потока управления, такие как break и continue , теперь могут указывать «разматывать до X», а не «разматывать до последнего».

3. Я хорошо понимаю, спасибо вам за вашу информацию и помощь :), это очень помогает