[ PowerShell ] BitsTransfer モジュールでファイル転送する ( ダウンロードとアップロード )

Pocket

ここでは、BitsTransfer モジュールのインポートから Start-BitsTransfer コマンドレットによるファイル転送 ( ダウンロードとアップロード ) を行う方法について掲載しています。

スポンサーリンク

PowerShell2.0 から BITS を使用する

WindowsXP まではバックグラウンド インテリジェンス転送サービス ( BITS ) の操作には BitsAdmin コマンドラインツールを使用するのが一般的でしたが、 Windows7 / Windows Server2008 ( R2 ) 以降、PowerShell から BITS を操作するのに必要となる BITS4.0 がデフォルトでインストールされました。よって今後は、BitsAdmin コマンドラインツールではなく、PowerShell からの BITS 操作が標準となります。

BITS サービスと Windows Update

Windows Update の自動更新 ( ダウンロード ) では、BITS が使用されています。Windows Update で自動更新している場合は、BITS サービスが起動していると思います。自動更新設定ではない場合では、もしかすると BITS サービスが起動していないかもしれません。

PowerShell からファイル転送を行う場合には BITS サービスが起動している必要がありますが、Windows Update の設定や BITS サービスの起動確認などは必要ありません。ファイル転送を行う Start-BitsTransfer コマンドレットを実行すると BITS サービスが停止している場合には、サービスを起動してくれるようです。

BITS モジュール(BitsTransfer)のインポート

バックグラウンド インテリジェンス転送サービス ( BITS ) を使用するには、BITS モジュールをインポートする必要があります。モジュールのインポートを行わなければ、BITS で使用するコマンドのヘルプも見ることもできません。以下は、モジュールのインポート後に BITS 関連コマンドの一覧を表示しています。

PS E:\> # BITS モジュールのインポート
PS E:\> Import-Module BitsTransfer
PS E:\>
PS E:\> # BITS コマンドレットの一覧
PS E:\> Help BitsTransfer

Name                   Category  Synopsis
----                   --------  --------
Complete-BitsTransfer  Cmdlet    バックグラウンド インテリジェント転送サービス (BITS) 転送ジョブを完了します。
Get-BitsTransfer       Cmdlet    既存のバックグラウンド インテリジェント転送サービス (BITS) 転送ジョブに関連付けられている BitsJob オブジェクトを取得します。
Remove-BitsTransfer    Cmdlet    バックグラウンド インテリジェント転送サービス (BITS) 転送ジョブを取り消します。
Resume-BitsTransfer    Cmdlet    バックグラウンド インテリジェント転送サービス (BITS) 転送ジョブを再開します。
Set-BitsTransfer       Cmdlet    既存のバックグラウンド インテリジェント転送サービス (BITS) 転送ジョブのプロパティを変更します。
Start-BitsTransfer     Cmdlet    新しいバックグラウンド インテリジェント転送サービス (BITS) 転送ジョブを作成します。
Suspend-BitsTransfer   Cmdlet    バックグラウンド インテリジェント転送サービス (BITS) 転送ジョブを中断します。

コマンドレットは、上記のとおり全部で7つです。数はそれほど多くはありません。

BITS によるファイル転送の概要

BITS によるファイル転送に使用可能なプロトコルは、SMB と HTTP(S) です。ファイル転送タイプは、アップロードとダウンロードの2種類です。転送タイプのアップロードとは、WEB ( IIS ) サーバへファイルのアップロードをすることです。それ以外にアップロードはありません。
例えば、共有ファイルサーバー上に SMB プロトコルを使用して、ファイル転送を行う場合はアップロードではありません。SMB プロトコルを使用する場合の転送タイプは、すべてダウンロードです。

ファイル転送の優先度

ファイル転送は優先度を指定することができます。指定できる優先度は下表の通りです。

優先度内容
Foreground同期ダウンロード(アップロード)を行う。優先度は最も高い。
High非同期ダウンロード(アップロード)を行う。Foregroundより低く、非同期では最も高い
Normal非同期ダウンロード(アップロード)を行う。High の次に優先度が高い
Low非同期ダウンロード(アップロード)を行う。最も優先度が低い

BITS によるファイルダウンロード ( 優先度 : Foreground )

次に、ファイル転送を行います。プロトコルは SMB および HTTP を使用してファイルをダウンロードしています。優先度 ( Foreground ) を指定していますので、コマンドはファイル転送が完了するまでは復帰しません。
なお、Foreground でファイルのダウンロードを行うときは、優先度を特に設定する必要はありません。設定が必要なのは非同期ダウンロードを行うときです。

PS E:\> # モジュールのインポート
PS E:\> Import-Module BitsTransfer
PS E:\> 
PS E:\> # プロトコル SMB でファイルのダウンロード
PS E:\> Start-BitsTransfer -Source E:\src\download1.txt -Destination E:\dst\download2.txt
PS E:\>
PS E:\> # プロトコル HTTP でファイルのダウンロード
PS E:\> Start-BitsTransfer -Source http://localhost/BitsUpload/test.txt -Destination E:\dst\download_test.txt
PS E:\>

BITS によるファイル転送 ( 優先度 : High / Normal / Low )

非同期でファイルのダウンロードを行うには、Start-BitsTransfer コマンドレットのオプションを追加します。追加するオプションは以下の2つです。

オプション設定内容
-Asynchronous非同期でダウンロードすることを示す
-PriorityHigh / Normal / Low のいずれか。High が最も優先度が高く、Low が最も低い

非同期にファイルのダウンロードを行うサンプルになります。

PS E:\>  Start-BitsTransfer -Source E:\src\download1.txt -Destination E:\dst\download2.txt -Asynchronous -Priority Normal

JobId            DisplayName    TransferType  JobState     OwnerAccount
-----             -----------    ------------  --------     ------------
84c39fb7-9597...  BITS Transfer  Download      Connecting   masao-PC\masao

プロンプトがすぐに返ってきます。非同期ダウンロードのためファイル転送が完了しているかはわかりません。転送状況は、Get-BitsTransfer コマンドレットを使用して確認できます。

PS E:\> Get-BitsTransfer | Format-List

JobId               : 84c39fb7-9597-4c6f-bb25-2eacd3bbd4a3
DisplayName         : BITS Transfer
TransferType        : Download
JobState            : Transferred
OwnerAccount        : masao-PC\masao
Priority            : Normal
FilesTransferred    : 1
FilesTotal          : 1
BytesTransferred    : 2147450880
BytesTotal          : 2147450880
CreationTime        : 2015/11/09 22:13:02
ModificationTime    : 2015/11/09 22:14:05
MinimumRetryDelay   :
NoProgressTimeout   :
TransientErrorCount : 0
ProxyUsage          : SystemDefault
ProxyList           :
ProxyBypassList     :

JobState が、Transferred になっているので転送完了はしていることがわかります。しかし、この状態でエクスプローラーから転送先のディレクトリを確認するとファイルは存在していません。実際ファイルは、隠しファイル ( XXX.tmp ) として保存されています。

ファイルの転送は完了しているが、ジョブ自体は終了していない状態です。ジョブを終了させて、ファイルを転送先にリネームするには Complete-BitsTransfer コマンドレットを実行する必要があります。

PS E:\> # BITジョブを取得
PS E:\> $job = Get-BitsTransfer -JobId 84c39fb7-9597-4c6f-bb25-2eacd3bbd4a3
PS E:\> 
PS E:\> # ジョブを完了させる
PS E:\> Complete-BitsTransfer -BitsJob $job

Complete-BitsTransfer コマンドレット実行後 Get-BitsTransfer を実行してジョブが消えていることが確認できます

他ユーザーのジョブの確認 ( 管理者権限が必要 )

Get-BitsTransfer に -AllUsers オプションをつけることで、他ユーザーの BITS ジョブも確認することができますが、PowerShell を管理者権限で実行する必要があります。管理者権限がないと Get-BitsTransfer コマンドレットで例外が発生します。

PS E:\> Get-BitsTransfer -AllUsers
Get-BitsTransfer : アクセスが拒否されました。 (HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))
発生場所 行:1 文字:17
+ Get-BitsTransfer <<<<  -AllUsers
    + CategoryInfo          : PermissionDenied: (:) [Get-BitsTransfer]、UnauthorizedAccessException
    + FullyQualifiedErrorId : GetBitsTransferAuthException,Microsoft.BackgroundIntelligentTransfer.Management.GetBitsT
   ransfer

Get-BitsTransfer : アクセスが拒否されました。 (HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))
発生場所 行:1 文字:17
+ Get-BitsTransfer <<<<  -AllUsers
    + CategoryInfo          : NotSpecified: (:) [Get-BitsTransfer]、UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.BackgroundIntelligentTransfer.Management.Ge
   tBitsTransfer

BITS によるファイルアップロード

BITS によるアップロードは IIS のみでサポートされています。必要なサーバ環境は以下のリンクを参照してください。

IIS Requirements for BITS Uploads

IIS の設定

BITS でファイルのアップロードを行うには、IIS サーバに BITS ファイルのアップロード機能を追加する必要があります。今回使用したWebサーバ ( WindowsServer2008:IIS7.0 ) では、以下の手順で機能の追加を行いました。

[ 管理ツール ] – [ サーバー マネージャ ] – [ 機能 ] – [ 機能の追加 ] – [ BITS サーバー拡張 ]

機能の追加が正常に完了すると、IIS マネージャの機能ビューに、「BITS アップロード」が追加されますので、クライアントによるファイルのアップロードを許可 にチェックします。

ファイルのアップロード先のディレクトリに書き込み権限を与える必要もあります。また、ダウンロード / アップロードファイルの 拡張子によっては、別途設定を追加する必要があると思われます。

これで、Web サーバの準備が整いましたので、実際にファイルのアップロードを行ってみます。オプション -TransferType で [ Upload ] を指定する必要があります。

PS C:\> # BITS モジュールをインポート
PS C:\> Import-Module BitsTransfer
PS C:\> 
PS C:\> # フォアグラウンドでファイル転送
PS C:\> Start-BitsTransfer -Source E:\src\up1.txt -Destination  http://192.168.164.128/BitsUpload/up1.txt -TransferType Upload
PS C:\> 
PS C:\> # バックグラウンドでファイル転送
PS C:\> Start-BitsTransfer -Source E:\src\up2.txt -Destination  http://192.168.164.128/BitsUpload/up2.txt -TransferType Upload -Asynchronous -Priority Normal
PS C:\> 
PS C:\> # 転送状況を確認
PS C:\> Get-BitsTransfer

JobId                   DisplayName    TransferType   JobState      OwnerAccount
-----                   -----------    ------------   --------      ------------
10faf821-55a1-47d0-8... BITS Transfer  Upload         Transferred   masao-PC\masao

PS C:\> # 転送完了ジョブを取得
PS C:\> $job = Get-BitsTransfer -JobId 10faf821-55a1-47d0-887b-c717bff5add5
PS C:\> 
PS C:\> # ジョブを完了させる
PS C:\> Complete-BitsTransfer -BitsJob $job
PS C:\> Get-BitsTransfer

ダウンロードの場合は、ファイルの転送完了後 Complete-BitsTransfer コマンド実行前に Remove-BitsTransfer でジョブを削除した場合は転送先のファイルも削除されますが、アップロードの場合は、Remove-BitsTransfer コマンドによってジョブを削除してもアップロード済みのファイルは削除されません。

未検証ですが、IIS BITS 拡張のサーバ側のクリーンアップ設定で制御する必要がありそうです。また、ファイルの上書き許可なども IIS BITS 拡張の設定です。アップロードファイルサイズの制限も IIS の設定次第のようです。

ファイル転送の中断と再開

BITS ジョブは Suspend-BitsTransfer コマンドレットで ジョブを一時停止させ、Resume-BitsTransfer コマンドレットで停止したジョブを再開することができます。

PS E:\> # BITS 非同期ジョブを開始する
PS E:\> Start-BitsTransfer -Source E:\src\dl1.txt -Destination E:\dst\dl2.txt -Asynchronous -Priority Normal

JobId                   DisplayName    TransferType   JobState      OwnerAccount
-----                   -----------    ------------   --------      ------------
8a7ab0f9-a38a-4935-a... BITS Transfer  Download       Connecting    masao-PC\masao

PS E:\> # ジョブオブジェクトを取得し、一時停止する
PS E:\> $job = Get-BitsTransfer
PS E:\> Suspend-BitsTransfer -BitsJob $job

JobId                   DisplayName    TransferType   JobState      OwnerAccount
-----                   -----------    ------------   --------      ------------
8a7ab0f9-a38a-4935-a... BITS Transfer  Download       Suspended     masao-PC\masao

PS E:\> # ジョブを再開させる(-Asynchronous なしだと、同期モードで再開される)
PS E:\> Resume-BitsTransfer $job -Asynchronous

JobId                   DisplayName    TransferType   JobState      OwnerAccount
-----                   -----------    ------------   --------      ------------
8a7ab0f9-a38a-4935-a... BITS Transfer  Download       Connecting    masao-PC\masao

PS E:\> # 転送が終わったら(ステータス:Transferred)ジョブを完了させる
PS E:\> Complete-BitsTransfer -BitsJob $job
PS E:\>

このように、BITS ジョブの停止と再開は非常に簡単に行うことができます。サンプルでは 非同期転送を行っていますが、 Resume-BitsTransfer のパラメーターにも -Asynchronous を指定して非同期転送として再開しています。

仮に Resume-BitsTransfer コマンドレットを -Asynchronous パラメータをつけなかった場合には、同期 ( フォアグラウンド ) モードで再開します。

ジョブステータスと Complete-BitsTransfer

ファイル転送が完全に完了していない BITS ジョブに対して Complete-BitsTransfer コマンドレットを発行すると例外が発生します。ファイル転送が完了していない一時停止中のジョブでも同じく例外となります。
しかし、ファイル転送が完了しているジョブ ( ステータス:Transferred ) を Suspend-BitsTransfer で一時停止状態にしたジョブに対して Complete-BitsTransfer を発行したときは、正常にジョブが完了してファイル転送も正常に終了します。ジョブが停止中かどうかは Complete-BitsTransfer コマンドには関係ないようです。

参考
スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>