【发布时间】: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