我想下载文件从互联网上的形式和显示下载进度在ProgressBar.要做到这一点,我订阅加载事件,并做异步加载.一切都在工作.这里是简化的代码(删除所有不必要的):
Add-Type -assembly System.Windows.Forms
$isDownloaded = $False
$webMain = New-Object System.Net.WebClient
Register-ObjectEvent -InputObject $webMain -EventName 'DownloadFileCompleted' -SourceIdentifier WebMainDownloadFileCompleted -Action {
$Global:isDownloaded = $True
}
Register-ObjectEvent -InputObject $webMain -EventName 'DownloadProgressChanged' -SourceIdentifier WebMainDownloadProgressChanged -Action {
$Global:Data = $event
}
function DownloadFile($Link, $Path, $Name) {
write-host "begin"
$Global:webMain.DownloadFileAsync($Link, $Path)
While (!$isDownloaded) {
$percent = $Global:Data.SourceArgs.ProgressPercentage
If ($percent -ne $null) {
write-host $percent
}
Wait-Event -Timeout 1
}
write-host "end"
}
DownloadFile 'https://www.7-zip.org/a/7z2301-x64.exe' 'D:\7Zip.exe' '7Zip'
字符串
一切正常。现在我把它添加到代码的任何地方
第一个月
或$Button1 = New-Object System.Windows.Forms.Button
个
并且脚本不工作。DownloadProgressChanged和DownloadFileCompleted事件根本不会发生。
问:为什么只是创建一个窗体或按钮会干扰脚本?
如果没有System.Windows.Forms.Form,代码可以正常工作,但我最终需要创建一个Form并在其上呈现加载。
DownloadFileAsync工作-文件已下载,但使用任何New-Object System.Windows.Forms.* 时,Register-ObjectEvent中的事件本身不会发生(但没有它们也能正常工作)。
1条答案
按热度按时间h7appiyu1#
正如在评论中所述,PowerShell不是一个很好的编程语言,问题是
.ShowDialog()
阻止线程,不允许您的事件正常执行。解决方案是在一个单独的运行空间中注册事件,下面是如何完成的最小示例(尽可能少)。我添加了一些指针注解来帮助您理解逻辑,尽管代码显然并不容易,如前所述,PowerShell不是为此设计的语言,C#会给你一个更容易的时间给予。Demo:
的数据
产品代码:
字符串