使用Powershell中的"Where-Object"过滤输出

Jac*_*son 12 powershell

我正试图进入PowerShell并遇到了我的第一个障碍.

我跑的时候

Get-Command | Where-Object CommandType -contains Cmdlet
Run Code Online (Sandbox Code Playgroud)

我的输出被过滤,因此只显示包含"Cmdlet"的"CommandType"属性值的命令,如下所示:

在此输入图像描述

对象"Source"可以完成同样的事情:

Get-Command | Where-Object Source -contains appx
Run Code Online (Sandbox Code Playgroud)

哪个让我:

在此输入图像描述

但是当我尝试运行时:

Get-Command | Where-Object Name -contains Add
Run Code Online (Sandbox Code Playgroud)

我一无所获.为什么我可以通过对象"CommandType"和"Source but not"Name来过滤输出?我肯定在这里遗漏了一些东西......

编辑:我知道我可以运行:

Get-Command -verb "get"
Run Code Online (Sandbox Code Playgroud)

并获得所需的输出.但我想弄清楚为什么我的"where-object"声明不起作用.

编辑2:

如果我使用"-match"比较运算符,它很有用......

get-command | where-object Name -match "add"
Run Code Online (Sandbox Code Playgroud)

但是不是"名称"属性只是字符串?-match应该用于正则表达式比较afaik?我现在很困惑......

Kir*_*ran 17

使用likematch运算符:

Get-Command | Where-Object Name -like Add*
Run Code Online (Sandbox Code Playgroud)

这将匹配单词中的任何位置

Get-Command | Where-Object Name -match Add
Run Code Online (Sandbox Code Playgroud)

但更好的方法是:

Get-Command -verb Add
Run Code Online (Sandbox Code Playgroud)

阅读更多关于包含运营商在这里

-Contains描述:遏制操作员.判断参考值集合是否包含单个测试值.始终返回布尔值.仅当测试值与至少一个参考值完全匹配时,才返回TRUE.

      PS C:\> "abc", "def" -Contains "def"
      True
Run Code Online (Sandbox Code Playgroud)

  • 哦,我现在明白了... -contains 仅当精确值包含在一组对象中时才返回 true。我认为每个单独的对象都被解析为内联匹配。谢谢。 (2认同)