Короткий вопрос: у кого есть подробная информация о параметре -RemainingScripts параметра ForEach-Object?PowerShell: таинственный параметр -RemainingScripts параметра ForEach-Object
Длинный вопрос:
Я только начал изучать PowerShell с прошлой недели, и я иду через каждый командлетов, чтобы узнать более подробную информацию. На основании официальной документации, мы знаем, 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"}
Результат ожидается: 1 раз для "block1" и "block3", "block2" повторяется каждый элемент передан, и счетчик count/fil count - все правильно. Все идет нормально.
Теперь, что интересно, следующая команда также работает и дает точно такой же результат:
Get-ChildItem | foreach { "block1"
$fileCount = $directoryCount = 0}{ "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{
"block3"; "$directoryCount directories and $fileCount files"}
Just 3 ScriptBlocks переданного Foreach. Основываясь на руководстве, первый идет на -Process (Позиция 1). Но как насчет оставшихся 2? Согласно руководству, параметр «Позиция 2» отсутствует. Поэтому я обратился к Trace-Command и обнаружил, что более поздние 2 блока скриптов фактически были RemainingScripts как «IList с 2 элементами».
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"}
Тем не менее, точно такой же результат.
Итак, как вы заметили, все три команды дают одинаковый результат. Это вызывает интересный вопрос: обе из последних двух команд (неявно) указаны -Process, однако ForEach-Object неожиданно заканчивается использованием аргумента -Process как «-Begin»! (блок сценария выполняется один раз в начале).
Этот эксперимент предполагает:
параметра- -RemainingScripts будет принимать все несвязанный ScriptBlocks
- Когда 3 блока передается в, хотя первый один идет в -Process, позже она фактически используется как «Начало» в то время как оставшиеся 2 становятся «Процессом» и «Конец»
Все еще, все это просто мое дикое предположение. Я не нашел документацию для поддержки своей догадки
Итак, наконец, мы вернемся к моему короткому вопросу :) У кого-нибудь есть подробная информация о параметре -RemainingScripts параметра ForEach-Object?
Спасибо.
Спасибо, Энди, вы ответили на пункт №1: «Параметр -RemainingScripts будет принимать все несвязанные ScriptBlocks», но не объяснил точку №2 «Когда передано 3 блока, хотя первый идет на -Process ... «на самом деле это главная причина, по которой задан этот вопрос. Я сделал больше исследований, и теперь я думаю, что могу ответить #point 2. Тем не менее, я ценю ваш ответ и технику для проверки параметра. И жаль, что у меня нет разрешения голосовать за ваш ответ, хотя это очень полезно. –