2017-06-02 6 views
0

Ich habe Befehl folgende:Substring IP-Adresse mit einer Zeichenfolge Hinzufügen erzeugt Fehler, sondern arbeitet

$IP_start = $First.Substring(0, $First.LastIndexOf('.'))+ ".200" 

$First ist eine IP-Adresse, zum Beispiel 192.168.0.1

ich die 1 ändern wollen in die vierte octect in eine gibt mir 200.

Write-Output $IP_start 

die korrekte IP-Adresse 192.168.0.200, aber zur gleichen Zeit bekomme ich folgende Fehler:

Ausnahme beim Aufrufen von "Substring" mit 2 Argument(en): "Die Länge darf nicht kleiner als 0 (null) sein. Parametername: length" In *ps1:31 Zeichen:3 + $IP_start = $First.Substring(0, $First.LastIndexOf('.'))+ ".200" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ArgumentOutOfRangeException

Übersetzung

Exception when calling "substring" with 2 arguments: "The length can not be less than zero. Parameter name: length" In * ps1: 31 characters: 3...

Ich denke, alles funktioniert gut, aber dass Fehlermeldungen stört mich.

// edit:

ein ip.txt Es gibt, in der jede Zeile wie ist "192.168.0.1; ABCDEF"

$txt = Get-Content ip.txt 
$editline = foreach ($Data in $txt) { 
    $First, $Second = $Data -split ';' -replace '^\s*|\s*$' 

$IP_start = $First.Substring(0, $First.LastIndexOf('.'))+ ".200" 
Write-Output "modify ipaddr_first $IP_start" 
} 

$editline | Out-File "$output" 

ersten $ ist daher "192.168.0.1" und $ Sekunde "ABCDEF".

+1

Was ist das Ergebnis von $ First.LastIndexOf ('.') 'Für sich? Ich kann dein Problem nicht reproduzieren, damit etwas anders ist. LastIndex von gibt -1 zurück, wenn es nichts gefunden hat, das das Problem verursachen würde. Sie sagen uns, was $ zuerst ist, aber wir müssen raten, wie Sie es bevölkert haben. In jedem Fall würde ich sagen, verwenden Sie den '[ipaddress]' Typ, um mit diesem https://stackoverflow.com/questions/30061062/remove-first-octet-from-ip-address-with-regex-split/30067004# 30067004 – Matt

+0

Der Teilstring ist für die Frage wichtig, daher sollte er im Titel belassen werden. Macht einfach ein schlechtes Verb – Matt

+1

Welches Problem lösen Sie? Das Extrahieren einer Teilzeichenfolge einer IP-Adresszeichenfolge gibt Ihnen keine Netzwerk-ID (die von der Netzwerkmaske abhängt). –

Antwort

1

können Sie reguläre Ausdrücke verwenden

$IP_start = "192.168.1.1" 
$IP_start -replace "\d{1,3}$","200" 

Dies wird jede 192.168.1.xxx ändern, indem 192.168.1.200

+0

Ich änderte es in $ IP_start = $ erste -replace "\ d {1,3} $", "200" so kann ich meine Variable weiter verwenden. danke! –

+0

Zu dieser Lösung habe ich noch eine Frage: Warum ändert der Ersatz nur die letzte Nummer und nicht die anderen? Z.B. IP-Adresse 1.1.1.1 ändert sich zu 1.1.1.200. Warum nicht 200.200.200.200? Die Regex sucht nur nach "1", oder? –

+0

In diesem Fall bedeutet "\ d" nur Ziffern, "{1,3}" bedeutet nur 1 bis 3 Ziffern und mindestens "$" bedeutet das Ende der Zeichenfolge, das bedeutet "ersetzen Sie eine Zahl, die 1, 2 oder enthält 3 Ziffern am Ende der Zeichenfolge um 200 ". Bei einer IP-Adresse werden nur die letzten Nummern vor dem letzten "." – Manu

1
$IP_start = "192.168.1.1" 
(($IP_start -split "\.")[0..2] -join ".") + ".200" 
0

ein Syntheseverfahren für ein IPAddress-Objekt erstellen, eine unterhaltsame Art und Weise, dies zu tun ...

$Method = { 
Param(
[Int]$Number, 

[ValidateSet(1,2,3,4)] 
[Int]$Position 
) 

$OctetPosition = $Position - 1 
$CurrentIpAddress = New-Object -TypeName System.Collections.ArrayList 
$This.IpAddressToString -Split '\.' | ForEach-Object -Process { 
    $CurrentIpAddress.Add($_) | Out-Null 
} 

$ChangedOctet = [Int]($CurrentIpAddress[$OctetPosition]) + $Number 

if($ChangedOctet -gt 255){ 
    throw "Resulting octet is $ChangedOctet which is greater than 255" 
} 

$CurrentIpAddress.Item($OctetPosition) = $ChangedOctet 


return ($CurrentIpAddress -join '.') 

} 

$IPAddress = [System.Net.IpAddress]'192.168.1.1' 
$IPAddress | Add-Member -MemberType ScriptMethod -Name Add -Value $Method 

#$IPaddress.Add($Number,$OctetPosition) 
$IPAddress.Add(200,4) 
Verwandte Themen