【问题标题】:Substring IP-Address with adding a string generates error but works添加字符串的子字符串 IP 地址会生成错误但有效
【发布时间】:2017-06-02 14:32:12
【问题描述】:

我有以下命令:

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

$First 是一个 IP 地址,例如 192.168.0.1

我想把第四个八进制的 1 改成 200。

Write-Output $IP_start

给我正确的 IP 地址 192.168.0.200,但同时我得到以下错误:

Ausnahme beim Aufrufen von "Substring" mit 2 Argument(en): "Die Länge darf nicht kleiner 饰演 0 (null) sein。参数名称:长度”在 *ps1:31 Zeichen:3 + $IP_start = $First.Substring(0, $First.LastIndexOf('.'))+ ".200" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ArgumentOutOfRangeException

英文翻译

使用 2 个参数调用“子字符串”时出现异常:“长度不能小于零。参数名称:长度”在 * ps1:31 个字符:3...

我认为一切正常,但错误消息让我很困扰。

//编辑:

有一个ip.txt,其中每一行都像“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"

因此$first 是“192.168.0.1”,$second 是“ABCDEF”。

【问题讨论】:

  • $First.LastIndexOf('.') 本身的结果是什么?我无法重现您的问题,所以有些不同。 LastIndex of 将返回 -1 如果它没有找到任何会导致问题的东西。您告诉我们 $first 是什么,但我们必须猜测您是如何填充它的。无论哪种情况,我都会说使用[ipaddress] 类型来帮助解决这个stackoverflow.com/questions/30061062/…
  • 子字符串对问题很重要,所以它应该留在标题中。只是做一个糟糕的动词
  • 你在解决什么问题?提取 IP 地址字符串的子字符串不会告诉您网络 ID(取决于网络掩码)。
  • 我刚刚更新了我的开场白。我解释了 $first 是如何填充值的

标签: powershell substring ip-address lastindexof


【解决方案1】:

你可以使用正则表达式

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

这会将任何192.168.1.xxx 更改为192.168.1.200

【讨论】:

  • 我把它改成了 $IP_start = $first -replace "\d{1,3}$","200" 这样我就可以继续使用我的变量了。谢谢!
  • 对于这个解决方案,我还有一个问题:为什么替换只改变最后一个数字而不改变其他数字?例如。 IP 地址 1.1.1.1 更改为 1.1.1.200。为什么不是 200.200.200.200?正则表达式只是在寻找“1”,不是吗?
  • 在这种情况下,"\d" 仅表示数字,"{1,3}" 仅表示 1 到 3 位数字,并且至少 "$" 表示字符串的结尾,最后表示“替换在字符串末尾包含 1、2 或 3 位数字的数字 200"。对于 IP 地址,它将仅替换最后一个“.”之前的最后一个数字
【解决方案2】:
$IP_start = "192.168.1.1"
(($IP_start -split "\.")[0..2] -join ".") + ".200"

【讨论】:

    【解决方案3】:

    为 IPAddress 对象创建一个合成方法,这是一种有趣的方式......

    $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)
    

    【讨论】:

      猜你喜欢
      • 2014-01-27
      • 1970-01-01
      • 2019-07-18
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多