WindowsのPowerShellでインターネットからファイルをダウンロードする方法

WindowsのPowerShellでインターネットからファイルをダウンロードする方法

PowerShellでインターネット上のファイルを利用したい場合、あらかじめ手動でダウンロードしておくのも手ですが、スクリプト内で直接ダウンロードすることもできます。

そこでここでは、PowerShellでインターネットからファイルをダウンロードする方法を2つ紹介します。

この記事は、以下の環境で実行した結果を基にしています。他のエディションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
Windows 10 Pro 64bit1809
PSVersion5.1.17763.134

ダウンロード方法 その1

一つ目の方法は「.Net Framework」の「System.Net.WebClient」クラスを用いた方法で、以下の例では、Firefoxのインストラーをダウンロードしています。

# ダウンロードするファイルのURL
PS> $target_url = "https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=ja"
# ローカルの保存先
PS> $file_path = "E:\test\firefox.exe"

# ファイルのダウンロード
PS> $web_client = New-Object System.Net.WebClient
PS> $web_client.DownloadFile($target_url, $file_path)

WebProxyクラスとNetworkCredentialクラスを併用すれば、認証付きプロキシーサーバー経由でも利用可能です。

# ダウンロードするファイルのURL
PS> $target_url = "https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=ja"
# ローカルの保存先
PS> $file_path = "E:\test\firefox.exe"

# プロキシサーバー設定
PS> $proxy_url = "http://proxy.hoge.co.jp:8080"
PS> $proxy_user = "testuser"
PS> $proxy_pass = "Password"

PS> $proxy_server = New-Object System.Net.WebProxy($proxy_url, $true)
PS> $credential = New-Object System.Net.NetworkCredential($proxy_user, $proxy_pass)
PS> $proxy_server.Credentials = $credential

# ファイルのダウンロード
PS> $web_client = New-Object System.Net.WebClient
PS> $web_client.Proxy = $proxy_server
PS> $web_client.DownloadFile($target_url, $file_path)

ダウンロード方法 その2

二つ目の方法は「Invoke-WebRequest」コマンドレットを用いた方法で、以下の例では、Firefoxのインストラーをダウンロードしています。

# ダウンロードするファイルのURL
PS> $target_url = "https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=ja"
# ローカルの保存先
PS> $file_path = "E:\test\firefox.exe"

# ファイルのダウンロード
PS> Invoke-WebRequest -Uri $target_url -OutFile $file_path

「Invoke-WebRequest」コマンドレットのプロキシー関連オプションを用いれば、認証付きプロキシーサーバー経由でも利用可能です。

# ダウンロードするファイルのURL
PS> $target_url = "https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=ja"
# ローカルの保存先
PS> $file_path = "E:\test\firefox.exe"

# プロキシサーバー設定
PS> $proxy_url = "http://hogehoge.com:8080"
PS> $proxy_user = "testuser"
PS> $proxy_pass = "Password"
PS> $s = ConvertTo-SecureString $proxy_pass -AsPlainText -Force
PS> $proxy_cred = New-Object System.Management.Automation.PSCredential $proxy_user,$s

# ファイルのダウンロード
PS> Invoke-WebRequest -Uri $target_url -OutFile $file_path -Proxy $proxy_url -ProxyCredential $proxy_cred
Memo

ここでは、単純な例としてパスワードを直書きしていますが、セキュリティを考えると、あらかじめパスワードを暗号化文字列にした上で別のファイルに保存しておいて、そのファイルを参照するように書き換えたほうが良いと思います。

あとがき

インターネットに公開されているツールなどをスクリプト内で実行したい場合に、事前にダウンロードしておかなくても、スクリプト内でダウンロードできて便利です。