在Powershell的“位置”内使用Or语句

时间:2019-07-08 16:08:04

标签: powershell

我正在编写一个脚本,以查找名称类似于“ 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 个答案:

答案 0 :(得分:3)

我相信这里的问题不是使用Where-Object脚本块。如果将查询修改为以下内容,则问题将消失。

Get-WmiObject Win32_Product | Where-Object {$_.Name -like "Microsoft Office S*" -or $_.Name -like "Microsoft Office P*"}

答案 1 :(得分:0)

除了使用脚本块和-或在何处,像这样的正则表达式很方便:

where name -match 'Microsoft Office S|Microsoft Office P'

答案 2 :(得分:0)

对集成帮助有所帮助:

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)

对于第四个示例,获取帮助显示where对象没有'or'参数。因此无法正常工作。

在阅读帮助时,请记住inputObject参数包含流水线的psObject。

建议解决方案很好,但我将提出与帮助相匹配的另一种形式:

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

如果您需要紧凑的单机版,则等效于:

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

(?是where-object的别名)