Winforms 使用PS2EXE时用于文件下载的PowerShell进度条

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

TL;DR:需要更好的方法来实现Powershell文件下载的progressbar

我有一个带有GUI的.PS1脚本,我使用PS2EXE将其转换为EXE。我有一段代码可以从互联网上下载一个大的zipfile(~4GB)

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太慢,位传输和WebClient太快)
  • 可选:提供添加额外输出的选项(ETA信息以秒为单位)
  • 到目前为止,我所尝试的:

  • 调用WebRequest
    /
    调用RestMethod
    (由于它实现进度条的方式太慢)
  • WebClient.Downloadfile($url,$outfile)
    (无法轻松实现progressbar)
  • start进程-PassThru-wait powershell{start BitsTransfer-Sourcehttp://speedtest.tele2.net/100MB.zip -目标。\100MB.zip}
    执行新的powershell进程,使用progressbar执行位传输(如果有,需要更优雅的解决方案。这是目前我拥有的最好的实现)
  • 我说的更优雅是指使用(PS2EXE)GUI而不是powershell窗口


    附加问题:如何从bits传输获取ETA(00:02:20秒的00:00:10秒)信息?

    WebClient.DownloadFileAsync()
    (它是事件驱动的)有一个进度事件,您可以订阅。但这同样适用于
    WebClient.DownloadFileTaskAsync()
    (实际上是异步的)。
    DownloadProgressChanged
    事件通常用于更新进度上的UI。