2014-04-01 2 views
0

PowerShell에서 실제 스트리밍을 수행 할 수있는 방법이 있습니까?PowerShell에서 "실제"스트리밍?

$(Write-Output "one"; Start-Sleep -Seconds 3; Write-Output "two") 

내가 기대하는 것은 :

<three seconds delay> 
one 
two 

그래서 PowerShell을 호출 :

one 
<three seconds delay> 
two 

은 무엇 실제로 일어나는 것은 이것이다

는 다음 문은 내가 원하는 것을 보여 "스트림"은 실제로 목록에 불과하지만 PowerShell에서 실제 스트림을 전달할 수있는 쉬운 방법이 있습니까?

추가 :

난 그냥이 내가 무엇을 찾고한다는 것을 발견 :

function test { 
    Write-Output "one"; 
    Start-Sleep -Seconds 3; 
    Write-Output "two"; 
} 

test | % { Write-Host $_ } 
... 그런데 왜 $(...)이 같은 방식으로 작동하지 않는 이유는 무엇입니까?

답변

0

$()은 출력을 전달하기 전에 그 내부의 모든 문을 실행합니다. ScriptBlocks {}을 사용하여 출력을 스트리밍 할 수 있습니다.

현재 범위에서 ScriptBlock을 호출하려면 도트 연산자를 사용하십시오.

. {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 

about_Script_Blocks

을 확인, ScriptBlocks에 대한 자세한 내용을 보려면