В PowerShell кажется, что порядок выполнения командлетов в конвейере не выполняется очевидным образом. Вместо того, чтобы каждый командлет выполнялся и затем передавал результаты следующему командлету в конвейере, кажется, что отдельные выходные объекты командлета передаются на вход следующего командлета до завершения выполнения предыдущего командлета. Следующее подтверждает это поведение:
1..5 | %{ Write-Host $_; $_ } | %{ Write-Host ([char]($_ + 64)) }
отпечатки
1
A
2
B
3
C
4
D
5
E
Похоже, что происходит следующее: каждое выполнение ForEach-Object
командлета будет выполнять свой блок сценария и каждую последующую команду в своем конвейере перед итерацией.
Это то, что происходит на самом деле, и задокументировано ли где-нибудь такое поведение? Это относится ко всем итеративным командлетам, таким как ForEach-Object
(например, Where-Object
и т. Д.)?
Я знаю, что могу заключить части в выражение ((1..5 | %{ Write-Host $_; $_ }) | %{ Write-Host ([char]($_ + 64)) }
) или назначить часть переменной, а затем передать ее последующим командам конвейера, чтобы избежать такого поведения, но есть ли способ выполнить операцию с каждым элементом коллекции, а затем передать вся эта коллекция передается следующей команде в конвейере?