2016-08-27 18 views
0

私はposh-gitをダウンロードして自動的にインストールする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がクラッシュします。この問題は、私がWrite-Hostを使用していなかったためで、テキストが決してコンソールに出力されていないようです。 – tambre

答えて

2

出力は、PowerShellホストに印刷されますが、キャプチャされ、保存されたジョブで、Register-ObjectEventによって返されません。

$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') 

ダウンロードが完了したときに今、あなたは仕事の結果を受け取るために​​3210を使用することができます。

PowerShellホストで何かを印刷する場合は、Write-HostまたはOut-Hostコマンドレットを使用する必要があります。

関連する問題