Windows Server 2012 でテキストから URL を取得してファイルのダウンロードをしたかったので作ってみました。
■PowerShell から BITS を使用してファイルをダウンロード
Windows Server 2012 では、PowerShell から BITS を使用するためのコマンドレットが標準で提供されています。
ヒント: BITS (バックグラウンド インテリジェント転送サービス) を Windows PowerShell で管理する
Background Intelligent Transfer Service (BITS) Cmdlets
BITS 用のコマンドとして BITSADMIN があり、こちらからもファイルのダウンロードをすることができるのですが、ダウンロード時のファイル名を指定しなくてはいけないようでしたので、PowerShell を使っています。
PowerShell で BITS を使用してダウンロードする場合、保存先はパスの子弟だけでよかったもので。
$List = "C:tempSessionList.txt" Import-Csv $List | ForEach-Object{Start-BitsTransfer -DisplayName $_.URL -Source $_.URL -Destination $SavePath -Asynchronous} do{ Write-Host "`nDownload Complete!!`n" |
このスクリプトは以下のようなファイルから URL を読み込み、指定したディレクトリに BITS を使用して非同期でファイルをダウンロードするものになります。
この URL は Channel9 の Tech Ed のスライドの URL になるのですが、このようなセッション資料を一括でダウンロードしたい場合に URL のリストを作成して使用しています。
BITS を使用したダウンロードでは各ダウンロードの要求がジョブとして登録されます。
同期の場合はダウンロードが完了すれば実ファイルを使用することできるようになるのですが、非同期で処理をしている場合、ダウンロードが完了したジョブに対して [Complete-BitsTransfer] を実行する必要があります。
これを実行して転送を確定しないと、ダウンロード先として指定ディレクトリ内には隠しファイルとしてのみファイルが存在した状態になり、ダウンロードのジョブも登録されたままとなります。
この状態を解消するためジョブを登録した後に、転送要求中のファイルの状況を確認しながら定期的に [Complete-BitsTransfer] を実行して、ジョブを完了させています。
ファイルが存在しない場合などはジョブがエラーの状態で残ったままとなってしまいますので、最後にダウンロードできなったジョブを表示し、削除するためのコマンドを表示して処理を終了しています。
ジョブの表示名として URL を設定していますので、どのファイルが失敗したのかの判断ができるかと。