tech.guitarrapc.cóm

Technical updates

PowerShell で wget のようにファイルダウンロードをしたい

某Linux には wget や Curl など、ダウンロードに便利なコマンドがあります。 では PowerShell は、ファイルダウンロードの際に一々 .NETを記述、叩かなくてはいけないのでしょうか? PowerShell 3.0からはそんなことありません。

Invoke-WebRequest

を使うことで、ファイルダウンロードが用意に出来るようになりました。 今回、サクッとつかうのにfunctionでラップしたので、サンプルをどうぞ。 

基本記述

Invoke-WebRequestは、基本的にはこの形式でファイルダウンロードが可能です。

Invoke-WebRequest -Uri 対象URI -OutFile 保存するローカルパス

簡単ですね!

functionにしてみる

GitHubに置いておきました。 https://github.com/guitarrapc/PowerShellUtil/blob/master/Invoke-DownloadFile/Invoke-DownloadFile.ps1 ざっくり、このようなfunctionです。

#Requires -Version 3.0

function Invoke-DownloadFile{

	[CmdletBinding()]
	param(
		[parameter(Mandatory,position=0)]
		[string]
		$Uri,

		[parameter(Mandatory,position=1)]
		[string]
		$DownloadFolder,

		[parameter(Mandatory,position=2)]
		[string]
		$FileName
	)

	begin
	{
		If (-not(Test-Path $DownloadFolder))
		{
			try
			{
				New-Item -ItemType Directory -Path $DownloadFolder -ErrorAction stop
			}
			catch
			{
				throw $_
			}
		}

		try
		{
			$DownloadPath = Join-Path $DownloadFolder $FileName -ErrorAction Stop
		}
		catch
		{
			throw $_
		}
	}

	process
	{
		Invoke-WebRequest -Uri $Uri -OutFile $DownloadPath -Verbose -PassThru
	}

	end
	{
		Get-Item $DownloadPath
	}

}

利用方法

ようは、保存先のが存在しない場合は作ったりしてくれるようにしたのです。

たとえば、SumoLogicから、Windows用のインストーラをダウンロードして、D:\hogeに SumoCollector_WindowsSetup.exe として、名前を付けて保存する場合はこのようになります。

Invoke-DownloadFile -Uri "https://collectors.sumologic.com/rest/download/windows" -DownloadFolder "D:\hoge" -FileName "SumoCollector_WindowsSetup.exe"

これで wget にぐぬぬは無いですね。 たぶん、きっと。