【问题标题】:PowerShell async download completion event handler never gets executedPowerShell 异步下载完成事件处理程序永远不会被执行
【发布时间】:2016-08-28 14:36:07
【问题描述】:

我正在尝试创建一个 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

如何解决永远不会调用的回调?是否还有一种方法可以在稍后的代码中实现等待下载完成的方法?

【问题讨论】:

  • Register-ObjectEvent 在函数范围内的行为很奇怪。改用$web_client.add_DownloadFileCompleted($action)
  • 您希望echo 会在PowerShell 主机上显示字符串吗?这不是Write-Output 正在做的事情。 echo -> Write-Host
  • @MathiasR.Jessen 这样做会使 PowerShell ISE 崩溃。问题似乎是我没有使用 Write-Host 并且文本从未输出到控制台。
  • @PetSerAl 你能把你的评论变成答案吗,因为它是解决方案。

标签: powershell asynchronous powershell-5.0


【解决方案1】:

事件操作的输出不会打印在 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')

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2014-01-15
    • 1970-01-01
    • 2020-09-26
    相关资源
    最近更新 更多