随着PowerShell V3的出现而不必写:
Get-Process | Where { $_.ProcessName -match "win" }
......现在可以写更简洁了:
Get-Process | Where ProcessName -match "win"
...使用shell的明确胜利( ahem )。
现在让我说我有一个简单的字符串数组,称之为$stuff
。有可能减少这个:
$stuff | Where { $_ -match "win" }
...以与第一个例子类似的方式,即删除脚本块并引用整个对象,在这种情况下?
答案 0 :(得分:1)
减少
$stuff | Where { $_ -match "win" }
你可以像这样(适用于所有的PowerShell版本):
$stuff = "a","b","win", "winona", "d", "windows"
$stuff -match "win"
win
winona
windows
答案 1 :(得分:0)
表单Get-Process | Where ProcessName -match "win"
称为比较语句。由于Where-Object
's documentation并没有真正解释这些内容的含义,因此记录的功能很差。
原因比较语句适用于Get-Process
但不适用于$stuff
,前者返回System.Diagnostics.Process
个对象的数组,后者为String
。比较语句需要用于过滤的属性名称。
让我们看看每个阵列成员中可用的内容。首先是这样的过程,
$proc = get-process
gm -InputObject $proc[0] -MemberType property
TypeName: System.Diagnostics.Process
Name MemberType Definition
...
ProcessName Property string ProcessName {get;}
...
因此,有一个ProcessName
属性,因此Where-Object
可以使用它进行过滤。
字符串数组:
$stuff = @("foo", "bar", "zoffo", "qazzer")
gm -InputObject $stuff[0] -MemberType property
TypeName: System.String
Name MemberType Definition
Length Property int Length {get;}
String
中只有一个属性是它的长度。果然,它可以像这样过滤,
$stuff | where length -ne 3
zoffo
qazzer
$stuff | where length -eq 3
foo
bar
由于没有其他属性类型的成员,过滤字符串数组的唯一方法是使用经典脚本块模式。