3

ディレクトリに 6 つの .txt ファイルがあります。したがって、次のように変数を作成します。

$foo = gci -Name *.txt

$foo6 つの文字列の配列になりました。私の場合、私は持っています

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 :

それは私が期待していたものではありません。何が起きてる?

4

2 に答える 2

8

実行すると:

$foo | measure-object

PowerShell はコレクション/配列を自動的に展開し、各要素をパイプラインを介して次のステージに渡します。

実行すると:

measure-object -inputobject $foo

コマンドレットは、コレクションを内部的に展開しません。これは、PowerShell に自動アンロールを実行させずにコレクションを検査する場合に役立つことがよくあります。ところで、同じことが Get-Member にも当てはまります。個々の要素ではなく「コレクション」のメンバーを表示する場合は、次のようにします。

get-member -inputobject $foo

パイプラインのケースでこれをシミュレートする 1 つの方法は次のとおりです。

,$foo | Get-Member

これにより、foo が何であれ (この場合はコレクション)、1 つの要素を持つ別のコレクションにラップされます。PowerShell がそれを自動的にアンロールして要素をパイプラインに送信すると、唯一の要素が$fooパイプラインに送信されます。

于 2013-08-28T17:00:32.507 に答える
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集計します。価値があるのは、TechnetGet-Helpリファレンスのすべての使用例で、このパラメーターのパイプライン入力が使用されていることです。

于 2013-08-28T17:00:13.380 に答える