想要在循环中递增IP地址字符串

问题描述 投票:0回答:5

我对 powershell 还很陌生。 我想将 IP 地址加一。

$ipaddress = 15
$NICS = Get-WmiObject Win32_NetworkAdapterConfiguration | where {$_.IPEnabled -eq “TRUE”}
foreach($NIC in $NICs) {$NIC.EnableStatic("10.0.0.$($ipaddress++)", "255.255.255.0")
            $NIC.SetGateways("10.0.0.1", 1)
            $NIC.SetDNSServerSearchOrder("10.0.0.100")}
powershell
5个回答
1
投票

我对我找到的答案有点恼火,它们要么太麻烦,要么根本不起作用。

我终于找到了原因,

System.Net.IPAddress.Address()
方法,以与我们读取方式相反的顺序返回位,其中LSB实际上是地址中最高有效字节的一部分。

PS> $ip = '192.168.1.1'

PS> [System.Net.IPAddress]::Parse($ip).IPAddressToString
192.168.1.1

# Parsing Address, returns the Address in reverse.
PS> [System.Net.IPAddress]::Parse([System.Net.IPAddress]::Parse($ip).Address).IPAddressToString
1.1.168.192

这就是为什么增加 1 从来没有起作用(至少对我来说)。

我最终使用了以下逻辑:

function Increment-IPAddress{
  param([Parameter(Mandatory)]$ip,$increment = 1)
  [System.Net.IPAddress]::Parse(
    [System.Net.IPAddress]::Parse(
      [System.Net.IPAddress]::Parse($ip).Address
    ).Address + $increment
  )
}

输出示例:

# The simplest example
PS> Increment-IPAddress '192.168.1.1' | % IPAddressToString
192.168.1.2

# Passing the threshold between 192.168.1.* and 192.168.2.*
PS> Increment-IPAddress '192.168.1.255' | % IPAddressToString
192.168.2.0

# Some more complex arithmetic:
PS> Increment-IPAddress '192.168.1.254' 3 | % IPAddressToString
192.168.2.1

希望这对 2024 年以后研究这个问题的人有所帮助


1
投票

使用此方法,如果您尝试创建错误的 IP 地址,至少会遇到异常。使用 PS 中提供的类型有很多好处。我看到其他建议的解决方案将允许您创建以

256
等结尾的东西。

[IPAddress](([IPAddress]"10.0.0.15").Address + (1 -shl 24))

0
投票

你很接近。您只想在静态 IP 声明中使用

"10.0.0.$ipaddress"
,然后在另一行上用
$ipaddress++
增加它。

$ipaddress = 15
$NICS = Get-WmiObject Win32_NetworkAdapterConfiguration | where {$_.IPEnabled -eq “TRUE”}
foreach($NIC in $NICs) {$NIC.EnableStatic("10.0.0.$ipaddress", "255.255.255.0")
            $NIC.SetGateways("10.0.0.1", 1)
            $NIC.SetDNSServerSearchOrder("10.0.0.100")
            $IPAddress++}

0
投票

两个问题:

  1. 增量运算符是可无效语句,这意味着除非将它们括在括号中,否则它们不会产生返回值。用于字符串插值的 $() 不算在内,您需要在其中添加另一对括号。

  2. ++ 运算符跟在变量后面时(如

    $ipaddress++
    所示),它是一个 post 递增运算符,这意味着首先在表达式中对变量进行求值,然后递增。因此,即使您得到带有第二对括号的返回结果,您也将 $ipaddress 的原始值插入到字符串中,然后更改它。

把所有这些放在一起,你需要做的就是改变

foreach ($NIC in $NICs) {$NIC.EnableStatic("10.0.0.$($ipaddress++)", "255.255.255.0")

foreach ($NIC in $NICs) {$NIC.EnableStatic("10.0.0.$((++$ipaddress))", "255.255.255.0")


更新

问题的措辞含糊不清。我认为“我想将 IP 地址增加 1”,意思是您希望将 IP 地址设置为比变量 $ipaddress 的值高 1(我认为这来自于读取当前的值)之前某个时刻的 IP 地址)。如果您的意思是您想要为每个连续的 NIC 分配越来越多的 IP 地址(从 15 开始),那么 TheMadTechnician 的答案是有效的,但您也可以通过这种方式更紧凑地完成此操作,因为问题的根源在于您插入了一个使用

$($ipaddress++)
:

将空值放入字符串中
foreach ($NIC in $NICs) {$NIC.EnableStatic("10.0.0.$(($ipaddress++))", "255.255.255.0")

0
投票

嗨,感谢 weq 的回答,它让我找到了一种方法来完成完整的 8 字节增量。 我不知道这是否是您正在寻找的东西,但对我来说它非常有用。

# $i being the increment.
[IPAddress](([IPAddress]"192.168.104.0").Address + (($i-band 255) -shl 24) + ((($i -shr 8) -band 255) -shl 16) + ((($i -shr 16) -band 255) -shl 8) + (($i -shr 24) -band 255))

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.