2017-10-06 2 views
0

foreach-object操作の結果を別のforeach-object操作にパイプすることができないのはなぜですか?最後のForEach-Objectループを実行することができません。何も出力しません。Powershell pipline foreach-object

$mailboxstatistics | 
Select-Object -First 20 | 
Where { $_.FolderPath.Contains("/Inkorg") -eq $True } | 
ForEach-Object -Begin{ 
     Write-Host "Begin" 
    } -Process{ 
     #Write-Host "Process" 
     Write-Host $($_.FolderPath) 
    } -End{ 
     Write-Host "End" 
    } | 
ForEach-Object{ 
    Write-Host "test" 
} 
+1

'Write-Host'は' Write-Output'ではありません。一般的にどちらも使用していません(明示的に)、パイプライン自体の値を返します( 'Write-Output'呼び出しと同じ効果があります)。 –

+1

あなたの声明を破るのを恐れてはいけません。最初の20の内容に変数を設定し、この変数を最初のforeachにパイプし、次にそれを次のforeachにパイプします。あなたの場合でも、最初のforeachで必要な操作をすべて実行しない理由はわかりません。 –

+0

オブジェクトにWrite-Hostを使用しているようですが、($ _。FolderPath)はループがオブジェクトを渡すのをブロックしている原因です。ありがとう、それを知らなかった。もしそれがパイプラインを通過するときにオブジェクトプロパティ値を(ブロックせずに)出力したいのであれば、debug.writeline()のような適切なコマンドがありますか? – Molotch

答えて

0

私のオリジナルの答えを編集:現実的な解決策とは対照的に、あなたは「なぜパイプラインは別のForEach 1つのForEachからあなたのパイプを聞かせていない」求めています。これには、パイプラインの基本的な定義が必要です。から:

  • マイケルシェパードによる管理タスクの自動化。 Chendrayan Venkatesan;シェリフ・タラート; Brenton J.W. Blawat 「PowerShellのパイプラインは簡単に言えば。別のコマンドからのデータを取得するための機構であり、最初のコマンドから出力されたデータは、パイプラインの次のコマンドへの入力として扱われます。」

PowerShellのパイプラインは、テキストを渡す可能性のある他の種類のシェルとは対照的に、.NETフレームワークオブジェクトを渡します。したがって、上記の定義に基づいて、For-EachObjectが次のシーケンスのパイプラインからの入力として出力されることを期待しているのは何ですか? Where-ObjectまたはSelect-Objectを実行しているときは、コレクションを改良しています。すでにオブジェクトがWrite-Hostに送信されていることを示しています。 ForEachが終了した後、パイプラインには何も出力されません。

私はパイプラインのデイジーチェーンのメリットがわかりません。私はこれについて間違っている可能性があります、私は一般的に変数でシーケンスを壊します。 ForEachは、配管された収集品のすべての品目を消費して操作し、次に配管チェーンの次の品目を正確に生産または配管しますか? ForEachは配列などのオブジェクトのコレクションとしてパイプライン入力を受け入れることができると私は理解しています。だから、古典

for($i = 0; $i-lt $collectionOfOjbects.Length; $i++) 
{ 
    Verb-Noun $collectionOfObjects[$i] 
} 

とは対照的に、私は、唯一の項目数を反復処理のその使用に利点を見ることがforeachの反復にいることを、パイプ、その後、第1精製をソート/選択をしようとすることは可能ですか?

$myFirst20MailboxStatsInkorg = $mailboxstatistics | Select-Object -First 20 | Where { $_.FolderPath.Contains("/Inkorg") -eq $True } 
#first round of iteration: 
$myFirst20MailboxStatsInkorg | ForEach-Object -Begin{ 
     Write-Host "Begin" 
    } -Process{ 
     #Write-Host "Process" 
     Write-Host $($_.FolderPath) 
    } -End{ 
     Write-Host "End" 
    } 
#second round of iteration 
$myFirst20MailboxStatsInkorg | ForEach-Object{ 
    Write-Host "test" 
} 
+0

もちろんですが、この質問は、最初のforeach-objectループがオブジェクトをパイプに渡さなかった理由に関するものです。なぜWrite-Hostは、オブジェクトプロパティの値だけでなく、オブジェクト全体をホストに振り向けるのですか? – Molotch

関連する問題