Я пытаюсь проверить конкретный 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")}
Пара проблем.
Нет никакой гарантии, что $ wmi представляет собой отдельный объект, поэтому попытка вызвать для него методы - это большая уверенность в том, что ваш фильтр будет соответствовать только одной сетевой карте. Если существует несколько сетевых адаптеров с IP-адресом, Get-WmiObject вернет массив объектов, представляющих сетевые карты. Это может иметь один из двух эффектов:
Как уже упоминал TessellatingHeckler, Айпи адрес свойство - это массив. Если вы предоставляете массив в качестве левого операнда оператора сравнения, PowerShell возвращает массив всех совпадающих элементов (например, ('a', 'b', 'c', 'd') -ne 'c'
возвращает массив строк a
, b
, и d
).
Так, ЕСЛИ $ wmi это один объект, ваше тестовое условие ($wmi.ipaddress -ne "10.0.0.15")
будет истинным, если у сетевого адаптера есть IP-адреса, отличные от 10.0.0.15. Если ни один из ваших сетевых адаптеров не имеет нескольких IP-адресов, это условие воля поработайте, чтобы определить, нет ли у сетевого адаптера этого IP-адреса, но окольным путем - потому что возвращаемое значение сравнения - пустой массив, который преобразуется в логическое значение False.
С другой стороны, если сетевая карта имеет IP-адрес 10.0.0.15 и любой другой IP-адрес (а), тогда условие вернет True, потому что сравнение вернет массив других IP-адресов.
Условие теста в ответе TessellatingHeckler,
($wmi.IPAddress -notcontains "10.0.0.15")
будет работать, или также будут работать следующие
(! ($wmi.IPAddress -eq "10.0.0.15"))
потому что оно будет ложным, только если Айпи адрес массив включает 10.0.0.15.
Однако ни одно из условий испытаний в 2. поможет вам, если вы не решите проблему в 1.. В обоих случаях условие вернет False, если любой сетевых карт имеют IP-адрес 10.0.0.15, который, вероятно, и есть то, что вы делать хотите, но тогда вы попытаетесь установить один и тот же IP-адрес на нескольких сетевых адаптерах.
Смотрите последнюю часть этот ответ я опубликовал в Stack Overflow для предложений о том, как убедиться, что вы получаете только один объект из Get-WmiObject Win32_NetworkAdapterConfiguration
. Однако это не гарантирует, что вы выберете право NIC. Я не могу сказать вам, как это сделать, потому что я не знаю, по каким критериям вы хотите определить, какой сетевой карте будет назначен желаемый IP-адрес, если есть несколько сетевых адаптеров, где IPEnabled правда.
Последняя мысль: вы случайно не пытаетесь выполнить этот скрипт на удаленном компьютере? Если да, см. этот обходной путь Я предоставил кому-то, у кого были проблемы со сценарием, который пытался использовать объект PowerShell WMI для изменения конфигурации IP на удаленном компьютере.
IPAddress в объекте Win32_NetworkAdapterConfiguration является строкой массив, а не строка - поэтому вам может потребоваться проверить, не указан ли IP-адрес в массиве, а не равен ли он массиву:
if ($wmi.IPAddress -notcontains "10.0.0.15") { ... }