2016-08-27 4 views
0

포쉬 자식을 다운로드하고 자동으로 설치하는 PowerShell 스크립트를 만들려고합니다. 다운로드를 비동기 적으로 수행하고 싶습니다. 다운로드가 끝나고 콜백을 완료하는 옵션이있는 것이 바람직합니다. 그리고/또는 완료 될 때까지 기다릴 수 있습니다. 그러나 기다릴 때까지 코드를 실행하십시오.PowerShell 비동기 다운로드 완료 이벤트 처리기가 실행되지 않습니다.

다운로드 할 URL, 저장 위치 및 콜백 함수를 사용하는 함수를 만들었습니다. 아쉽게도 콜백 함수는 호출되지 않습니다.

function DownloadFileAsync([string] $url, [string] $destination, [ScriptBlock] $action = $null) 
{ 
    $web_client = New-Object System.Net.WebClient 

    if ($action) 
    { 
     Register-ObjectEvent -InputObject $web_client -EventName DownloadFileCompleted -Action $action | Out-Null 
    } 

    $web_client.DownloadFileAsync($url, $destination) 
} 

$download_finished = 
{ 
    # This is never reached 
    echo "Download finished" 
} 

DownloadFileAsync "https://github.com/dahlbyk/posh-git/archive/master.zip" "C:/posh-git-master.zip" $download_finished 

어떻게 콜백을 호출 할 수 없습니까? 다운로드가 완료 될 때까지 코드에서 나중에 기다릴 수있는 방법을 구현하는 방법이 있습니까? 이벤트 조치에서

+0

'Register-ObjectEvent'는 함수 범위에서 이상하게 작동합니다. 대신'$ web_client.add_DownloadFileCompleted ($ action)'시도 –

+0

'echo'가 PowerShell 호스트에 문자열을 표시 할 것으로 기대하십니까? 'Write-Output'이하는 일이 아닙니다. 'echo' ->'Write-Host' – PetSerAl

+0

@ MathiasR.Jessen 그렇게하면 PowerShell ISE가 충돌합니다. 문제는 필자가 쓰기 호스트를 사용하지 않고 텍스트가 절대로 콘솔에 출력되지 않는 것 같습니다. – tambre

답변

2

출력은 Register-ObjectEvent에 의해 PowerShell을 호스트에 인쇄하지만, 캡처 및 반환 작업에 저장되지 않습니다 : 다운로드가 완료되면

$web_client = New-Object System.Net.WebClient 
$Job = Register-ObjectEvent -InputObject $web_client -EventName DownloadStringCompleted -Action { 
    Write-Host 'Download completed' 
    $EventArgs.Result 
} 
$web_client.DownloadStringAsync('http://stackoverflow.com/q/39185082') 

지금, 당신은 작업 결과를받을 Receive-Job $Job를 사용할 수 있습니다.

PowerShell 호스트에서 인쇄하려면 Write-Host 또는 Out-Host cmdlet을 사용해야합니다.