短い質問:誰でもForEach-Objectの-RemainingScriptsパラメータに関する詳細情報を持っていますか?PowerShell:ForEach-Objectの不思議な-RemainingScriptsパラメータ
ロング質問:
私はちょうど先週からPowerShellを学び始めたと私はより多くの詳細を学ぶために、各コマンドレットを通じてつもりです。
Get-ChildItem | foreach -Begin { "block1";
$fileCount = $directoryCount = 0} -Process { "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}} -End {
"block3"; "$directoryCount directories and $fileCount files"}
結果が期待されています:「ブロック1」と「BLOCK3」、「ブロック2」のための1時間がために繰り返されるパブリックのドキュメントに基づいて、我々は、これはのようなのForEach-Objectは、開始・プロセス・エンド・ブロックを持つことができます知っています渡された各項目、およびdirカウント/ファイル数はすべて正しいです。ここまでは順調ですね。 foreachのために渡された
Get-ChildItem | foreach { "block1"
$fileCount = $directoryCount = 0}{ "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{
"block3"; "$directoryCount directories and $fileCount files"}
わずか3 ScriptBlocks:
は今、どのような興味深いのは、次のコマンドも作品とまったく同じ結果を与える、です。マニュアルに基づいて、最初のものは「プロセス」(位置1)に移動します。しかし残りの2はどうですか?マニュアルによれば、「位置2」のパラメータはありません。そこで私はTrace-Commandに目を向けると、後の2つのスクリプトブロックが実際にRemainingScriptsに「IList with 2 elements」であることがわかりました。
BIND arg [$fileCount = $directoryCount = 0] to parameter [Process]
BIND arg [System.Management.Automation.ScriptBlock[]] to param [Process] SUCCESSFUL
BIND arg [System.Collections.ArrayList] to parameter [RemainingScripts]
BIND arg [System.Management.Automation.ScriptBlock[]] to param [RemainingScripts] SUCCESSFUL
は、だから私は、これにコマンドを変更した場合:
# No difference with/without the comma "," between the last 2 blocks
Get-ChildItem | foreach -Process { "block1"
$fileCount = $directoryCount = 0} -RemainingScripts { "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}},{
"block3"; "$directoryCount directories and $fileCount files"}
それでも、まったく同じ結果を。
あなたが気づいたように、3つのコマンドはすべて同じ結果を示します。これは興味深い質問を引き起こします:後で2つのコマンド(暗黙的に)を指定した-ProcessのどちらもForEach-Objectは意外にも、-Processの引数を "-Begin"として使用することになります!(スクリプトブロックは最初に1回実行されます)。
この実験は示唆:
- -RemainingScriptsパラメータは、最初のものは-Processに行くが、3つのブロックは、渡された場合、後でそれは実際に「開始」として使用されている全ての未結合ScriptBlocks
- がかかります残りの2つは "プロセス"と "終了"になります
まだ、上記はすべて私の野生の推測です。私の推測をサポートするためのドキュメントが見つかりませんでした
最後に、私は短い質問に戻ります:) ForEach-Objectの-RemainingScriptsパラメータに関する詳細な情報はありますか?
ありがとうございました。
ありがとうございますAndy、あなたはポイント1に答えました: "-RemainingScriptsパラメーターはすべての非結合ScriptBlocksを取りますが、ポイント#2を説明しませんでした"最初の1つはプロセスに行きますが、3ブロックが渡されます。これは実際にはこの質問の主な理由です。私はより多くの研究をしましたが、今は#ポイント2に答えることができると思います。しかし、あなたの答えとパラメータを検査する技術に感謝します。申し訳ありませんが、私はあなたの答えを投票する権限がありませんが、非常に便利です。 –