ここでは、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 | 非同期でダウンロードすることを示す |
-Priority | High / 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 コマンドには関係ないようです。
参考
- ヒント: BITS (バックグラウンド インテリジェント転送サービス) を Windows PowerShell で管理する
- Windows 管理フレームワーク (Windows PowerShell 2. 0、WinRM 2. 0、および BITS 4. 0)
- Start-BitsTransfer
- HTTP Requirements for BITS Downloads
- Suspend-BitsTransfer
- Resume-BitsTransfer