简短的问题:任何人都有关于ForEach-Object的-RemainingScripts参数的详细信息?
长问题:
我刚从上周开始学习PowerShell,我将通过每个Cmdlet来了解更多细节.基于公共文档,我们知道ForEach-Object可以有Begin-Process-End块,如下所示:
Get-ChildItem | foreach -Begin { "block1";
$fileCount = $directoryCount = 0} -Process { "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}} -End {
"block3"; "$directoryCount directories and $fileCount files"}
Run Code Online (Sandbox Code Playgroud)
预期结果:"block1"和"block3"为1次,对于传入的每个项目重复"block2",并且dir计数/文件计数都是正确的.到现在为止还挺好.
现在,有趣的是,以下命令也起作用并给出完全相同的结果:
Get-ChildItem | foreach { "block1"
$fileCount = $directoryCount = 0}{ "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{
"block3"; "$directoryCount directories and $fileCount files"}
Run Code Online (Sandbox Code Playgroud)
只有3个ScriptBlocks传递给foreach.根据手册,第一个进入-Process(位置1).但剩下的2怎么样?根据手册,没有"位置2"的参数.所以我转向Trace-Command,发现后两个脚本块实际上是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 …Run Code Online (Sandbox Code Playgroud)