Как проверить любую из двух строк в Powershell - PullRequest
1 голос
/ 28 января 2020

Наше приложение использует следующую команду для поиска IP-адреса:

powershell -ExecutionPolicy Bypass "Get-NetIPAddress -AddressFamily IPv4 | Where-object -Property InterfaceAlias -eq "Wi-Fi"  | Where-object -Property AddressState -eq "Preferred" | Where-object -Property PrefixOrigin -eq "dhcp" | Select -ExpandProperty IPAddress"

Я обнаружил, что это не удается на моем ноутбуке, потому что Wi-Fi называется "WiFi" - если я изменю команду на:

Where-object -Property InterfaceAlias -eq "Wi-Fi"

работает нормально. Но как я могу проверить любой из них? Я не могу понять, как изменить команду на что-то вроде Where-object -Property InterfaceAlias (-eq "Wi-Fi" or -eq "WiFi") - это не работает.

1 Ответ

2 голосов
/ 28 января 2020

Переключение на оператор -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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...