LoginSignup
2
4

More than 1 year has passed since last update.

PowerShellでファイルを一括ダウンロード【非エンジニア向け】

Last updated at Posted at 2022-05-07

これは何?

エンジニアでない人でもちょっとしたコードを書いて仕事をサクッと終わらせるためのTipsの紹介を目的とした記事です。

注意事項

非IT企業にお勤めの方は、このTipsを後任に引継ぐような業務にはくれぐれも利用しないでください。
業務フローの変更などによりコードの修正が必要になった場合、後任の方に大きな負担がかかるだけでなく、業務の遅滞・停止に発展する可能性があります。
あくまでもご自身の作業の範囲で、涼しい顔で定時退社するデキるビジネスマンになるための秘密道具としてご活用ください。

このTipsの利用シーン

イントラサイトなどから複数の資料を大量にダウンロードするような場面で効果的です。
ダウンロード先のフォルダやダウンロードした際のファイル名も指定できるので、ダウンロード後にファイルを移動したりリネームさせる手間を省くこともできます。

PowerShellって?

Windowsに標準で搭載されているプログラム言語です。
コマンドプロンプト(黒い画面)のように一行ずつコマンド(命令)を書いて実行したり、今回紹介するような予め書いたコードを実行することもできます。
実行ファイルの拡張子は.ps1ですが、メモ帳などで作成したテキストファイルの拡張子を.txtから.ps1に変更してあげればOKです。
なお、Windowsには標準でISE(あいす)というエディタが標準で用意されており、そこでコードの記述や確認(デバッグ)などが行えます。

サンプルスクリプト全文

まずはサンプルスクリプト(コード)全体を紹介します。(詳しい解説は後半に)
なお、元となった事例ではFTPサーバーに動画ファイルを、WebサーバーにPDF等の資料ファイルをそれぞれ保存していたため、それら2つのサーバーからファイルを取得する前提の内容になっています。

PowerShell

# ダウンロード用のフォルダを作成
New-Item 'C:\Users\Desktop\DownloadFile\Seminar01' -ItemType Directory

# FTPサーバーのUser・Pass・URLを定義
$user = 'SampleUser'
$pass = 'hogehoge'

# FTPログイン情報をcredに定義
$str = ConvertTo-SecureString $pass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($user, $str)

# ファイルダウンロード(FTP)
Invoke-WebRequest -Uri "192.168.x.x/SeminarMovie.mp4" -OutFile "C:\Users\Desktop\DownloadFile\Seminar01\SeminarMovie.mp4" -Credential $cred
# ファイルダウンロード(HTTP)
Invoke-WebRequest -Uri "http://home.intra/SeminarText.pdf" -OutFile "C:\Users\Desktop\DownloadFile\Seminar01\SeminarText.pdf"

BAT

echo 実行中...
powershell -NoProfile -ExecutionPolicy Unrestricted .\SampleScript.ps1
echo 実行完了
pause > nul
exit

解説

PowerShell

ダウンロード用のフォルダの作成

フォルダの作成は、
New-Item '(作成したいフォルダのフルパス)' -ItemType Directory
と書きます。

FTPサーバーへのログイン情報の定義

FTPサーバーへのログインに必要なユーザーとパスワードを'cred'と名付けたオブジェクト(「クレデンシャルオブジェクト」という)に格納します。
なお、予めオブジェクト格納前にパスワードをConvertTo-SecureString (保護したい文字列) -AsPlainText -Forceでセキュリティで保護された文字列に変換しておきます。
※このとき、パラメータである-AsPlainText -Forceも必ずセットで記述してください。
その後、新しいオブジェクトとして'cred'を定義し、System.Management.Automation.PSCredential()メソッドでユーザーやセキュリティ保護したパスワードを渡す流れになります。

ファイルのダウンロード

FTPでもHTTPでもInvoke-WebRequest -Uri "(ダウンロード元アドレス)" -OutFile "(ダウンロード先アドレス)"と記述しますが、FTPでは後に上述のFTPサーバーへのログイン情報を付け加えます。
※なお、パラメータの-Uri-Urlと間違いがちなので要注意。

HTTP

Invoke-WebRequest -Uri "http://home.intra/SeminarText.pdf" -OutFile "C:\Users\Desktop\DownloadFile\Seminar01\SeminarText.pdf"

FTP

Invoke-WebRequest -Uri "192.168.x.x/SeminarMovie.mp4" -OutFile "C:\Users\Desktop\DownloadFile\Seminar01\SeminarMovie.mp4" -Credential $cred

BAT

PowerShellファイル(.ps1)の実行方法はいくつかあリますが(参考)、今回は別途作成したバッチファイル(.bat)から起動する方法を選択しました。
以下の一行がPowerShellファイルの実行部分なので、実質的にはこれだけ記述しておけば問題はありません。

powershell -NoProfile -ExecutionPolicy Unrestricted .\SampleScript.ps1

なお、powershellの後ろの各パラメータの意味等については以下のとおりです。

  • -NoProfile ... 通常PowerShellファイル実行時に読み込む環境情報を、この時に限り読み込まない旨の設定
  • -ExecutionPolicy Unrestricted ... デフォルトではPowerShellファイルを実行できないよう、実行ポリシー(セキュリティポリシー)が設定されていますが、それをこの時に限りUnrestricted(どんなPowerShellプログラムでも実行可能)に変更する旨の設定
    ※ 実行ポリシーを変更することでPowerShellファイルをダブルクリックするだけでもプログラムを実行できるようにすることもできますが、セキュリティーの観点から無闇に変更することはお勧めしません。

補足

ファイルのダウンロードをSystem.Net.WebClientクラスを直接呼び出して実行しようとした初期バージョンも参考に掲載しておきます。
なお、今回のように単純なファイルダウンロードの用途で、かつPowerShellのバージョン3.0以降であればInvoke-WebRequestを用いるのが一般的のようです。

# FTPサーバーのUser・Pass・URLを定義
$user = 'SampleUser'
$pass = 'hogehoge'

# WebClientオブジェクトを定義
$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential($user,$pass)

# ファイルダウンロード(FTP)
$wc.DownloadFile("192.168.x.x/SeminarMovie.mp4","C:\Users\Desktop\DownloadFile\Seminar01\SeminarMovie.mp4")

参考

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4