PowerShell стандартный вывод и перенаправление

Я хотел бы построить конвейер PowerShell, как

cmd | transform_a | stdout_and | transform_b | store_variable
                         ^
                         |
    copy input to next consumer and to console

Я пытался использовать Tee-Object но без успеха. Я не хочу этого делать

dir | select -last 5 | tee lastFiveLines | select -first 1
echo $lastFiveLines

хотя это работает. Вместо этого я хочу, чтобы контент печатался напрямую.

1 ответ

Решение

Вы можете попробовать цикл foreach и Out-Default или же Out-Host пропустить остальную часть конвейера (в любом случае Host is Default default output), одновременно отправляя объект по конвейеру. Образец:

Get-ChildItem |
Select-Object Name, FullName |
ForEach-Object { 
    #Send Name-value directly to console (default output)
    $_.Name | Out-Default
    #Send original object down the pipeline
    $_
} |
Select-Object -ExpandProperty FullName | % { Start-sleep -Seconds 1; "Hello $_" }

Вы можете создать фильтр, чтобы облегчить его повторное использование.

#Bad filter-name, but fits the question.
filter stdout_and { 
    #Send Name-value directly to console (default output)
    $_.Name | Out-Default
    #Send original object down the pipeline
    $_
}

Get-ChildItem |
Select-Object Name, FullName |
stdout_and |
Select-Object -ExpandProperty FullName | % { Start-sleep -Seconds 1; "Hello $_" }
Другие вопросы по тегам