有没有办法在不影响性能的情况下保持Powershell中的进度条?

有没有办法在不影响性能的情况下保持Powershell中的进度条?,powershell,Powershell,是否有任何用户自制的功能可以取代进度条?我有一个脚本可以下载和提取一个zip文件,但是如果启用了进度条$ProgressPreference='Continue',那么这个过程实际上需要50倍于使用$ProgressPreference='SilentlyContinue' 然而,我真的希望有进度条。有什么解决方法吗?如果您使用调用WebRequest下载带有默认进度首选项的文件,它将提供一个恒定的字节流更新,这会破坏性能。您可以将该命令作为作业运行,并按您选择的间隔提供下载字节的进度 $uri

是否有任何用户自制的功能可以取代进度条?我有一个脚本可以下载和提取一个zip文件,但是如果启用了进度条
$ProgressPreference='Continue'
,那么这个过程实际上需要50倍于使用
$ProgressPreference='SilentlyContinue'


然而,我真的希望有进度条。有什么解决方法吗?

如果您使用
调用WebRequest
下载带有默认进度首选项的文件,它将提供一个恒定的字节流更新,这会破坏性能。您可以将该命令作为作业运行,并按您选择的间隔提供下载字节的进度

$uri = 'https://host.domain.com/myfile'
$sb = {
          $progresspreference = 'SilentlyContinue'
          Invoke-WebRequest -Uri $using:uri -Outfile 'c:\temp\file.txt'
}
Start-Job -Name 'Download' -ScriptBlock $sb
while ((Get-Job -Name 'Download').State -eq 'Running') {
    Write-Progress -Activity "Downloaded Bytes" -CurrentOperation $((Get-ChildItem 'c:\temp\file.txt').Length)
    sleep 1
}

如果您希望下载带有进度条的文件,并且在下载过程中不受性能影响,则您需要使用BitsTransfer模块中的

Start-BitsTransfer -Source $using:uri -Destination 'c:\temp\file.txt'
对于文件传输,远远优于调用WebRequest。一旦你做出改变,你就再也不会回头了。除非使用异步模式,否则仍会获得进度条,但性能影响可以忽略,因为传输是在后台使用Windows BITS服务进行的。此外,您还可以获得BITS服务的所有好处,例如挂起/暂停后台传输、选择传输优先级/策略策略、跨系统重新启动恢复下载、使用Windows凭据管理器中存储的凭据

此外,-Source-Destination参数可用于以下任意组合:

  • 局部路径
  • 远程文件共享路径
  • URI路径

注意:BitsTransfer模块首次在Windows 7/Windows Server 2008 R2及更高版本的Windows Powershell 3.0中提供。

您可以将下载代码作为作业运行。然后使用
Write Progress
检查作业的状态。但是,如果作业速度很快,检查进度有什么意义?为了通知最终用户下载正在正常进行,此脚本将由其他人使用。我只得到作业已启动的指示,没有进度。如果您想要作业的输出,您需要使用
Receive job-Name“Download”
Receive job-Name“Download”-Keep
来检索第一次检索之后的作业结果。您也可以将结果存储在变量中。您需要确保系统上的
$progresspreference
设置为
Continue
。脚本块
$sb
有它自己的作用域(它自己的
$progresspreference
),不会影响您的会话。Bits的问题是其他Bits作业可能会阻止传输的发生。