PowerShell标准输出和重定向

PowerShell标准输出和重定向,powershell,tee,console-output,Powershell,Tee,Console Output,我想建立像这样的powershell管道 cmd | transform_a | stdout_and | transform_b | store_variable ^ | copy input to next consumer and to console 我试图利用Tee对象,但没有成功。我不想这样做 dir | select -last 5 | tee lastFiveLines

我想建立像这样的powershell管道

cmd | transform_a | stdout_and | transform_b | store_variable
                         ^
                         |
    copy input to next consumer and to console
我试图利用
Tee对象
,但没有成功。我不想这样做

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

尽管有效。相反,我希望直接打印内容。

您可以尝试foreach循环和
Out Default
Out Host
跳过管道的其余部分(无论如何,主机是默认输出),同时还可以沿管道发送对象。样本:

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 $_" }

那么,任务中没有漂亮的一行吗?您可以删除foreach中的换行符
ForEach对象{$\.Name | Out Default;$\}
,或者创建一个过滤器(请参见更新的答案)。