如何检查特定的 IP 地址,如果不存在则更改它?

如何检查特定的 IP 地址,如果不存在则更改它?

我正在尝试测试特定的 IP 地址,如果 Powershell 中不存在该地址,则更改它。

我不确定我的代码有什么问题:

if($wmi.ipaddress -ne "10.0.0.15") {$wmi = Get-WmiObject win32_networkadapterconfiguration -filter "ipenabled ='true'"
                                       $wmi.EnableStatic("10.0.0.15", "255.255.255.0")
                                       $wmi.SetGateways("10.0.0.1", 1)
                                       $wmi.SetDNSServerSearchOrder("127.1.1.12")}

答案1

有几个问题。

  1. 没有人能保证西米是单个对象,因此尝试调用其方法需要坚信您的过滤器只会匹配一个 NIC。如果有多个 NIC 具有 IP 地址,获取 WmiObject将返回表示 NIC 的对象数组。这可以产生以下两种效果之一:

    • 在 PowerShell 版本 1 和 2 中,$wmi.ip地址将为空,并且所有方法调用都将失败,因为这些不是数组对象的有效方法。
    • 在 PowerShell 版本 3 及更高版本中,$wmi.ip地址将是数组中所有 NIC 上的所有 IP 地址的数组。更糟糕的是,您的方法调用将应用于数组中的每个对象,这意味着您正在尝试为多个 NIC 配置相同的 IP 地址。

  2. 正如 TessellatingHeckler 已经提到的,IP地址属性是一个数组。如果将数组作为比较运算符的左操作数,PowerShell 将返回匹配的所有元素的数组(例如,('a', 'b', 'c', 'd') -ne 'c'返回字符串ab和 的数组d)。

    所以,如果 西米是单个对象,($wmi.ipaddress -ne "10.0.0.15")如果 NIC 具有除 10.0.0.15 之外的任何 IP 地址,则测试条件将为真。如果您的所有 NIC 都没有多个 IP 地址,则此条件将要确定 NIC 是否没有该 IP 地址,但却是以一种迂回的方式——因为比较的返回值是一个空数组,它会转换为 False 布尔值。

    另一方面,如果 NIC 具有 IP 地址 10.0.0.15 和任何其他 IP 地址,则条件将返回 True,因为比较将返回其他 IP 地址的数组。

    TessellatingHeckler 的答案中的测试条件,

    ($wmi.IPAddress -notcontains "10.0.0.15")
    

    可以,或者下面的也可以

    (! ($wmi.IPAddress -eq "10.0.0.15"))
    

    因为只有当IP地址数组包括 10.0.0.15。

然而,2.会帮助你,除非你解决问题1.. 在这两种情况下,如果任何NIC 的 IP 地址为 10.0.0.15,这实际上可能就是您想要,但随后您将尝试在多个 NIC 上设置相同的 IP 地址。

参见最后一部分我在 Stack Overflow 上发布的这个答案了解如何确保只从 中获取一个对象Get-WmiObject Win32_NetworkAdapterConfiguration。但是,这并不能确保您会选择正确的NIC。我无法告诉你该怎么做,因为我不知道如果有多个 NIC,你想根据什么标准来确定哪个 NIC 将被分配所需的 IP 地址已启用 IP是真的。

最后想说一句:您是否尝试在远程计算机上执行此脚本?如果是,请参阅这个解决方法我向某个在使用脚本时遇到问题的人提供了该脚本,该脚本试图使用 PowerShell WMI 对象来更改远程计算机上的 IP 配置。

答案2

Win32_NetworkAdapterConfiguration 对象中的 IPAddress 是一个字符串大批,而不是字符串——因此您可能需要测试 IP 地址是否不在数组中,而不是测试它是否不等于数组:

if ($wmi.IPAddress -notcontains "10.0.0.15") { ... }

相关内容