为什么'Measure-Object -InputObject $ foo'不同于'$ foo | 测量对象'在PowerShell?

我有一个目录中有六个.txt文件。 所以,我创build了一个variables:

$foo = gci -Name *.txt 

$foo现在是一个由六个string组成的数组。 在我的情况下,我有

 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 : 

那不是我所期待的。 这里发生了什么?

当你执行:

 $foo | measure-object 

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

当你执行:

 measure-object -inputobject $foo 

该cmdlet不会在内部展开集合。 如果你想检查这个集合而不让PowerShell自动展开,这通常是很有用的。 顺便说一句,同样的事情适用于Get-Member。 如果你想看到“收集”而不是每个单独的元素的成员做到这一点:

 get-member -inputobject $foo 

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

 ,$foo | Get-Member 

这将包含任何foo(在这种情况下集合)在另一个集合与一个元素。 当PowerShell自动展开将元素向下发送的流水线时,唯一的元素是$foo ,它被发送到管道中。

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每一行,并记住它们。 对于这个值, Technet和Get-Help引用中的所有示例用法都使用此参数的管道输入。