#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. Я хорошо понимаю, спасибо вам за вашу информацию и помощь :), это очень помогает