PowerShell 异步下载完成事件处理程序永远不会执行
PowerShell async download completion event handler never gets executed
我正在尝试创建一个 PowerShell 脚本来下载 posh-git 然后自动安装它。我想让下载异步发生,最好选择在下载完成后进行回调 and/or 能够等待它完成(但执行代码直到你想等待)。
我创建了一个函数,它接受 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('
现在下载完成后,您可以使用Receive-Job $Job
接收作业结果。
如果您想在 PowerShell 主机上打印某些内容,则需要使用 Write-Host
或 Out-Host
cmdlet。
我正在尝试创建一个 PowerShell 脚本来下载 posh-git 然后自动安装它。我想让下载异步发生,最好选择在下载完成后进行回调 and/or 能够等待它完成(但执行代码直到你想等待)。
我创建了一个函数,它接受 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('
现在下载完成后,您可以使用Receive-Job $Job
接收作业结果。
如果您想在 PowerShell 主机上打印某些内容,则需要使用 Write-Host
或 Out-Host
cmdlet。