Windows環境で大量のファイルをダウンロードしたかったが、wget
が使えなかったので即席で対処したメモ。
結論
ファイル file
にダウンロードしたいURLのリストを書いておき、下記コマンドを実行すると、カレントディレクトリにファイル名のまま保存される。
なお、1行のみのファイルではうまく動かないはず。
Get-Content file | %{ Invoke-WebRequest $_ -OutFile ( Split-Path ( New-Object System.Uri($_) ).AbsolutePath -Leaf ) }
解説(というか備忘録)
Get-Content file
file
から読み込んで、1行ずつのリスト(?)にして返す。
今回はパイプに渡しているので、次の %{ }
に渡される。
なお、ファイルが1行のみの場合、行単位のリスト(長さ1のリスト)にはならず、
各文字で分断されてリスト化されるらしい?
%{ }
%{ }
は Foreach-Object { }
のエイリアス。
リストの入力を受け付け、リストの各要素に対して、 { }
内の処理を行う。
{ }
内では、各要素は $_
で参照できる。(Perlみたい。)
Invoke-WebRequest
wget
っぽいコマンドレット。というかエイリアスとして wget
が登録されている。
-OutFile
オプションが無いと、ファイルが保存されないっぽい。
Split-Path ( New-Object System.Uri($_) ).AbsolutePath -Leaf
URIからファイル名の部分を抽出している。
New-Object
で.NETオブジェクト: System.Uri を作成して、
その AbsolutePath
属性を Split-Path
に渡して、最後の要素を取得するとファイル名になっている・・・というカラクリのハズ。
参考にしました
感想
パイプでオブジェクトを渡せたり、関数?プロシージャ?が第一級オブジェクトのように見えたりと、
Powershellかなりアツイんじゃないかと思った。
ちゃんと勉強したい。