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
下面就是這次的成果:
$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
Push-Location -LitrePath “$OutPath"
讚讚
感謝,之後有空再來試試看
讚讚