使用 Windows PowerShell 创建 BITS 传输作业

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

本主题中的所有示例都使用 "开始"菜单-BitsTransfer cmdlet。 若要使用 cmdlet,请务必先导入模块。 若要安装模块,请运行以下命令:Import-Module BitsTransfer。 有关详细信息,请在 PowerShell 提示符下键入 Get-Help "开始"菜单-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。

由于为 "开始"菜单-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

在前面的示例中,"开始"菜单-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 参数会将凭据对象传递给 "开始"菜单-Bitsfer cmdlet。 用户设置显式代理,BITS 传输作业仅使用 ProxyList 参数定义的代理。 DisplayName 参数为 BITS 传输作业提供唯一的显示名称。

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

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

注意

“|”是管道字符。

 

在前面的示例中,用户创建一个 BITS 传输作业,用于从客户端上传多个文件。 Import-CSV cmdlet 导入源文件和目标文件位置,并将其管道传递给 "开始"菜单-BitsTransfer 命令。 "开始"菜单-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 Cmdlet、BITSAdmin 或其他应用程序,这些应用程序使用从连接到另一台计算机的 PowerShell 远程命令行连接到另一台计算机 (物理或虚拟) 。 当将 PowerShell Direct 命令行用于同一物理计算机上的虚拟机时,此功能不可用,在使用 WinRM cmdlet 时不可用。

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

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

"开始"菜单-BitsTransfer

Complete-BitsTransfer