Windowsでもバッチファイルでファイルのダウンロードをしたい事がある。
そうすると、たとえばIEにURLを渡して起動するといったような事が考えられるが、いちいち保存を選ばないといけないとか、何かの操作が必要になってしまう。
これではバッチファイルの意味がない。
無人で行う方法にはいくつかあるだろうが、ここではcurlを使ってみる。

curlとは

curlとは、URLを使った、データ送受信コマンドである。
UNIX/Linux系では有名なコマンドだけれども、実はWindows向けバイナリも配布されている。

公式サイト
http://curl.haxx.se/
Wikipedia
http://ja.wikipedia.org/wiki/CURL

インストール

上記サイトのダウンロードページから取得。
http://curl.haxx.se/download.html

Windows向けには32bit版, 64bit版のほか、Generic版, MSVC版がある。
さらにMSIとzipが選べる。

Genericの方が最新なのでこちらを使った。2014/1/7現在のバージョンは7.34.0。
Windows7だけど2000/XPのもので問題なし。

インストーラは使いたくないのであれば、MSIではなくzipの方でどうぞ。
ただしzipの場合は、PATHを通すなどの作業は自分でしないといけないよう。

curlの使い方

curlはオプションが多くてウンザリする。
以下のサイトが適切な量にまとまっていると思う。

http://d.hatena.ne.jp/hogem/20091122/1258863440

curlの使い方例

proxy越しにMicrosoft Security Essential定義ファイルのダウンロードをする例。

C:¥home¥tools¥curl>curl -O -x this.is.sample.proxyserver.com:8080 "http://download.microsoft.com/download/DefinitionUpdates/mpam-fe.exe"

curlは、そのままだとダウンロードした内容を標準出力に表示する。
-Oを付けると、ダウンロード先のファイル名で保存する。
この場合だとmpam-fe.exeとして保存する。

proxyサーバは、-xあるいは-proxyで指定する。
書式は<[protocol://][user:password@]proxyhost[:port]>

プロトコル指定がなければHTTP proxyとして扱われる。
ポート番号については、指定がなければ1080として扱われる。

例ではproxyサーバとしてthis.is.sample.proxyserver.com:8080を指定。
定義ファイルのダイレクトリンクとして http://download.microsoft.com/download/DefinitionUpdates/mpam-fe.exe を指定している(いつまで使えるかは分からない)

追記: リトライ数、リトライ感覚の指定

サーバの反応が悪く、ダウンロード途中で失敗してしまうことがある。
そういう場合には、-retry -retry-delay を指定しておこう。

curlのman抜粋

以下、-xと-Oのマニュアルを抜粋。

-x, --proxy <[protocol://][user:password@]proxyhost[:port]>

Use the specified proxy. 

The proxy string can be specified with a protocol:// prefix to specify alternative proxy protocols. Use socks4://, socks4a://, socks5:// or socks5h:// to request the specific SOCKS version to be used. No protocol specified, http:// and all others will be treated as HTTP proxies. (The protocol support was added in curl 7.21.7)

If the port number is not specified in the proxy string, it is assumed to be 1080.

This option overrides existing environment variables that set the proxy to use. If there's an environment variable setting a proxy, you can set proxy to "" to override it.

All operations that are performed over an HTTP proxy will transparently be converted to HTTP. It means that certain protocol specific operations might not be available. This is not the case if you can tunnel through the proxy, as one with the -p, --proxytunnel option.

User and password that might be provided in the proxy string are URL decoded by curl. This allows you to pass in special characters such as @ by using %40 or pass in a colon with %3a.

The proxy host can be specified the exact same way as the proxy environment variables, including the protocol prefix (http://) and the embedded user + password.

If this option is used several times, the last one will be used.
-O, --remote-name

Write output to a local file named like the remote file we get. (Only the file part of the remote file is used, the path is cut off.)

The remote file name to use for saving is extracted from the given URL, nothing else.

Consequentially, the file will be saved in the current working directory. If you want the file saved in a different directory, make sure you change current working directory before you invoke curl with the -O, --remote-name flag!

There is no URL decoding done on the file name. If it has %20 or other URL encoded parts of the name, they will end up as-is as file name.

You may use this option as many times as the number of URLs you have.```