PowerShellファイルをダウンロードするスクリプト

powershell コンピュータ
powershell

PowerShellではInvoke-WebRequestコマンドレットを使うとWebサイトからファイルのダウンロードが出来ます。
保存するファイル名の指定する必要がありますが、複数のUriを処理する場合ファイル名の指定が煩わしいので省略できるようにしてみました。

<#
.SYNOPSIS
Webサイトからファイルをダウンロード

.DESCRIPTION
uriを指定してファイルをダウンロードします。
パイプラインで複数のuriを指定し連続してダウンロードすることも出来ます。

.EXAMPLE
.\dl.ps1 -UriStr "https://maywork.net/"

.EXAMPLE
"https://maywork.net/" | .\dl.ps1

.EXAMPLE
Get-Clipboard | .\dl.ps1

.EXAMPLE
Get-Content list.txt | .\dl.ps1

.PARAMETER UriStr
ダウンロードするファイルのuri文字列

.PARAMETER OutDir
保存するファイルのディレクトリ

.LINK

#>
Param(
    [string]$UriStr,
    [string]$OutDir,
    [switch]$Help
)

function Download
{
    param([string]$uri_str)

    # デフォルトファイル名
    $DEFALUT_FILENAME = "index.html"

    # URIオブジェクト
    $uri = [System.Uri]::new($uri_str)

    # 保存するファイル名
    $fileName = [System.IO.Path]::GetFileName($uri.LocalPath)

    # ファイル名が無い場合デフォルトファイル名
    if ($fileName -eq "") { $fileName = $DEFALUT_FILENAME }

    # 重複ファイルの処理
    $i = 0
    $base = [System.IO.Path]::GetFileNameWithoutExtension($fileName)
    $ext = [System.IO.Path]::GetExtension($fileName)
    while( Test-Path $fileName ) {
        $i++
        $fileName = ("{0}({1}){2}" -f $base, $i, $ext)
    }

    # ダウンロード
    Invoke-WebRequest $uri -OutFile $fileName

    $fileName
}



# パイプラインのデータを配列に変換
$pipeArray = @($input)

# ヘルプの表示
if ($Help -Or (-Not $UriStr -And $pipeArray.Count -eq 0))
{
    Get-Help $PSCommandPath -full # 自分自身のヘルプを呼び出し
    Exit 1 # スクリプトを終了
}

# カレントディレクトリを退避
$pwd = Get-Location
# ディレクトリを変更
if ($OutDir)
{
    Set-Location $OutDir
}

if ($pipeArray.Count -eq 0)
{
    # 単一Uri
    Download $UriStr
} else {
    # 複数Uri
    $pipeArray | % { Download $_ }
}

# カレントディレクトリの回復
Set-Location $pwd

スクリプトは引数でuriを指定する方法と、パイプラインで複数のuriを送り込む方法を用意しました。
スクリプト内の実行例(EXAMPLE)に記述しましたが、パイプラインが使えることでクリップボードやテキストファイル経由で複数のuriを連続ダウンロードすることも出来ます。

コメント