Krótkie pytanie: ktoś ma szczegółowe informacje na temat parametru -RemainingScripts z ForEach-Object?PowerShell: tajemniczy parametr -ReainingScripts dla ForEach-Object
Długie pytanie:
Właśnie rozpoczął naukę PowerShell z ostatniego tygodnia i jadę przez każdy apletów poleceń, aby dowiedzieć się więcej szczegółów. Na podstawie dokumentacji publicznej, wiemy ForEach-Object może mieć Begin-Process-End bloków, jak to: Oczekuje
Get-ChildItem | foreach -Begin { "block1";
$fileCount = $directoryCount = 0} -Process { "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}} -End {
"block3"; "$directoryCount directories and $fileCount files"}
Wynik: 1 godzina dla „blok1” i „blok3”, „blok2” jest powtarzany dla każdy element przekazany, a liczba sztuk/plików jest poprawna. Jak na razie dobrze.
Teraz, co ciekawe, następujące polecenie działa również i daje dokładnie ten sam wynik:
Get-ChildItem | foreach { "block1"
$fileCount = $directoryCount = 0}{ "block2";
if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{
"block3"; "$directoryCount directories and $fileCount files"}
zaledwie 3 ScriptBlocks przekazane do foreach. Bazując na instrukcji, pierwszy przechodzi do -Procesu (Pozycja 1). Ale co z pozostałymi 2? Zgodnie z instrukcją, nie ma parametru "Pozycja 2". Tak więc zwróciłem się do Trace-Command i odkryłem, że późniejsze 2 bloki skryptów były w rzeczywistości RemainingScripts jako "IList z 2 elementami".
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
Więc jeśli mogę zmienić polecenie, aby w ten sposób:
# 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"}
wciąż dokładnie taki sam rezultat.
Tak jak zauważyłeś, wszystkie 3 polecenia dają ten sam rezultat. Podnosi to interesujące pytanie: obie późniejsze dwie komendy (implicite) określone -Proces, jednak ForEach-Object zaskakująco kończy się używanie argumentu -Process jako "-Begin"! (blok skryptu jest wykonywany raz na początku).
Ten eksperyment sugeruje:
- -RemainingScripts parametr podejmie wszelkie niezwiązane ScriptBlocks
- Po 3 bloki są przekazywane w, jednak pierwszy z nich idzie do -Process, później to jest faktycznie wykorzystywany jako „Początek” podczas gdy pozostałe 2 stają się "Proces" i "Koniec"
Nadal wszystkie powyższe są tylko moje dzikie domysły. Nie znalazłem dokumentacji potwierdzającej moje przypuszczenie.
W końcu wracamy do mojego krótkiego pytania :) Ktoś ma szczegółowe informacje o parametrze -RemainingScripts z ForEach-Object?
Dzięki.
Dzięki Andy, odpowiedziałeś punkt # 1: „parametr -RemainingScripts podejmie wszelkie niezwiązane ScriptBlocks”, ale nie wyjaśnia punkt # 2 „Po 3 bloki są przekazywane w, jednak pierwszy z nich idzie do -Process ... ", który jest w rzeczywistości głównym powodem tego pytania. Zrobiłem więcej badań i teraz myślę, że mogę odpowiedzieć na #point 2. Mimo to doceniam twoją odpowiedź i technikę sprawdzania parametrów. I przepraszam, nie mam pozwolenia na głosowanie na twoją odpowiedź, mimo że jest to bardzo przydatne. –