有没有办法在PowerShell中实现真正的流媒体?
以下语句说明了我想要的内容:
$(Write-Output "one"; Start-Sleep -Seconds 3; Write-Output "two")
我期望的是:
one
<three seconds delay>
two
实际发生的是这样的:
<three seconds delay>
one
two
因此,PowerShell所谓的"流"实际上只是列表,但是有没有一些简单的方法可以在PowerShell中传递真正的流?
加法:
我刚刚发现这符合我的需求:
function test {
Write-Output "one";
Start-Sleep -Seconds 3;
Write-Output "two";
}
test | % { Write-Host $_ }
。但是为什么$( ... )
的行为方式不一样呢?
$()
在传递输出之前执行其中的每个语句。您可以使用脚本块{}
来流式传输输出。
若要在当前作用域中调用脚本块,请使用点运算符。
. {Write-Output "one"; Start-Sleep -Seconds 3; Write-Output "two"}
若要在子作用域中调用它,请使用 &
调用运算符。
& {Write-Output "one"; Start-Sleep -Seconds 3; Write-Output "two"}
您可以将脚本块分配给变量以传递它。
function Show-ExecutingScript ($ScriptBlock) {
Write-Host "Executing ScriptBlock: `n$ScriptBlock" -Fore Yellow
& $ScriptBlock
}
$MyCommands = {Write-Output "one"; Start-Sleep -Seconds 3; Write-Output "two"}
Show-ExecutingScript $MyCommands
要了解有关 ScriptBlock 的更多信息,请查看about_Script_Blocks