Переключение на оператор -match
на основе регулярных выражений , как предлагается в комментариях, является самым простым решением:
Where-Object InterfaceAlias -match '^Wi-?Fi$' # matches both 'WiFi' and 'Wi-Fi'
Обратите внимание на необходимость использования якорей ^
(начало строки) и $
(конец строки), чтобы обеспечить совпадение строки whole ; по умолчанию -match
также находит подстрок . Дублирующий символ ?
означает, что предыдущее подвыражение (здесь символ -
) соответствует 0 или 1 времени, что означает, что оно соответствует, если присутствует, а также, если нет,
Также:
Обратите внимание, что цитирование вашей команды не работает и только случайно работает: не экранируя "
символов. вокруг (предполагаемых) встроенных "
символов. (например, в "Wi-Fi"
они фактически удаляются до того, как PowerShell их видит; это только потому, что PowerShell также принимает без кавычек аргументов в режиме анализа аргументов , что тем не менее, ваша команда работает.
- Хотя вы можете использовать
\"
для экранирования встроенных двойных кавычек, более простой подход состоит в том, чтобы просто полностью их здесь опустить, или, если цитирование необходимо с точки зрения PowerShell, использовать '
(одинарные кавычки) для встроенных кавычек.
Вместо того, чтобы использовать 3 отдельных вызова Where-Object
, вы можете свернуть их в один с помощью одного блока сценария ({ ... }
), объединяя условные выражения с оператором -and
, обратите внимание, что код в приведенном ниже блоке скрипта анализируется в режиме выражения , который делает требует, чтобы буквенные строковые операнды были заключены в кавычки.
Тем более, что вы ожидаете только one возвращаемого значения, проще и эффективнее заменить ... | Select-Object -ExpandProperty IPAddress
на (...).IPAddress
.
В качестве отступления: в Windows PowerShell CLI , powershell.exe
параметр -Command
подразумевается, когда вы передаете командную строку позиционно ; обратите внимание, что в CLI PowerShell [Core] v6 + по умолчанию теперь используется значение -File
, поэтому вам придется использовать pwsh -ExecutionPolicy Bypass -Command "..."
там.
powershell -ExecutionPolicy Bypass "(Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.InterfaceAlias -match '^Wi-?Fi$' -and $_.AddressState -eq 'Preferred' -and $_.PrefixOrigin -eq 'dhcp').IPAddress"