Windows TIPS
[PowerShell]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

PowerShellを使って指定したファイルをインターネットからダウンロードする

解説をスキップして操作方法を読む

山田 祥寛
2008/03/07
対象OS
Windows PowerShell
PowerShellでは、.NET Frameworkが提供する基本クラス・ライブラリを自由にスクリプト・コードから利用できる。
WebClientクラスを利用すれば、インターネット上のファイルをアクセスしたり、ダウンロードしたりできる。

解説

 PowerShellの注目すべき特徴の1つとして、.NET Frameworkで提供する標準的なクラス・ライブラリを自由に利用できるという点が挙げられる。これによって、PowerShellスクリプトではVisual BasicやC#と限りなく同等の操作を行うことが可能になるわけだ。

 本稿では、.NET Frameworkが提供する基本クラス・ライブラリを利用して、あらかじめ指定したURLからファイルを一括ダウンロード、所定のフォルダに保存する方法について紹介する。ネットワーク経由でファイルを取得するWebClientクラス(System.Net名前空間)の基本的な使い方を、サンプル・スクリプトを通じて理解してみよう。

操作方法

 *注意
PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については「PowerShellをインストールする」を参照してください。

手順1――テキスト・エディタでPowerShellのコードを入力する

 まずはテキスト・エディタを開き、以下のコードを入力する。なお「#〜」で始まる行は、コードの意味を解説するためのコメント部分なので省略してもよい。コメントにはスクリプトの簡単な説明を入れておいた。

※ファイル:DownloadFile.ps1

# パラメータとして、ファイルを保存するパス、ダウンロードファイル・リストのファイル名を宣言
Param([String]$path='C:\tmp', [String]$file='list.dat')

# ファイルをダウンロードするためのWebClientオブジェクトを生成
$cli = New-Object System.Net.WebClient
# ファイルリストから順にURLを抽出
foreach($url in Get-Content $file){
    # 取り出したURLからファイル名を取り出し、変数$fileにセット
  $uri = New-Object System.Uri($url)
  $file = Split-Path $uri.AbsolutePath -Leaf
    # 指定されたURLからファイルをダウンロードし、同名のファイル名で保存
  $cli.DownloadFile($uri, (Join-Path $path $file))
  $file + "をダウンロード完了しました。"
}

※ファイル:list.dat(ダウンロードするファイルのリスト)

http://ftp.riken.jp/net/apache/commons/cli/binaries/commons-cli-1.1.zip
http://www.meisei-u.ac.jp/mirror/apache/dist/commons/beanutils/binaries/commons-beanutils-1.8.0-BETA.zip
http://ftp.kddilabs.jp/infosystems/apache/commons/collections/binaries/commons-collections-3.2.zip
上の2つのサンプル・ファイルをダウンロードするには、ここをクリックしてください。

 PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名自体はなんでも構わないが、ここでは「DownloadFile.ps1」という名前で保存しておこう。

 また、list.datの方はDownloadFile.ps1から読み込むダウンロード対象のファイルのリスト(テキスト・ファイル)である。ここでは適当なURLをいくつか指定しているが、適宜、自分の用途に合わせて内容は変更してほしい。

 コード全体の流れについてはリスト内のコメントをご覧いただくとして、以下ではいくつか重要なポイントにフォーカスしてみよう。

■1.テキスト・ファイルを読み込むのはGet-Contentコマンドレットの役割
 まずは、ダウンロードファイルのリストを定義したlist.datを読み込む必要がある。

 このような改行区切りの情報を読み込むために、.NET Frameworkで提供するクラス・ライブラリを利用することも可能であるが、PowerShell標準のGet-Contentコマンドレットがより手軽に使用できる。Get-Contentコマンドレットの基本的な構文は、以下のとおり。

Get-Content ファイルのパス

 Get-Contentコマンドレットはファイルの内容を改行単位に読み込み、結果を文字列配列として返す。つまり、ここではGet-Contentコマンドレットによって得られた読み込み内容(=list.datで定義されたURLの配列)を、foreachループで順番に取得/処理しているというわけだ。

■2.絶対URLからファイル名を取得する方法
 本サンプルでは、ダウンロードしたファイルをファイル・システムに保存する際に、オリジナルのファイル名を使用している。そのために、まずはもともとのURLからファイル名だけを取り出す必要がある。URLからファイル名だけを取り出すには、いくつかの方法があるが、ここでは.NET Frameworkが提供するUriクラス(System名前空間)とPowerShell標準のSplit-Pathコマンドレットを使用することにしよう。

 Uriクラスのコンストラクタには、元となるURL(文字列)を指定すればよい。Uri.AbsolutePathプロパティで「/net/apache/commons/cli/binaries/commons-cli-1.1.zip」のような絶対パスを取得できるので、あとは、ここからファイル名の部分を取り出すだけだ。ファイル名を取り出すには、Split-Pathコマンドレットで-Leafオプションを指定すればよい(Split-Pathコマンドレットについては、後日、別稿「PowerShellでパスを操作する方法」で紹介する予定だ*1)。

*1 取得した変数$urlを直接にSplit-Pathコマンドレットに渡せばよいと思われるかもしれないが、これはできない。Split-Pathコマンドレットで絶対URLを処理しようとした場合にはエラーとなる。

■3.ネットワーク上のリソースを取得するのはWebClientクラスの役割
 インターネット上のコンテンツ(ここでは指定された「.zip」ファイル)を取得するのは、.NET Frameworkで提供されているWebClientクラス(System.Net名前空間)の役割だ。

 本サンプル・プログラムでは、WebClientクラスのDownloadFileメソッドを利用して、指定されたURLから「.zip」ファイルを取得している。DownloadFileメソッドの一般的な構文は次のとおりである。

WebClientオブジェクト.DownloadFile(ダウンロードするファイルのURL, 保存先のパス)

 本サンプルでは、第1引数としてUriオブジェクトを指定しているが、絶対URLを文字列として指定しても構わない。第2引数には、保存先のパスを指定する。保存先のパスを生成するには、引数$pathと先ほどのSplit-Pathコマンドレットで生成したファイル名とをJoin-Pathコマンドレットで結合すればよい(Join-Pathコマンドレットについては今後別TIPSで紹介予定)。

手順2――PowerShellのスクリプト・コードを実行する

 DownloadFile.ps1を実行するには、PowerShellのプロンプトを開いたうえで、以下のようにコマンドを実行すればよい(カレント・フォルダにスクリプトとlist.datファイルが保存されているものとする*2)。

PS > ./DownloadFile.ps1
commons-cli-1.1.zipをダウンロード完了しました。
commons-beanutils-1.8.0-BETA.zipをダウンロード完了しました。
commons-collections-3.2.zipをダウンロード完了しました。

*2 PowerShellでスクリプト・ファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、別稿「Windows PowerShellコマンド&スクリプティング入門(後編)」も参照いただきたい。

 上のような結果が表示され、所定のフォルダ(ここでは「c:\tmp」)に指定したファイルが保存されていれば成功だ(*3)。

*3 本サンプルではフォルダ/ファイルの存在チェックなどは行っていないため、リスト・ファイルや保存先のファイルが存在しない場合は正しく動作しないので、注意すること。

 なおここではDownloadFile.ps1の引数をすべてデフォルトのまま使用しているが、もちろん、

PS> ./DownloadFile.ps1 c:\ data.txt

のように指定してもよい。この場合、data.txtで指定したリストの内容に従って、ダウンロードしたファイルが「c:\」フォルダに保存される。End of Article

「Windows TIPS」

@IT Special

- PR -

TechTargetジャパン

Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間
ソリューションFLASH