当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

作者:精品下载站 日期:2024-12-14 22:53:31 浏览:12 分类:玩电脑

使用 BITS 和 PowerShell 通过不可靠的网络复制大文件


通常,在本地和全球网络中,文件是使用 SMB、FTP 或 HTTP 协议在设备之间传输的。所有这些协议的问题是恢复大文件的下载会遇到一些麻烦,如果网络缓慢或不可靠,情况会变得更糟。此外,使用这些协议复制文件时,会使用服务器和收件人之间的所有可用带宽,这可能会对网络性能和其他网络应用程序的操作产生负面影响(并不总是可以在网络设备上配置正确的 QoS 策略)。在本文中,我们将考虑如何使用BITS协议和PowerShell通过缓慢或不稳定的网络复制大文件。

比特协议

BITS(后台智能传输服务)是一项用于在系统之间传输文件的 Windows 服务。您可以使用 BITS 协议下载和上传文件。计算机在从服务器接收文件、执行自动 Windows 更新(包括从 WSUS 服务器下载更新的情况)、从 SCCM 分发点接收程序等时使用此协议。

BITS协议的优点

  • BITS是一种智能协议,能够控制通信通道的使用带宽,并且不影响其他网络应用程序和服务的运行。 BITS 可以仅使用空闲(未分配)带宽并在传输过程中动态更改数据速率(如果其他应用程序增加网络使用量,BITS 客户端可以降低网络上的数据传输速率);

  • 文件下载可以在后台模式下进行,对用户透明;

  • 即使计算机与客户端之间的通信通道中断或计算机重新启动后,恢复模式下的 BITS 作业也会自动继续;

  • 您可以通过BITS暂停或恢复下载而不会丢失数据;

    注意。 robocopy.exe 实用程序还提供通过网络恢复文件复制的功能,它允许您在连接丢失时恢复下载文件。

  • BITS 允许您管理下载作业的优先级;

  • 计算机之间的文件传输发生在端口 80 (HTTP) 或 443 (HTTPS) 上,因此您无需在防火墙上打开其他端口。例如,445端口,通过SMB协议复制文件时使用(不要忘记旧版本的SMB 1.0协议存在很多漏洞);

  • BITS 接收方和服务器端不一定需要已部署的 IIS 服务器。

因此,BITS 是通过缓慢且不稳定的网络(卫星信道、GPRS 连接等)传输大文件的首选协议。

BITS:操作系统和 PowerShell 版本要求

BITS协议出现在Windows XP中,其中bitsadmin.exe实用程序可用于管理BITS任务。该实用程序仍然受支持,但已被弃用。要管理 BITS 作业,最好使用特殊的 PowerShell cmdlet。

要在这种情况下工作,您需要不低于 Windows Vista 或 Windows Server 2008 的操作系统以及 PowerShell 2.0 或更高版本。现代版本的 Windows 10 和 Windows Server 2016/2012 R2 完全支持 BITS。

提示。也可以使用 Windows Server 2003。在这种情况下,您必须安装 KB 923845 更新和 PowerShell 2.0。

客户端和服务器端都需要 BITS 支持。

如何使用 PowerShell 通过 BITS 协议下载文件?

假设您要下载存储在 IIS HTTP 服务器上的大型 ISO 文件 (http://10.1.1.18/erd65_32.iso)。假设允许匿名访问该 URL(稍后我们将考虑通过身份验证访问该 URL)。

首先,在 PowerShell 会话中导入 BITS 模块:

Import-Module BitsTransfer

导入模块后,可以显示所有可用命令的列表,如下所示:

get-command *-BITS*

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

如您所见,有 8 个可用的 cmdlet:

  • Add-BitsFile
  • Complete-BitsTransfer
  • Get-BitsTransfer
  • Remove-BitsTransfer
  • Resume-BitsTransfer
  • Set-BitsTransfer
  • Start-BitsTransfer
  • Suspend-BitsTransfer

使用 BITS 在计算机之间同步文件传输

Start-BitsTransfer cmdlet 允许您通过 HTTP(如 Invoke-WebRequest cmdlet)以及从网络共享文件夹(通过 SMB)下载文件。要使用 BITS 协议从指定 URL 下载文件并将其保存到本地目录 C:\Temp,请使用以下命令:

Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

消息“这是使用后台智能传输服务 (BITS) 的文件传输”表示正在使用 BITS 下载指定的文件。

在这种情况下,cmdlet 已开始以同步模式下载 ISO 文件。下载类似于通过文件资源管理器或使用 Copy-Item cmdlet 复制文件的常见过程。屏幕上会显示进度条,显示下载状态。如果计算机重新启动,下载将不会恢复(您将需要再次下载整个文件)。

使用 BITS 异步模式通过网络传输大文件

BITS 下载也可以在异步模式下启动。为此,请将 -asynchronous 参数添加到上面显示的命令中。在此模式下,如果发生某些情况(服务器或客户端重新启动、通信通道中断等),BITS 作业将在源恢复后自动恢复,并从连接中断的那一刻开始继续文件下载:

Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

重要。默认情况下,Start-BitsTransfer 以前台优先级(尽可能高的优先级)运行。假设以这种模式启动的下载将与其他进程竞争通道带宽。为了避免这种情况,您必须显式地将任何其他优先级设置为命令的参数,例如。 g., - 优先级低:

Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority low

异步BITS任务在后台运行,文件下载过程不会显示在屏幕上。可以使用 Get-BitsTransfer 命令从 PowerShell 控制台获取 BITS 作业的状态:

Get-BitsTransfer | fl

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

该命令返回传输状态(在本例中传输已结束:已传输)、有关传输字节数、文件总大小、文件创建时间和任务完成时间的信息。

您可以以表格形式查看计算机上运行的所有 BITS 任务的状态:

Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize

使用异步传输模式时,会创建一个扩展名为 TMP 的临时文件(默认情况下,它隐藏在 Windows 资源管理器中)。要将其转换为源文件(存储在源服务器上),请运行命令Complete-BitsTransfer

Get-BitsTransfer | Complete-BitsTransfer

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

然后,BITS 下载任务被视为已完成并从作业列表中删除。

您可以将本地文件上传到远程 Windows 文件服务器上的网络共享文件夹。为此,请使用以下命令(为了方便起见,您可以指定复制作业的名称):

Start-BitsTransfer -Source C:\iso\w10_1809.iso -Destination \manch-fs1\iso -Asynchronous -DisplayName CopyISOtoMan

要暂时挂起 BITS 任务,请运行:

Get-BitsTransfer -Name CopyISOtoMan | Suspend-BitsTransfer

要恢复 BITS 作业,请使用 Resume-BitsTransfer cmdlet:

Get-BitsTransfer -Name CopyISOtoMan | Resume-BitsTransfer -Asynchronous

您可以使用 Add-BitsFile cmdlet 将其他文件添加到 BITS 任务:

Get-BitsTransfer -Name CopyISOtoMan | Add-BitsFile -Source C:\iso\w10msu\* -Destination \manch-fs1\iso -Asynchronous

要删除计算机上的所有 BITS 下载任务(包括其他用户启动的任务),请运行以下命令:

Get-BitsTransfer -Allusers|Remove-BitsTransfer

您无法取消在系统帐户下运行的 BITS 作业(错误 0x80070005“无法取消作业”)。要取消这样的任务,需要在SYSTEM下执行Remove-BitsTransfer命令。

如果存储文件的服务器需要用户身份验证,则以下命令将允许显示一个窗口来指定访问资源的凭据:

Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:\temp -asynchronous -Priority low -Authentication NTLM -Credential Get-Credential

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

为了更轻松地跟踪 BITS 任务的结果,您可以使用一个简单的脚本,该脚本允许跟踪任务进度并每隔几秒在屏幕上显示一次下载百分比。下载结束后,脚本自动将tmp文件转换为源格式:

Import-Module BitsTransfer
$bitsjob = Start-BitsTransfer -Source http://10.1.1.18/erd65_32.iso -Destination c:\temp -Asynchronous
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Write-host $bitsjob.JobState.ToString()
$Proc = ($bitsjob.BytesTransferred / $bitsjob.BytesTotal) * 100
Write-Host $Proc “%”
Sleep 3
}
Complete-BitsTransfer -BitsJob $bitsjob

如何使用 BITS 复制目录内容?

正如我们已经提到的,BITS 不需要 Web 服务器,这意味着我们可以直接从其他 Windows 计算机或网络共享文件夹复制文件:

Start-BitsTransfer -Source \lon-rep01\os\RHEL4.8-x86_64-AS-DVD.iso -Destination c:\temp -Asynchronous

BitsTransfer 无法递归复制特定文件夹中的所有文件和文件夹或其他程序使用的文件。为了从指定的网络共享文件夹中复制所有文件和子目录,请使用此脚本(可以先检查目标目录是否存在并创建它):

Import-Module BitsTransfer
$Source="\lond-rep01\share\"
$Destination="c:\tmp\"
if ( -Not (Test-Path $Destination))
{
$null = New-Item -Path $Destination -ItemType Directory
}
$folders = Get-ChildItem -Name -Path $source -Directory -Recurse
$bitsjob = Start-BitsTransfer -Source $Source\*.* -Destination $Destination -asynchronous -Priority low
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Sleep 4
}
Complete-BitsTransfer -BitsJob $bitsjob
foreach ($i in $folders)
{
$exists = Test-Path $Destination$i
if ($exists -eq $false) {New-Item $Destination$i -ItemType Directory}
$bitsjob = Start-BitsTransfer -Source $Source$i\*.* -Destination $Destination$i -asynchronous -Priority low
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Sleep 4
}
Complete-BitsTransfer -BitsJob $bitsjob
}

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

如何使用 PowerShell 和 BITS 在 HTTP 服务器上上传文件?

使用 BITS,您不仅可以从 HTTP 服务器下载文件,还可以将其上传到远程 Web 服务器。为此,必须在目标服务器上安装带有 Bits Server Extension 组件的 IIS Web 服务器。在Bits Uploads部分的IIS虚拟目录设置中,您需要启用“允许客户端上传文件”选项。

[玩转系统] 使用 BITS 和 PowerShell 通过不可靠的网络复制大文件

如果使用匿名身份验证,则必须允许匿名用户在 NTFS 权限级别上写入目录。如果在授权用户下进行文件上传,则需要授予上传文件夹的RW权限。

要将文件上传到使用 BITS 协议的 HTTP 服务器,请运行以下命令:

Start-bits -source c:\iso\winsrv2016.iso -destination http://10.1.1.18/MEDVImages/winsrv2016.iso -Transfertype Upload

请注意,默认情况下 IIS 允许您上传最大 30 MB 的文件。要允许上传大文件,您需要更改 web.config 文件中 maxAllowContentLength 参数的值。

因此,使用 BITS 功能是使用 SMB 协议通过网络进行常见文件复制的绝佳替代方案。尽管连接中断或计算机重新启动,BITS 文件传输任务仍会执行,并且不会占用太多带宽,不会干扰其他应用程序。 BITS 协议是通过 WAN 网络传输大型 ISO 映像和虚拟机文件(vmdk、vhdx)的最佳解决方案。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯