1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

bitsadmin~Windowsのコマンドラインで、HTTPを使ってファイルをダウンロードする方法

Last updated at Posted at 2019-12-12

bitsadminの使い方がちょっと厄介。
まず「ダウンロードジョブ」と呼ぶものを作り(/create)、
そこにダウンロードファイルと保存先を指定するコマンドを登録し、
そのジョブを実行することで初めてHTTPでのファイルダウンロードを始める。
そして、最後にはそのジョブを後片付け(削除)する必要がある(/complete)。
あと、コマンド実行中の状況(ダウンロード中なのか、接続に失敗したのか、完了したのか)が分からないが、
別のコマンドプロンプトで
bitsadmin /rawreturn /info {ジョブ名}
コマンドを実行することでリアルタイムに確認できる。
※大抵の失敗は
「TRANSIENT_ERROR - 回復可能なエラーが発生しました。 最小再試行遅延が切れると転送が再試行されます。」
だけど、たいていはもう一回resumeすればいい模様。

わたしはこんな感じでバッチを作りました。

httpDownloader.bat
@echo off
@echo,
@echo ### ダウンロードジョブにダウンロード対象ファイルを指定します。
bitsadmin /rawreturn /create /Download myDLjob
bitsadmin /rawreturn /addfile myDLjob http://?????????????? {ダウンロード先フルパス}
:<ダウンロードしたいファイル分addfile


@echo,
@echo    ### ファイルをダウンロードします。
call :bitsadminDL自動判定 myDLjob

@if errorlevel 1 (
    @REM 戻り値1以上は失敗
    bitsadmin /rawreturn /reset
) else (
    bitsadmin /rawreturn /complete myDLjob
)

@echo    ※「Job completedが出ていれば全ファイルのDLが完了しています
@echo,
@echo    ### ダウンロードジョブ状態確認
bitsadmin /rawreturn /list
@echo    ※「bitsadmin /rawreturn /list実行で何か残っていればDLに失敗しています
@echo      なお、「bitsadmin /cancel myDLjob」でジョブをクリアできます。

exit /b 0


@REM ---------------------------------------------------------------------------
:addfiles
bitsadmin /rawreturn /addfile myDLjob http://172.24.170.133:7350/%1/%2 %WORKDIR%\%1\%2

exit /b 0

@REM ---------------------------------------------------------------------------
@REM ### 呼び元でジョブをcreateし、completeしてください。
:bitsadminDL自動判定

@setlocal

@if [%1] == [] (
    @echo   [X] arg1:ジョブ名を指定してください。
    exit /b 1
)

@set myDLjob=%1
@set RESULT=


:LOOP
echo %RESULT% | find "TRANSFERRED" > nul
@if not errorlevel 1 (
    @echo,
    @echo    ### 転送完了
    exit /b 0
)

echo %RESULT% | find "CONNECTING" > nul
@if errorlevel 1 (
    @REM ### それ以外の場合は転送ジョブを再開する。
    bitsadmin /rawreturn /resume %myDLjob%
) else (
    @REM ### 転送中の場合はちょっと待つ
)

choice /C YN /T 2 /D N /M "やめる?[Y]/other"
@if errorlevel 2 (
    @REM ### "N"の場合2 ※入力タイムアウト(2秒)でも"N"
    for /f "usebackq delims=" %%a in (`bitsadmin /rawreturn /info %myDLjob%`) do set RESULT=%%a
    goto :LOOP
) else (
    @REM ### "Y"の場合1(2未満なのでこちらの分岐)
    @REM ### 続けないなら、ジョブをresetして終了。
    bitsadmin /rawreturn /reset
)


@endlocal
exit /b 9999
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?