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

Wal*_*mly 2 windows powershell scripting

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

$foo = gci -Name *.txt
Run Code Online (Sandbox Code Playgroud)

$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
Run Code Online (Sandbox Code Playgroud)

我想测量那个对象,所以我把它传递给Measure-Object:

PS > $foo | Measure-Object

Count    : 6
Average  :
Sum      :
Maximum  :
Minimum  :
Property :
Run Code Online (Sandbox Code Playgroud)

这就是我所期待的.但是,我也可能这样通过$foo:

PS> Measure-Object -InputObject $foo

Count    : 1
Average  :
Sum      :
Maximum  :
Minimum  :
Property :
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*ill 8

执行时:

$foo | measure-object
Run Code Online (Sandbox Code Playgroud)

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

执行时:

measure-object -inputobject $foo
Run Code Online (Sandbox Code Playgroud)

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

get-member -inputobject $foo
Run Code Online (Sandbox Code Playgroud)

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

,$foo | Get-Member
Run Code Online (Sandbox Code Playgroud)

这将使用一个元素包装另一个集合中的foo(在本例中为collection).当PowerShell自动展开它以沿管道发送元素时,唯一的元素是$foo从管道发送的.