Использование оператора Or в «Где» в Powershell - PullRequest
0 голосов
/ 08 июля 2019

Я делаю сценарий, который находит все программы с именами, похожими на «Microsoft Office S *» - или «Microsoft Office P *»

Я получил код, работающий при поиске одной или другой,но не оба одновременно.Некоторые примеры ниже:

РАБОТАЕТ

get-wmiobject Win32_Product | Where Name -like "Microsoft Office S*"| Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

РАБОТАЕТ

get-wmiobject Win32_Product | Where Name -like "Microsoft Office S*"| Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

НЕ РАБОТАЕТ

get-wmiobject Win32_Product | Where Name -like ("Microsoft Office S*" -or "Microsoft Office P*")| Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

НЕ РАБОТАЕТ

get-wmiobject Win32_Product | Where Name -like ("Microsoft Office S*") -or Name -like ("Microsoft Office S*")| Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Ответы [ 3 ]

3 голосов
/ 08 июля 2019

Я считаю, что проблема здесь не в том, чтобы использовать блок скриптов Where-Object. Если вы измените свой запрос следующим образом, ваши проблемы должны исчезнуть.

Get-WmiObject Win32_Product | Where-Object {$_.Name -like "Microsoft Office S*" -or $_.Name -like "Microsoft Office P*"}
0 голосов
/ 09 июля 2019

Обратите внимание на встроенную справку:

Get-Help Where

В доступном синтаксисе вы найдете

 Where-Object [-Property] <string> [[-Value] <Object>] -Like [-InputObject <psobject>]  [<CommonParameters>]

В третьем примере: «Microsoft Office S *» -или «Microsoft Office P *» оценивается как true, он не работает, потому что он такой же, как:

Where Name -like $True

Что всегда ложно (кроме случаев, когда значение имени равно $ True)

Для вашего четвертого примера get-help показывает, что у объекта where нет параметра 'или'.Так что это может не сработать.

При чтении справки помните, что параметр inputObject содержит конвейерный psObject.

Решения с предложениями хороши, но я предложу эту другую форму, которая соответствуетhelp:

Where-Object -Property Name -Value '^Microsoft Office S|^Microsoft Office P' -match

Если вам нужен компактный однострочник, он эквивалентен:

? Name -match '^Microsoft Office (S|P)'

(? это псевдоним where-object)

0 голосов
/ 08 июля 2019

Помимо использования блока сценариев и -или, где удобно использовать такое регулярное выражение:

where name -match 'Microsoft Office S|Microsoft Office P'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...