为什么'Measure-Object -InputObject $ foo'与'$ foo |不同PowerShell中的Measure-Object'?

时间:2013-08-28 16:32:04

标签: windows powershell scripting

我在目录中有六个.txt文件。所以,我创建了一个变量:

$foo = gci -Name *.txt

$foo现在是一个包含六个字符串的数组。在我的情况下,我有

PS > $foo
Extensions.txt
find.txt
found_nots.txt
output.txt
proteins.txt
text_files.txt

PS > $foo.gettype()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS > $foo.Count
6

我想测量该对象,因此我将其传递给Measure-Object

PS > $foo | Measure-Object

Count    : 6
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

这就是我所期待的。但是,我也可以这样传递$foo

PS> Measure-Object -InputObject $foo

Count    : 1
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

这不是我所期待的。这是怎么回事?

2 个答案:

答案 0 :(得分:8)

执行时:

$foo | measure-object

PowerShell会自动展开集合/数组,并将每个元素沿着管道传递到下一个阶段。

执行时:

measure-object -inputobject $foo

cmdlet不会在内部展开集合。如果要在不让PowerShell自动展开的情况下检查集合,这通常会很有用。 BTW同样适用于Get-Member。如果你想看到“集合”上的成员而不是每个单独的元素,请执行以下操作:

get-member -inputobject $foo

在管道案例中模拟这种情况的一种方法是:

,$foo | Get-Member

这将包含一个元素的另一个集合中的foo(在本例中为collection)。当PowerShell自动展开它以便在管道中发送元素时,唯一的元素是$foo,它将被发送到管道中。

答案 1 :(得分:0)

PowerShell可以帮到你。我们来看看Get-Help Measure-Object -full并查看该参数。

-InputObject <psobject>
    Specifies the objects to be measured. Enter a variable that contains 
    the objects, or type a command or expression that gets the objects.

    Required?                    false
    Position?                    named
    Default value
    Accept pipeline input?       true (ByValue)
    Accept wildcard characters?  false

管道输入由值接受,这意味着它计算$foo的每一行并计算它们。对于它的价值,所有example usages on TechnetGet-Help引用都使用此参数的管道输入。