Where-Object

根据属性值从集合中选择对象。

语法

Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     [-EQ]
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-FilterScript] <ScriptBlock>
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Match
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CEQ
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -GT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CGT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -LT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CLT
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -GE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CGE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -LE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CLE
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Like
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CLike
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotLike
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotLike
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CMatch
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotMatch
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotMatch
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Contains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CContains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotContains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotContains
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -In
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CIn
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -NotIn
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -CNotIn
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -Is
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     [[-Value] <Object>]
     -IsNot
     [<CommonParameters>]
Where-Object
     [-InputObject <PSObject>]
     [-Property] <String>
     -Not
     [<CommonParameters>]

说明

cmdlet Where-Object 从传递给它的 对象集合中选择具有特定属性值的对象。 例如,可以使用 Where-Object cmdlet 选择在特定日期之后创建的文件、具有特定 ID 的事件或使用特定版本的 Windows 的计算机。

从 Windows PowerShell 3.0 开始,有两种不同的方法来构造Where-Object命令。

  • 脚本块。 你可以使用脚本块指定属性名称、比较运算符和属性值。 Where-Object 返回脚本块语句为 true 的所有对象。

    例如,以下命令获取优先级类中的 Normal 进程,即 PriorityClass 属性值等于 Normal的进程。

    Get-Process | Where-Object {$_.PriorityClass -eq "Normal"}

    所有 PowerShell 比较运算符在脚本块格式中都有效。 有关详细信息,请参阅 about_Comparison_Operators

  • 比较语句。 你还可以编写比较语句,它更像自然语言。 Windows PowerShell 3.0 中引入了比较语句。

    例如,以下命令还会获取优先级为 的进程 Normal。 这些命令是等效的,因此可以互换使用。

    Get-Process | Where-Object -Property PriorityClass -eq -Value "Normal"

    Get-Process | Where-Object PriorityClass -eq "Normal"

    从 Windows PowerShell 3.0 开始,Where-Object在命令中添加Where-Object比较运算符作为参数。 除非另有指定,否则所有运算符都不区分大小写。 在 Windows PowerShell 3.0 之前,PowerShell 语言中的比较运算符只能在脚本块中使用。

向 提供单个 PropertyWhere-Object时,该属性的值被视为布尔表达式。 当 Length 的值不为零时,表达式的计算结果为 $true。 例如: ('hi', '', 'there') | Where-Object Length

前面的示例在功能上等效于:

  • ('hi', '', 'there') | Where-Object Length -GT 0
  • ('hi', '', 'there') | Where-Object {$_.Length -gt 0}

有关如何计算布尔值的详细信息,请参阅 about_Booleans

示例

示例 1:获取已停止的服务

这些命令获取当前已停止的所有服务的列表。 自动 $_ 变量表示传递给 Where-Object cmdlet 的每个对象。

第一个命令使用脚本块格式,第二个命令使用比较语句格式。 这两个命令是等效的,因此可以互换使用。

Get-Service | Where-Object {$_.Status -eq "Stopped"}
Get-Service | where Status -eq "Stopped"

示例 2:基于工作集获取进程

这些命令列出工作集大于 250 MB (MB) 的进程。 scriptblock 和 语句语法是等效的,可以互换使用。

Get-Process | Where-Object {$_.WorkingSet -GT 250MB}
Get-Process | Where-Object WorkingSet -GT (250MB)

示例 3:根据进程名称获取进程

这些命令获取具有以字母 p开头的 ProcessName 属性值的进程。 Match 运算符允许使用正则表达式匹配项。

scriptblock 和 语句语法是等效的,可以互换使用。

Get-Process | Where-Object {$_.ProcessName -Match "^p.*"}
Get-Process | Where-Object ProcessName -Match "^p.*"

示例 4:使用比较语句格式

此示例演示如何使用 cmdlet 的新比较语句格式 Where-Object

第一个命令使用比较语句格式。 在此命令中,未使用别名,并且所有参数都包含参数名称。

第二个命令是比较命令格式的更自然的用法。 别名 whereWhere-Object 替换为 cmdlet 名称,并省略所有可选参数名称。

Get-Process | Where-Object -Property Handles -GE -Value 1000
Get-Process | where Handles -GE 1000

示例 5:获取基于属性的命令

此示例演示如何编写可返回项(true 或 false)的命令或具有指定属性的任意值的命令。 每个示例都显示了命令的脚本块和比较语句格式。

# Use Where-Object to get commands that have any value for the OutputType property of the command.
# This omits commands that do not have an OutputType property and those that have an OutputType
# property, but no property value.
Get-Command | where OutputType
Get-Command | where {$_.OutputType}

# Use Where-Object to get objects that are containers.
# This gets objects that have the **PSIsContainer** property with a value of $True and excludes all
# others.
Get-ChildItem | where PSIsContainer
Get-ChildItem | where {$_.PSIsContainer}

# Finally, use the Not operator (!) to get objects that are not containers.
# This gets objects that do have the **PSIsContainer** property and those that have a value of
# $False for the **PSIsContainer** property.
Get-ChildItem | where {!$_.PSIsContainer}
# You cannot use the Not operator (!) in the comparison statement format of the command.
Get-ChildItem | where PSIsContainer -eq $False

示例 6:使用多个条件

Get-Module -ListAvailable | where {
    ($_.Name -notlike "Microsoft*" -and $_.Name -notlike "PS*") -and $_.HelpInfoUri
}

此示例演示如何创建 Where-Object 具有多个条件的命令。

此命令可获取用于支持可更新帮助功能的非核心模块。 该命令使用 cmdlet 的 Get-ModuleListAvailable 参数获取计算机上的所有模块。 管道运算符 (|) 将模块发送到 Where-Object cmdlet,该 cmdlet 获取名称不以 MicrosoftPS开头的模块,并且具有 HelpInfoURI 属性的值,该属性指示 PowerShell 在何处查找模块的更新帮助文件。 比较语句由 And 逻辑运算符连接。

该示例使用脚本块命令格式。 逻辑运算符(如 AndOr)仅在脚本块中有效。 不能在命令的比较语句格式 Where-Object 中使用它们。

参数

-CContains

指示如果对象的属性值与指定值完全匹配,则此 cmdlet 从集合中获取对象。 此操作区分大小写。

例如: Get-Process | where ProcessName -CContains "svchost"

CContains 引用值的集合,如果集合包含与指定值完全匹配的项,则为 true。 如果输入是单个对象,PowerShell 会将其转换为一个对象的集合。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CEQ

指示如果属性值与指定值相同,则此 cmdlet 获取对象。 此操作区分大小写。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CGE

指示如果属性值大于或等于指定值,则此 cmdlet 获取对象。 此操作区分大小写。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CGT

指示如果属性值大于指定值,则此 cmdlet 获取对象。 此操作区分大小写。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CIn

指示如果属性值包含指定值,则此 cmdlet 获取对象。 此操作区分大小写。

例如: Get-Process | where -Value "svchost" -CIn ProcessName

CIn 类似于 CContains,只不过属性和值位置是相反的。 例如,以下语句都为 true。

"abc", "def" -CContains "abc"

"abc" -CIn "abc", "def"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CLE

指示如果属性值小于或等于指定值,则此 cmdlet 获取对象。 此操作区分大小写。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CLike

指示如果属性值与包含通配符的值匹配,则此 cmdlet 获取对象 (*) 。 此操作区分大小写。

例如: Get-Process | where ProcessName -CLike "*host"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CLT

指示如果属性值小于指定值,则此 cmdlet 获取对象。 此操作区分大小写。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CMatch

指示如果属性值与指定的正则表达式匹配,则此 cmdlet 获取对象。 此操作区分大小写。 当输入为标量时,匹配的值保存在自动变量中 $Matches

例如: Get-Process | where ProcessName -CMatch "Shell"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CNE

指示如果属性值不同于指定值,则此 cmdlet 获取对象。 此操作区分大小写。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CNotContains

指示如果对象的属性值与指定值不完全匹配,则此 cmdlet 获取对象。 此操作区分大小写。

例如: Get-Process | where ProcessName -CNotContains "svchost"

NotContainsCNotContains 引用值的集合,当集合不包含与指定值完全匹配的任何项时,为 true。 如果输入是单个对象,PowerShell 会将其转换为一个对象的集合。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CNotIn

指示如果属性值与指定值不完全匹配,则此 cmdlet 获取对象。 此操作区分大小写。

例如: Get-Process | where -Value "svchost" -CNotIn -Property ProcessName

NotInCNotIn 运算符类似于 NotContainsCNotContains,只不过属性和值位置是相反的。 例如,以下语句为 true。

"abc", "def" -CNotContains "Abc"

"abc" -CNotIn "Abc", "def"

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CNotLike

指示如果属性值与包含通配符的值不匹配,则此 cmdlet 获取对象。 此操作区分大小写。

例如: Get-Process | where ProcessName -CNotLike "*host"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-CNotMatch

指示如果属性值与指定的正则表达式不匹配,则此 cmdlet 获取对象。 此操作区分大小写。 当输入为标量时,匹配的值保存在自动变量中 $Matches

例如: Get-Process | where ProcessName -CNotMatch "Shell"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Contains

指示如果对象的属性值中的任何项与指定值完全匹配,则此 cmdlet 获取对象。

例如: Get-Process | where ProcessName -Contains "Svchost"

如果属性值包含单个对象,PowerShell 会将其转换为一个 对象的集合。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:IContains
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-EQ

指示如果属性值与指定值相同,则此 cmdlet 获取对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:IEQ
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilterScript

指定用于筛选对象的脚本块。 将脚本块括在大括号 ({}) 中。

参数名称 FilterScript 是可选的。

Type:ScriptBlock
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-GE

指示如果属性值大于或等于指定值,则此 cmdlet 获取对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:IGE
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-GT

指示如果属性值大于指定值,则此 cmdlet 获取对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:IGT
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-In

指示如果属性值与任何指定值匹配,则此 cmdlet 获取对象。 例如:

Get-Process | where -Property ProcessName -in -Value "Svchost", "TaskHost", "WsmProvHost"

如果 Value 参数的值为单个对象,则 PowerShell 将其转换为一个对象的集合。

如果对象的属性值是数组,则 PowerShell 使用引用相等性来确定匹配项。 Where-Object 仅当 Property 参数的值和 Value 的任何值都是对象的同一实例时,才返回 对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:IIn
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

指定要筛选的对象。 还可以通过管道将对象传递给 Where-Object

InputObject 参数与 一起使用 Where-Object,而不是将命令结果传递给 Where-Object时, InputObject 值被视为单个对象。 即使值是命令(例如 ) -InputObject (Get-Process)的集合,也是如此。 由于 InputObject 无法从数组或对象的集合返回单个属性,因此我们建议,如果使用 Where-Object 筛选对象集合来查找在定义的属性中具有特定值的对象,请在 Where-Object 管道中使用,如本主题中的示例所示。

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Is

指示如果属性值是指定 .NET 类型的实例,则此 cmdlet 获取对象。 将类型名称括在方括号中。

例如: Get-Process | where StartTime -Is [DateTime]

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-IsNot

指示如果属性值不是指定 .NET 类型的实例,则此 cmdlet 获取对象。

例如: Get-Process | where StartTime -IsNot [DateTime]

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-LE

指示如果属性值小于或等于指定值,则此 cmdlet 获取对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:ILE
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Like

指示如果属性值与包含通配符 * () 的值匹配,则此 cmdlet 获取对象。

例如: Get-Process | where ProcessName -Like "*host"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:ILike
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-LT

指示如果属性值小于指定值,则此 cmdlet 获取对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:ILT
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Match

指示如果属性值与指定的正则表达式匹配,则此 cmdlet 获取对象。 当输入为标量时,匹配的值保存在自动变量中 $Matches

例如: Get-Process | where ProcessName -Match "shell"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:IMatch
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NE

指示如果属性值不同于指定值,则此 cmdlet 获取对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:INE
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Not

指示如果 属性不存在或值为 $null$false,则此 cmdlet 获取对象。

例如: Get-Service | where -Not "DependentServices"

此参数是在 Windows PowerShell 6.1 中引入的。

Type:SwitchParameter
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NotContains

指示如果属性值中的项都与指定值完全匹配,则此 cmdlet 获取对象。

例如: Get-Process | where ProcessName -NotContains "Svchost"

NotContains 引用值的集合,如果集合不包含与指定值完全匹配的任何项,则为 true。 如果输入是单个对象,PowerShell 会将其转换为一个对象的集合。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:INotContains
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NotIn

指示如果属性值不与任何指定值完全匹配,则此 cmdlet 获取对象。

例如: Get-Process | where -Value "svchost" -NotIn -Property ProcessName

如果 Value 的值为单个对象,则 PowerShell 会将其转换为一个对象的集合。

如果对象的属性值是数组,则 PowerShell 使用引用相等性来确定匹配项。 Where-Object 仅当 Property 的值和 Value 的任何 值都不是 对象的同一实例时,才返回 对象。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:INotIn
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NotLike

指示如果属性值与包含通配符 * () 的值不匹配,则此 cmdlet 获取对象。

例如: Get-Process | where ProcessName -NotLike "*host"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:INotLike
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-NotMatch

指示当属性值与指定的正则表达式不匹配时,此 cmdlet 获取对象。 当输入为标量时,匹配的值保存在自动变量中 $Matches

例如: Get-Process | where ProcessName -NotMatch "PowerShell"

已在 Windows PowerShell 3.0 中引入了此参数。

Type:SwitchParameter
Aliases:INotMatch
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Property

指定对象属性的名称。 参数名称 Property 是可选的。

已在 Windows PowerShell 3.0 中引入了此参数。

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Value

指定属性值。 参数名称 Value 是可选的。 与以下比较参数一起使用时,此参数接受通配符:

  • CLike
  • CNotLike
  • 喜欢
  • NotLike

已在 Windows PowerShell 3.0 中引入了此参数。

Type:Object
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:True

输入

PSObject

可以通过管道将对象传递给此 cmdlet。

输出

Object

此 cmdlet 返回输入对象集中的选定项。

备注

从 Windows PowerShell 4.0 开始, WhereForEach添加了用于集合的方法。

可在此处阅读有关这些方法 的详细信息about_arrays