0 Pluspunkte 0 Minuspunkte

Ich habe diese Funktion um die Netzwerkmaske anhand des IP Prefix zu berechnen.

function Convert-PrefixToSubnetMask {
    param (
        [int]$PrefixLength
    )

    $binaryMask = ('1' * $PrefixLength).PadRight(32, '0') -split '(?<=\G.{8})'
    return ($binaryMask | ForEach-Object { [convert]::ToInt32($_, 2) }) -join '.'

}

$addresses = Get-NetIPAddress
$addresses | Sort-Object IPAddress | ForEach-Object {

    $subnetMask = Convert-PrefixToSubnetMask -PrefixLength $_.PrefixLength
    "$($_.IPAddress)/$($_.PrefixLength) $($subnetMask)`t$($_.InterfaceAlias)" 

}

Es funktioniert grundsätzlich aber bei jedem Aufruf der Funktion wird ein Fehler ausgegeben.

Ausnahme beim Aufrufen von "ToInt32" mit 2 Argument(en):  "Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein.
Parametername: startIndex"
In Zeile:6 Zeichen:44
+ ... urn ($binaryMask | ForEach-Object { [convert]::ToInt32($_, 2) }) -joi ...
+                                         ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException
von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Wenn die binäre Maske nicht exakt 32 Zeichen lang ist musst du leere Einträge ausschliessen.

function Convert-PrefixToSubnetMask {
    param (
        [int]$PrefixLength
    )

    $binaryMask = ('1' * $PrefixLength).PadRight(32, '0')
    $octets = $binaryMask -split '(.{8})' | Where-Object { $_ -ne '' }
    return ($octets | ForEach-Object { [convert]::ToInt32($_, 2) }) -join '.'

}
von (944 Punkte)