使用 Windows PowerShell 创建 BITS 传输作业

可以使用 PowerShell cmdlet 创建同步和异步后台智能传输服务 (BITS) 传输作业。

本主题中的所有示例都使用 Start-BitsTransfer cmdlet。 若要使用 cmdlet,请务必先导入模块。 若要安装模块,请运行以下命令:Import-Module BitsTransfer。 有关详细信息,请在 PowerShell 提示符下键入 Get-Help Start-BitsTransfer

重要

当在非交互上下文(如 Windows 服务)中运行的进程中使用 *-BitsTransfer cmdlet 时,可能无法将文件添加到 BITS 作业,这可能会导致挂起状态。 若要继续该作业,必须使用用于创建传输作业的标识登录。 例如,在作为任务计划程序作业执行的 PowerShell 脚本中创建 BITS 作业时,除非启用了任务计划程序的任务设置“仅当用户登录时运行”,否则 BITS 传输将永远不会完成。

 

创建同步 BITS 传输作业

Start-BitsTransfer -Source https://Server01/serverdir/testfile1.txt `
-Destination C:\clientdir\testfile1.txt

注意

重音字符 (`) 用于指示换行符。

 

在前面的示例中,文件的本地名称和远程名称分别在参数和目标参数中指定。 当文件传输完成或进入错误状态时,命令提示符会返回。

默认传输类型为“下载”。 将文件上传到 HTTP 位置时,TransferType 参数必须设置为“Upload”。

由于对 Start-BitsTransfer cmdlet 强制实施参数位置,因此不需要为源和目标参数指定参数名称。 因此,可以按如下所示简化此命令。

Start-BitsTransfer https://Server01/serverdir/testfile1.txt C:\clientdir\testfile1.txt

使用多个文件创建同步 BITS 传输作业

Start-BitsTransfer -Source C:\clientsourcedir\*.txt `
-Destination c:\clientdir\ -TransferType Download

在前面的示例中,Start-BitsTransfer 命令创建新的 BITS 传输作业。 所有文件都会添加到此作业,并按顺序传输到客户端。

注意

目标路径无法使用通配符。 目标路径支持相对目录、根路径或隐式目录(即当前目录)。 无法使用通配符重命名目标文件。 此外,HTTP 和 HTTPS URL 不能使用通配符。 通配符仅对 UNC 路径和本地目录有效。

 

创建同步 BITS 传输作业并指定远程服务器的凭据

Start-BitsTransfer -DisplayName MyJob -Credential Username\Domain `
-Source https://server01/servertestdir/testfile1.txt -Destination c:\clienttestdir\testfile1.txt `
-ProxyUsage Override -ProxyList @(https://proxy1, 123.24.21.23, proxy3)

在前面的示例中,用户创建 BITS 传输作业,以便从需要身份验证的服务器下载文件。 系统会提示用户输入凭据,并且 Credential 参数会将凭据对象传递给 Start-BitsTransfer cmdlet。 用户设置显式代理,BITS 传输作业仅使用由 ProxyList 参数定义的代理。 DisplayName 参数为 BITS 传输作业提供唯一的显示名称。

从 CSV 文件创建同步 BITS 传输作业

Import-CSV filelist.txt | Start-BitsTransfer -TransferType Upload

注意

“|”是竖线字符。

 

在前面的示例中,用户创建从客户端上传多个文件的 BITS 传输作业。 Import-CSV cmdlet 导入源和目标文件位置,并将其通过管道传递给 Start-BitsTransfer 命令。 Start-BitsTransfer 命令为每个文件创建新的 BITS 传输作业,将文件添加到作业,然后将这些文件按顺序传输到服务器。

Filelist.txt 文件的内容应采用以下格式:

Source, Destination
c:\clienttestdir\testfile1.txt, https://server01/servertestdir/testfile1.txt
c:\clienttestdir\testfile2.txt, https://server01/servertestdir/testfile2.txt
c:\clienttestdir\testfile3.txt, https://server01/servertestdir/testfile3.txt
c:\clienttestdir\testfile4.txt, https://server01/servertestdir/testfile4.txt

创建异步 BITS 传输作业

$Job = Start-BitsTransfer -Source https://Server1.TrustedDomain.com/File1.zip `
       -Destination d:\temp\downloads\ -Asynchronous

while (($Job.JobState -eq "Transferring") -or ($Job.JobState -eq "Connecting")) `
       { sleep 5;} # Poll for status, sleep for 5 seconds, or perform an action.

Switch($Job.JobState)
{
    "Transferred" {Complete-BitsTransfer -BitsJob $Job}
    "Error" {$Job | Format-List } # List the errors.
    default {"Other action"} #  Perform corrective action.
}

在前面的示例中,BITS 传输作业已分配给 $Job 变量。 文件按顺序下载。 传输作业完成后,文件将立即可用。 如果 $Job.JobState 返回“传输”,$Job 对象将发送到 Complete-BitsTransfer cmdlet。

如果 $Job.JobState 返回“Error”,$Job 对象将发送到 Format-List cmdlet 以列出错误。

管理 PowerShell 远程会话

从 Windows 10 版本 1607 开始,还可以从连接到另一台(物理或虚拟)计算机的 PowerShell 远程命令行运行 PowerShell Cmdlet,并使用 BITSAdmin 或其他使用 BITS 接口的应用程序。 当对同一物理计算机上的虚拟机使用 PowerShell Direct 命令行时,此功能不可用;当使用 WinRM cmdlet 时也不可用。

从远程 PowerShell 会话创建的 BITS 作业将在该会话的用户帐户上下文下运行,并且只有在至少有一个活动的本地登录会话或远程 PowerShell 会话与该用户帐户关联时才会进行。 可以使用 PowerShell 的持久性 PSSession 运行远程命令,而无需让每个作业保持打开 PowerShell 窗口才能继续取得进展,如管理员使用 Windows PowerShell 注册远程计算机中所述。

  • New-PSSession 创建持久性远程 PowerShell 会话。 创建后,PSSession 对象将保留在远程计算机中,直到显式删除。 在活动会话中启动的任何 BITS 作业都将进行数据传输,即使在客户端与会话断开连接后也是如此。
  • Disconnect-PSSession 断开客户端计算机与远程 PowerShell 会话的连接,并且该会话的状态将继续由远程计算机维护。 最重要的是,远程会话的进程将继续执行,BITS 作业将继续取得进展。 客户端计算机甚至可以在调用 Disconnect-PSSession 后重新启动和/或关闭。
  • Connect-PSSession 将客户端计算机重新连接到活动的远程 PowerShell 会话。
  • Remove-PSSession 结束远程 PowerShell 会话。

下面的示例演示如何使用 PowerShell Remote 处理异步 BITS 传输作业,从而允许该作业继续取得进展,即使未主动连接到远程会话也是如此。

# Establish a PowerShell Remote session in Server01 with name 'MyRemoteSession'
New-PSSession -ComputerName Server01 -Name MyRemoteSession -Credential Domain01\User01

# Enter the previously-established session to execute commands
Enter-PSSession -Name MyRemoteSession

# Enumerate active BITS transfers on the remote machine
Get-BitsTransfer

# While running in the context of the PowerShell Remote session, start a new BITS transfer
Start-BitsTransfer -Source https://Server1.TrustedDomain.com/File1.zip -Destination c:\temp\downloads\ -Asynchronous

# Exit the PowerShell Remote session's context
Exit-PSSession

# Disconnect the 'MyRemoteSession' PowerShell Remote session from the current PowerShell window
# After this command, it is safe to close the current PowerShell window and turn off the local machine
Disconnect-PSSession -Name MyRemoteSession


# The commands below can be executed from a different PowerShell window, even after rebooting the local machine
# Connect the 'MyRemoteSession' PowerShell Remote session to the current PowerShell window
Connect-PSSession -ComputerName Server01 -Name MyRemoteSession

# Enter the previously-established session to execute commands
Enter-PSSession -Name MyRemoteSession

# Enumerate active BITS transfers on the remote machine
Get-BitsTransfer

# Manage BITS transfers on the remote machine via Complete-BitsTransfer, Remove-BitsTransfer, etc.

# Exit the PowerShell Remote session's context
Exit-PSSession

# Destroy the 'MyRemoteSession' PowerShell Remote session when no longer needed
Remove-PSSession -Name MyRemoteSession

Start-BitsTransfer

Complete-BitsTransfer