はじめに
$uristr
にセットしたURIアドレスのWebページ内でリンクされた画像(img
)を一括ダウンロードします。画像ファイルはカレントフォルダにダウンロードされます。
また
$html.getElementsByTagName("img")
を$html.getElementsByTagName("a")
に変更しその後の$_.src
を$_.href
に変更するといろいろなファイルタイプの一括ダウンロードに対応できます。私が紹介しているスクリプト共通でいえることですがエラー処理などを省いていますので必要があれば適時対応ください。
PowerShellスクリプトの実行を許可してください。
PowerShellスクリプトを初めて実行する場合
Powershellのps1ファイルを実行する方法
Powersehllをはじめるにあたり WindowsのコマンドラインインターフェースであるPowershellはコマンドレットと言われる命令をテキストファイルに記述したスクリプトファイルを実行することが出来ます。Powershellはその...
スクリプト
<#
# ウェブページの画像ファイルを一括ダウンロード
#>
$ErrorActionPreference = "Stop"
Set-StrictMode -Version 2.0
$uristr = 'https://maywork.net/'
$baseuri = New-Object System.Uri($uristr)
$res = Invoke-WebRequest -Uri $baseuri
$html = $res.ParsedHtml
try {
$t = $html.getElementsByTagName("img")
} catch {
$t = $html.IHTMLDocument3_getElementsByTagName("img")
}
$result = $t | ? {
$_.protocol -match "HyperText Transfer Protocol"
} | % {
New-Object System.Uri($_.src)
} | ? {
$_.host -eq $baseuri.Host
} | % {
$src = $_.AbsoluteUri
$dst = Join-Path (pwd) (Split-Path -Leaf $_.AbsolutePath)
Invoke-WebRequest -Uri $src -OutFile $dst
}
スクリプト(関数版)
<#
# ウェブページの画像ファイルを一括ダウンロード
# 関数版
#>
$ErrorActionPreference = "Stop"
Set-StrictMode -Version 2.0
# リンクを取得
function GetLinks
{
param (
[parameter(ValueFromPipeline=$true)]
$uri
)
process
{
$res = Invoke-WebRequest -Uri $uri
$html = $res.ParsedHtml
try {
$t = $html.getElementsByTagName("img")
} catch {
$t = $html.IHTMLDocument3_getElementsByTagName("img")
}
$result = $t | ? {$_.protocol -match "HyperText Transfer Protocol"} | % { $_.src }
return $result
}
}
#
# 重複しないファイル名を生成
#
function Create-UniquePath
{
param(
[Parameter(ValueFromPipeline=$true,Mandatory=$true)]
[string]$BasePath
)
process
{
if (!(Test-Path -Path $BasePath)) {
return $BasePath
}
$f = Get-Item -Path $BasePath
$Result = $BasePath
for($i=1; (Test-Path -Path $Result); $i++) {
$Result = $f.Directory.FullName + "\" + $f.BaseName + "(" + $i + ")" + $f.Extension
}
return $Result
}
}
# ファイルのダウンロード
function HttpDownload
{
param (
[parameter(ValueFromPipeline=$true)]
$uri,
$out_dir
)
begin
{
# カレントディレクトリを保存
$save_dir = (Convert-Path .)
# 出力先のディレクトリへ移動
if ($out_dir) {
Set-Location $out_dir
}
}
process
{
$tmp_file = New-TemporaryFile
$res = Invoke-WebRequest -Uri $uri -OutFile $tmp_file -PassThru
# ファイル名
$out_file = ""
if ($res.Headers["Content-Disposition"] -match "filename=`"(.+?)`"") {
# Content-Dispositionでファイル名が指定されている場合。
$out_file = $Matches[1]
} else {
# ファイルタイプ
$ext = ""
if ($res.Headers["Content-Type"] -match "image/([^\s]+)") {
$ext = $Matches[1]
}
if ($res.Headers["ETag"]) {
# ETagが有る場合
$out_file = $res.Headers["ETag"]
if ($out_file -match "^[`"`'](.*)[`"`']$") {
$out_file = $Matches[1]
}
} else {
# uriの末尾の要素
if ($uri -match "(.*)/$") {
$uri = $Matches[1]
}
$u = New-Object System.Uri($uri)
$out_file = $u.Segments[-1]
}
if ($out_file -notmatch "\.") {
# .を含まない場合拡張子を加える
$out_file = $out_file + "." + $ext
}
}
$out_file = Create-UniquePath (Join-Path (Convert-Path .) $out_file)
Move-Item $tmp_file $out_file | Out-Null
$out_file
}
end
{
Set-Location $save_dir | Out-Null
}
}
$uristr = 'https://maywork.net/'
GetLinks $uristr | HttpDownload -out_dir "h:\script\x\"
スクリプトの実行環境
- プロダクト名
- Windows 10 Home
- ビルド番号
- 17763.316
- Powershellバージョン
- 5.1.17763.316
- .NET Framework
- .NET Framework 4.7.2
コメント