PowerShell异步下载完成事件处理程序永远不会执行

问题描述 投票:0回答:1

我正在尝试创建一个PowerShell脚本,该脚本将下载posh-git并自动进行安装。 我想让下载异步进行,最好是选择在下载完成和/或能够等待其完成之后进行回调(但要执行代码直到您想等待)。

我创建了一个函数,该函数带有要下载的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

如何解决从未被调用的回调? 还有一种方法可以实现稍后在代码中等待下载完成的方法吗?

powershell asynchronous powershell-5.0
1个回答
4
投票

事件操作的输出未打印在PowerShell主机上,而是捕获并保存在Job中,由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')

现在,下载完成后,您可以使用Receive-Job $Job接收作业结果。

如果要在PowerShell主机上打印某些内容,则需要使用Write-HostOut-Host cmdlet。

© www.soinside.com 2019 - 2024. All rights reserved.