Winforms 使用PS2EXE时用于文件下载的PowerShell进度条
TL;DR:需要更好的方法来实现Powershell文件下载的progressbar 我有一个带有GUI的.PS1脚本,我使用PS2EXE将其转换为EXE。我有一段代码可以从互联网上下载一个大的zipfile(~4GB)Winforms 使用PS2EXE时用于文件下载的PowerShell进度条,winforms,powershell,progress-bar,ps2exe-gui,Winforms,Powershell,Progress Bar,Ps2exe Gui,TL;DR:需要更好的方法来实现Powershell文件下载的progressbar 我有一个带有GUI的.PS1脚本,我使用PS2EXE将其转换为EXE。我有一段代码可以从互联网上下载一个大的zipfile(~4GB) Start-BitsTransfer -Source http://speedtest.tele2.net/100MB.zip -Destination .\100MB.zip 问题: 当它是PS1文件时,输出看起来正常。性能非常好,用户可以关闭窗口取消进度。但是,当转换为P
Start-BitsTransfer -Source http://speedtest.tele2.net/100MB.zip -Destination .\100MB.zip
问题:
当它是PS1文件时,输出看起来正常。性能非常好,用户可以关闭窗口取消进度。但是,当转换为PS2EXE时,用户不能取消该命令(有“关闭窗口”或“取消”按钮。在命令完成或失败之前,MainForm没有响应)。此外,无法使用位传输添加ETA,尤其是PS2EXE
PS2EXE是使用-noconsole-nooutput-noError
编译的,因为我不希望主脚本上有输出
对于一个大文件(4GB),它可能需要2-20分钟,这取决于互联网速度。我想实施一个解决方案,可以:
调用WebRequest
/调用RestMethod
(由于它实现进度条的方式太慢)WebClient.Downloadfile($url,$outfile)
(无法轻松实现progressbar)start进程-PassThru-wait powershell{start BitsTransfer-Sourcehttp://speedtest.tele2.net/100MB.zip -目标。\100MB.zip}
执行新的powershell进程,使用progressbar执行位传输(如果有,需要更优雅的解决方案。这是目前我拥有的最好的实现)附加问题:如何从bits传输获取ETA(00:02:20秒的00:00:10秒)信息?
WebClient.DownloadFileAsync()
(它是事件驱动的)有一个进度事件,您可以订阅。但这同样适用于WebClient.DownloadFileTaskAsync()
(实际上是异步的)。DownloadProgressChanged
事件通常用于更新进度上的UI。