SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

PowerShell で BITS を使用して CUI でファイルをダウンロード

leave a comment

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"
$SavePath = "C:tempEventTech Ed 2012 Europe"
# Get-BitsTransfer | Remove-BitsTransfer

Import-Csv $List | ForEach-Object{Start-BitsTransfer -DisplayName $_.URL -Source $_.URL -Destination $SavePath -Asynchronous}
$cnt = (Get-BitsTransfer | Where-Object {($_.JobState -eq "Transferred") -or ($_.JobState -eq "Transferring") -or ($_.JobState -eq "Connecting")}).Count
Write-Host "`nDownload Start!! Total $cnt files"

do{
    Start-Sleep 10
    Get-BitsTransfer | Where-Object {$_.JobState -eq "Transferred"} | Complete-BitsTransfer
    $cnt = (Get-BitsTransfer | Where-Object {($_.JobState -eq "Transferred") -or ($_.JobState -eq "Transferring") -or ($_.JobState -eq "Connecting")}).Count
    Write-Host "Now Downloading…. Remaining $cnt files"
}while($cnt -ne 0)

Write-Host "`nDownload Complete!!`n"
Write-Host "============= Error Job List =============="
Get-BitsTransfer | ft DisplayName, JobState -AutoSize
Write-Host "==========================================="
Write-Host "`nRemove Bits Job Command : Get-BitsTransfer | Remove-BitsTransfer"

 

このスクリプトは以下のようなファイルから URL を読み込み、指定したディレクトリに BITS を使用して非同期でファイルをダウンロードするものになります。
image

この URL は Channel9 の Tech Ed のスライドの URL になるのですが、このようなセッション資料を一括でダウンロードしたい場合に URL のリストを作成して使用しています。

BITS を使用したダウンロードでは各ダウンロードの要求がジョブとして登録されます。
同期の場合はダウンロードが完了すれば実ファイルを使用することできるようになるのですが、非同期で処理をしている場合、ダウンロードが完了したジョブに対して [Complete-BitsTransfer] を実行する必要があります。
これを実行して転送を確定しないと、ダウンロード先として指定ディレクトリ内には隠しファイルとしてのみファイルが存在した状態になり、ダウンロードのジョブも登録されたままとなります。

この状態を解消するためジョブを登録した後に、転送要求中のファイルの状況を確認しながら定期的に [Complete-BitsTransfer] を実行して、ジョブを完了させています。

ファイルが存在しない場合などはジョブがエラーの状態で残ったままとなってしまいますので、最後にダウンロードできなったジョブを表示し、削除するためのコマンドを表示して処理を終了しています。

ジョブの表示名として URL を設定していますので、どのファイルが失敗したのかの判断ができるかと。

Share

Written by Masayuki.Ozawa

9月 27th, 2012 at 9:16 pm

Leave a Reply