使用 PowerShell 批次下載網站的檔案


Windows PowerShell(官網)是微軟 Windows 環境下的一個 Shell 環境,從 Windows XP 的後期開始提供;而 Windows 7 開始就內建在 Windows 內了,不過一般的使用者應該都不會特別去使用就是了。

他基本上也是命令提示字元(command line)形式的工具,但是他的「cmdlet」功能比本來的命令提示字元(cmd)強上許多!

而這篇,則是 Heresy 為了批次下載網站的內容,而試著去寫他的腳本語言的紀錄。這次的目標是希望可以簡單地下載下面形式的檔案:

http://example.com/001.jpg
http://example.com/002.jpg

http://example.com/010.jpg

下面就是這次的成果:

param( $SourceUrl, $FileNum, $OutPath, $FileName="{0:000}.jpg", $StartNum=1 )

$OutDir = new-item $OutPath -itemtype directory

$OutPath = $OutPath -replace "\[", "“["
$OutPath = $OutPath -replace "\]", "“]"
$OutPath = $OutPath.TrimEnd()

Push-Location -Path "$OutPath"
for( $Idx = $StartNum; $Idx -le $StartNum + $FileNum 1; ++ $Idx )
{
    $UseName = [string]::Format( $FileName,$Idx)
    Write-Host ($SourceUrl + $UseName)
    Invoke-WebRequest ($SourceUrl + $UseName) -OutFile $UseName
}
Pop-Location

這個腳本在執行時需要給五個參數,分別是:

  • SourceUrl:來源網址
  • FileNum:檔案數量
  • OutPath:輸出路徑
  • FileName:檔名的形式
  • StartNum:開始的檔案編號

要執行的時候,基本上就是要先開啟 Windows PowerShell 的介面,然後執行:

.\Download.ps1 "http://example.com/" 10 "Z:\tmp\"

如此一來,他就會將「http://example.com/」下的 001.jpg、002.jpg、…、010.jpg 下載回來、儲存到 Z:\tmp 下了。

而如果檔案名稱不是標準格式的話,則也可以給額外的參數,來做調整;例如:

 .\Download.ps1 "http://example.com/" 10 "Z:\tmp\" "img{0:00}.png"

所下載的檔案,就會是 img01.jpg、img02.jpg、…、img10.jpg。

而如果不是從 1 開始的話,則也可以在最後再加上起始數字。

這樣的腳本雖然無法對應更複雜的狀況,不過也算是滿足基本需求了~不過目前已知有幾個缺點:

  • Invoke-WebRequest 這個指令(MSDN)有些限制:
    • 如果在下載中斷線,他似乎不會有錯誤訊息
    • 似乎沒辦法續傳?

而其中,比較討厭的是,Invoke-WebRequest 的儲存目標路徑中如果有「[」這個字元的話,會出現「因為萬用字元路徑 XXX 無法解析成檔案」的錯誤而無法完成存檔;所以在腳本中,才需要針對 $OutPath 做不少處理…

(這邊的「萬用字元」的英文似乎是「Wildcard Characters」)

現階段暫時應該就是這樣了。之後再來看看還能怎麼玩吧~

或許可以考慮,連 HTML 內容的分析,都用 PowerShell 來做算了。 XD

對「使用 PowerShell 批次下載網站的檔案」的想法

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料