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

我试图testing一个特定的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. 不能保证$ wmi是一个单独的对象,所以试图调用它的方法是一个信念的飞跃,你的filter将只匹配一个网卡。 如果有多个具有IP地址的NIC,则Get-WmiObject将返回表示NIC的对象数组。 这可能有两个影响之一:

    • 在PowerShell版本1和2中, $ wmi.ipaddress将为空,并且所有方法调用都将失败,因为这些方法不是数组对象的有效方法。
    • 在PowerShell版本3和更高版本中, $ wmi.ipaddress将是arrays中所有NIC上的所有IP地址的数组。 更糟糕的是,您的方法调用将应用于数组中的每个对象,这意味着您正在尝试为多个NICconfiguration相同的IP地址。
  2. 正如TessellatingHeckler已经提到的, IPAddress属性是一个数组。 如果你提供一个数组作为比较运算符的左操作数,PowerShell会返回一个匹配的所有元素的数组(例如('a', 'b', 'c', 'd') -ne 'c'一个('a', 'b', 'c', 'd') -ne 'c'返回一个数组的stringabd )。

    因此, 如果IF $ wmi是单个对象,那么如果NIC具有除10.0.0.15以外的任何IP地址,则testing条件($wmi.ipaddress -ne "10.0.0.15")将为真。 如果你的网卡没有多个IP地址,那么这个条件决定网卡是否没有这个IP地址,但是是以一种迂回的方式 – 因为比较的返回值是一个空数组,它转换为假布尔值。

    另一方面,如果一个网卡有IP地址10.0.0.15和任何其他的IP地址,那么这个条件将返回True,因为比较将返回一个其他IP地址的数组。

    在TessellatingHeckler的答案中的testing条件,

     ($wmi.IPAddress -notcontains "10.0.0.15") 

    将工作,或以下也将工作

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

    因为如果IPAddress数组包含10.0.0.15,它将仅为False。

然而,除非你在1中解决这个问题,否则2中的testing条件都不会帮助你。 在这两种情况下,如果任何一个网卡的IP地址为10.0.0.15,这个条件将会返回False,这实际上可能是你想要的,但是你将试图在多个网卡上设置相同的IP地址。

请参阅我在Stack Overflow上发布的最后一部分,了解如何确保从Get-WmiObject Win32_NetworkAdapterConfiguration一个对象。 但是,这并不能保证你会select正确的网卡。 这不是我可以告诉你该怎么做的,因为如果有多个NIC,其中IPEnabled为真,我不知道按照什么标准确定哪个NIC将被分配所需的IP地址。

最后一个想法是:你是否有机会试图在远程计算机上执行这个脚本? 如果是这样,请参阅此提供给某个用户的脚本,该脚本尝试使用PowerShell WMI对象更改远程计算机上的IPconfiguration时遇到问题。

Win32_NetworkAdapterConfiguration对象中的IPAddress是一个string数组 ,而不是一个string – 所以您可能需要testingIP地址是否不在数组中,而不是它与数组不相等。

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