mullewarf
Goto Top

Powershell Foreach-Schleife in Foreach-Schleife

Moin,
das Script soll unter anderem vom DHCP-Server den IPv4 Scope auslesen und dann schauen ob die IP-Adressen aus einer Csv-Datei in diesem Scope liegen.
Ich habe 2 CSV-Dateien zum Testen erstellt. Die Erste enthählt IP-Adressen von 192.168.11.0/24 -192.168.12.254/24 und die Zweite enthält den DHCP-Scope von 192.168.11.100 - 192.168.11.200 und 192.168.12.100 - 192.168.12.200
Dies ist mein Script:
clear
$dateiPfad1 = "C:\Powershell Scripte\IP-Adressen anpingen\IP-Adressen_Test.csv" #Löschen für fertiges Program  
$hosts = Import-Csv -Path $dateiPfad1 -Delimiter ";" -Header "NetworkName","CIDR","IP","DhcpArea","DhcpReservation","Hostname","Comment","PingSuccess"  
$referece = $hosts

$dhcpHostReservation = Get-DhcpServerv4Scope -ComputerName dhcp-01.raiffeisen.local | Get-DhcpServerv4Reservation -ComputerName dhcp-01.raiffeisen.local #| Select-Object -Property IPAddress,ScopeID
#$dhcpHostScope = Get-DhcpServerv4Scope -ComputerName dhcp-01.raiffeisen.local | Select-Object -Property StartRange,EndRange 
$dateiPfad2 = "C:\Powershell Scripte\IP-Adressen anpingen\DHCP-Area_Test.csv"  
$dhcpHostScope = import-csv -Path $dateiPfad2 -Delimiter ";" -Header "StartRange","EndRange"   
[bool[]]$dhcpArea

function Test-IfIPisinDhcpArea($ip1, $ip2, $ip3){
    [double[]]$arrDouble1 = $ip1.Split(".")  
    [double[]]$arrDouble2 = $ip2.Split(".")  
    [double[]]$arrDouble3 = $ip3.Split(".")  
    $wert1 = $arrDouble1 * 1000000000 + $arrDouble1[1] * 1000000 + $arrDouble1[2] * 1000 + $arrDouble1[3] * 1
    $wert2 = $arrDouble2 * 1000000000 + $arrDouble2[1] * 1000000 + $arrDouble2[2] * 1000 + $arrDouble2[3] * 1
    $wert3 = $arrDouble3 * 1000000000 + $arrDouble3[1] * 1000000 + $arrDouble3[2] * 1000 + $arrDouble3[3] * 1

    if ($wert1 -ge $wert2 -and $wert1 -le $wert3){
        $area = $true
    }
    else{
        $area = $false
    }
    return $area
}

foreach ($h in $hosts) {
    foreach ($r in $dhcpHostReservation) {
        if($r.IPAddress -eq $h.IP) {
            $h.DhcpReservation = 'X'  
            $h.Hostname = $r.Name
        } else {
            $h.DhcpReservation = ''  
            $h.Hostname = $r.Name
        }
    }
    $result = Test-Connection $h.IP -Count 1 -Quiet
    if ($result -eq $true) {
        write-host "IP: $($h.IP) ist erreichbar." -ForegroundColor Green  
        $h.PingSuccess = 'X'  
    } else {
        write-host "IP: $($h.IP) ist nicht erreichbar." -ForegroundColor Magenta  
        $h.PingSuccess = ''  
    }
}

#Es geht um diesen Abschnitt
foreach ($d in $dhcpHostScope){
    foreach ($h in $hosts){
        $dhcpArea=Test-IfIpIsInDhcpArea $h.IP $d.StartRange $d.EndRange 

        if($dhcpArea-eq $true){
            $h.DhcpArea = '#'  
        }
        else{
            $h.DhcpArea = ''  
        }
    }
}

$dateiPfadNeu = "U:\Projekte\Powershell Scripte\IP-Adressen anpingen\IP-Adressen anpingen neu.csv"  
$hosts | Select-Object -Property IP,DhcpArea,DhcpReservation,PingSuccess | Export-Csv -Path $dateiPfadNeu -Delimiter ";" -NoTypeInformation  

Jetzt speichert er am ende aber nur die Werte im 192.168.12.100 bis 196.168.12.200 Bereich im Bereich 192.168.11.100 bis 192.168.11.200 wird nichts eingetragen. Kann mir bitte einer sagen warum er das nicht macht. In der ersten Foreach-Schleife läuft es ja einwandfrei.
Ich bin über jede Hilfe Dankbar

Content-Key: 585834

Url: https://administrator.de/contentid/585834

Printed on: April 18, 2024 at 15:04 o'clock

Member: AndreasHoster
AndreasHoster Jul 08, 2020 at 11:47:45 (UTC)
Goto Top
Du überschreibst bei jedem Durchlauf der äußeren Schleife die Werte der Hosts wieder (in der inneren Schleife).
Deswegen bekommst Du nur das Ergebnis des letzten (äußeren) Schleifendurchlaufs.