簡體   English   中英

使用PowerShell以字符串格式更改第3個八位字節的IP

[英]Change 3rd octet of IP in string format using PowerShell

我想我找到了最糟糕的方法:

$ip = "192.168.13.1"
$a,$b,$c,$d = $ip.Split(".")
[int]$c = $c
$c = $c+1
[string]$c = $c
$newIP = $a+"."+$b+"."+$c+"."+$d

$newIP

但最好的方法是什么? 完成后必須是字符串。 沒有考慮驗證其合法的IP。

使用你的例子來修改你想要修改第三個八位字節的方法,我會以同樣的方式完成它,但我會將一些步驟壓縮在一起:

$IP = "192.168.13.1"
$octets = $IP.Split(".")                        # or $octets = $IP -split "\."
$octets[2] = [string]([int]$octets[2] + 1)      # or other manipulation of the third octet
$newIP = $octets -join "."

$newIP

您可以簡單地使用PowerShell的-replace運算符和前瞻模式。 請看下面的這個腳本

Set-StrictMode -Version "2.0"
$ErrorActionPreference="Stop"
cls
$ip1 = "192.168.13.123"
$tests=@("192.168.13.123" , "192.168.13.1" , "192.168.13.12")
foreach($test in $tests)
{
    $patternRegex="\d{1,3}(?=\.\d{1,3}$)"
    $newOctet="420"
    $ipNew=$test -replace $patternRegex,$newOctet
    $msg="OLD ip={0} NEW ip={1}" -f $test,$ipNew
    Write-Host $msg

}

這將產生以下結果:

OLD ip=192.168.13.123 NEW ip=192.168.420.123
OLD ip=192.168.13.1 NEW ip=192.168.420.1
OLD ip=192.168.13.12 NEW ip=192.168.420.12

如何使用-replace運算符?

https://powershell.org/2013/08/regular-expressions-are-a-replaces-best-friend/

理解我使用過的模式

\\ d {1,3}(?=。\\ d {1,3} $)中的(?=)意味着落后。

(?=。\\ d {1,3} $ in \\ d {1,3}(?=。\\ d {1,3} $)表示DOT后面的任何內容和1-3位數字。

前導\\ d {1,3}是專門匹配1-3位數的指令

全部用簡單的英語組合“ 給我1-3個數字,這個數字落后於一個時期,1-3個數字位於字符串的右側邊界

正面看正則表達式

https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

更正

正則表達式模式是前瞻性而不是落后

如果您有PowerShell Core (v6.1或更高版本),則可以-replace與基於腳本塊的替換組合使用

PS> '192.168.13.1' -replace '(?<=^(\d+\.){2})\d+', { 1 + $_.Value }
192.168.14.1
  • 負面的后置斷言(?<=^(\\d+\\.){2})匹配所有內容,但不包括第三個八位字節 - 而不考慮它是要替換的整體匹配的一部分。

    • (?<=...)是后視斷言, \\d+匹配一個或多個( + )數字( \\d ), \\. 文字 . ,和{2}匹配前面的子表達式( (...) )2次。
  • \\d+然后匹配第3個八位字節; 因為沒有更多匹配,所以字符串( .和第4個八位字節)的其余部分保留在原位。

  • 在替換腳本塊( { ... } )內, $_[MatchInfo]實例的形式引用匹配的結果; 它的.Value是匹配的字符串,即第3個八位字節,可以添加1

    • 數據類型注意:通過使用1 ,隱式[int] ,作為LHS ,RHS( .Value 字符串 )被隱式強制轉換為[int] (您可以選擇使用顯式轉換)。
      在輸出時,無論腳本塊返回什么,都會自動強制轉換回字符串

如果必須與Windows PowerShell保持兼容,請考慮Jeff Zeitlin的有用答案

為了完成您的方法,但很快:

$a,$b,$c,$d = "192.168.13.1".Split(".")
$IP="$a.$b.$([int]$c+1).$d"
function Replace-3rdOctet {
    Param(
        [string]$GivenIP,
        [string]$New3rdOctet
    )
    $GivenIP -match '(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})' | Out-Null
    $Output = "$($matches[1]).$($matches[2]).$New3rdOctet.$($matches[4])"
    Return $Output
}

復制到ps1文件並從命令行點源,然后鍵入

Replace-3rdOctet -GivenIP '100.201.190.150' -New3rdOctet '42'

產量:100.201.42.150

從那里你可以為隨機輸入等添加額外的錯誤處理等。

這是一個略有不同的方法。 [ ]直到我完成這件事之后我才注意到JeffZeitlin的答案。

[編輯 - 感謝JeffZeitlin提醒我OP希望最終結果為字符串。 哎呀! [*臉紅*]]

它能做什么 ...

  • 在點上分割字符串
  • 將它放入[int]數組並將項目強制轉換為該類型
  • 增加目標插槽中的項目
  • 將項目連接回一個帶有分隔符點的字符串
  • 將其轉換為IP地址類型
  • 添加一行以將IP地址轉換為字符串

這是代碼......

$OriginalIPv4 = '1.1.1.1'
$TargetOctet = 3

$OctetList = [int[]]$OriginalIPv4.Split('.')
$OctetList[$TargetOctet - 1]++

$NewIPv4 = [ipaddress]($OctetList -join '.')

$NewIPv4
'=' * 30
$NewIPv4.IPAddressToString

輸出......

Address            : 16908545
AddressFamily      : InterNetwork
ScopeId            : 
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 1.1.2.1

==============================
1.1.2.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM