1

随着 PowerShell V3 的出现,不再需要编写:

Get-Process | Where { $_.ProcessName -match "win" }

...现在可以写得更简洁:

Get-Process | Where ProcessName -match "win"

...外壳使用的明显胜利(ahem)。

现在假设我有一个简单的字符串数组,称之为$stuff. 是否可以减少这种情况:

$stuff | Where { $_ -match "win" }

...以类似于第一个示例的方式,即删除脚本块并引用整个对象,在这种情况下?

4

2 回答 2

1

减少

$stuff | Where { $_ -match "win" } 

你总是可以这样做(适用于所有powershell版本):

$stuff = "a","b","win", "winona", "d", "windows"
$stuff -match "win"
win
winona
windows
于 2014-05-06T07:34:47.420 回答
0

这种形式Get-Process | Where ProcessName -match "win"称为比较语句。这不是一个记录在案的功能,因为Where-Object's 的文档并没有真正解释那些是关于什么的。

比较语句适用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;}

a 中只有一个属性,String即它的长度。果然可以像这样用来过滤,

$stuff | where length -ne 3
zoffo
qazzer
$stuff | where length -eq 3
foo
bar

由于没有其他属性类型的成员,过滤字符串数组的唯一方法是通过经典的脚本块模式。

于 2014-05-06T07:22:39.800 回答