如何在没有脚本块的情况下引用整个管道对象

时间:2014-05-05 23:43:46

标签: powershell scriptblock

随着PowerShell V3的出现而不必写:

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

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

Get-Process | Where ProcessName -match "win"

...使用shell的明确胜利( ahem )。

现在让我说我有一个简单的字符串数组,称之为$stuff。有可能减少这个:

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

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

2 个答案:

答案 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

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