PowerShell异步下载完成事件处理程序从未执行

PowerShell异步下载完成事件处理程序从未执行,powershell,asynchronous,powershell-5.0,Powershell,Asynchronous,Powershell 5.0,我正在尝试创建一个PowerShell脚本,该脚本将下载posh git,然后自动安装。我希望下载以异步方式进行,最好是在下载完成后有一个回调选项,并且/或者能够等待下载完成(但是在您想等待之前执行代码) 我创建了一个函数,该函数接受下载URL、保存URL的路径和回调函数。不幸的是,似乎从未调用回调函数: function DownloadFileAsync([string] $url, [string] $destination, [ScriptBlock] $action = $null)

我正在尝试创建一个PowerShell脚本,该脚本将下载posh git,然后自动安装。我希望下载以异步方式进行,最好是在下载完成后有一个回调选项,并且/或者能够等待下载完成(但是在您想等待之前执行代码)

我创建了一个函数,该函数接受下载URL、保存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主机上,而是捕获并保存在作业中,由
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主机上打印某些内容,则需要使用
写入主机
输出主机
cmdlet。

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

Register-ObjectEvent
在函数范围内行为怪异。尝试
$web\u客户端。添加\u下载文件已完成($action)
而不是。您是否希望
echo
将在PowerShell主机上显示字符串?这不是
写输出所做的事情
echo
->
写入主机
@MathiasR.Jessen这样做会使PowerShell ISE崩溃。问题似乎是我没有使用Write Host,而且文本从未输出到控制台。@PetSerAl您能否将您的注释转换为答案,因为这是解决方案。
Register ObjectEvent
在函数范围内行为怪异。尝试
$web\u客户端。添加\u下载文件已完成($action)
而不是。您是否希望
echo
将在PowerShell主机上显示字符串?这不是
写输出所做的事情
echo
->
写入主机
@MathiasR.Jessen这样做会使PowerShell ISE崩溃。问题似乎是我没有使用Write Host,文本也从来没有输出到控制台。@PetSerAl你能把你的评论变成答案吗,因为这是解决方案。