かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.41 PowerShellでURLの有効性をチェックする|コマンド&スクリプト強化週間

 

 

vol.41 PowerShellでURLの有効性をチェックする|コマンド&スクリプト強化週間

2024年09月09日配信
執筆者:山内 和朗

 今回から始まる連載シリーズは、コマンド&スクリプト強化週間(2024秋)と題して、過去に自作したスクリプトのアップデート版や新作スクリプト、便利なコマンドテクニックを紹介していきます。どんなものを紹介するか方針はありません。気の向くまま、思いついた順番で。

 第一弾は、指定したURLの有効性をPowerShellでチェックするサンプルスクリプトを紹介します。その目的は、多数のURLの有効性をバッチ的にチェックし、そのレポートをファイルに出力することです。

 

PowerShellでWebサイトの状態を確認するには?

 

 今回紹介するPowerShellスクリプトは、定期間隔で自動実行してサイトの正常性を確認することにも応用できますが、その目的には良い既製品がたくさんあるので、そちらにお任せします。例えば、弊社製品「BOM for Windows Ver.8.0 SR1」に付属する監視設定「HTTPアクセス応答監視」を使用すると、Webサーバーや特定の特定のWebページへのアクセスの、HTTPステータスコード(通常、200が正常)、応答時間(ミリ秒)、SSL/TLS証明書の有効期間(秒)を、指定した監視間隔(既定は5分)で継続的に監視することができ、WebサイトやWebページの状態を総合的に監視することができます(画面1)。詳しくは、詳しくは、BOM for Windowsの「HTTPアクセス応答監視ユーザーズマニュアル」で確認してください。

 

画面1
画面1 BOM for Windowsに付属する監視設定「HTTPアクセス応答監視」を使用すると、WebサイトやWebページの状態を総合的に監視できる

 今回の目的は、多数のURLの有効性をバッチ的にチェックすることです。Webページやドキュメント、書籍に掲載するWebサイトのURLは、リンク切れがないように生きているかチェックすることが欠かせません。Webページやドキュメント、書籍の公開時、出版時には当然のことですが、しばらくしてから再チェックする必要もあるでしょう。例えば、書籍に増刷や増版時には、すべて再チェックして必要があれば訂正しなければいけません。書籍を例にしたのは、過去に書籍を何冊か出版した経験からです。今回紹介するのは、そのチェック作業の効率化のために過去に自作したスクリプトを改めて見直し、改良したものです。

 Webサイトの応答のチェックには、PowerShellのInvoke-WebRequestコマンドレット(→Microsoft Learn)を利用すると簡単です。PowerShellで次のコマンドラインを実行すると、応答がある場合はそのHTTPステータスコード(StatusCode、正常なら200)、ステータスの説明(StatusDescription、正常ならOK)を含む、HTMLコンテンツを取得することができます。また、名前解決ができなかったり、応答がなかった場合は例外エラーが発生し、その理由が示されます(画面2)。今回の目的とは関係ありませんが、-OutFileパラメーターを指定すれば、HTTP(S)を使用してファイルをダウンロードすることもできます。

 

PS C:¥> Invoke-WebRequest -Uri <URL>

 

画面2
画面2 Invoke-WebRequestを使用すると、指定したURLからの応答を取得することができる。応答がない場合は例外エラー

 

1つのURLの応答をチェックするPowerShellスクリプト

 

 Invoke-WebRequestコマンドレットを使用して、応答の有無と、応答がある場合はそのHTTPステータスコード、応答がない場合はエラーの理由を出力するPowerShellスクリプト「checkurl.ps1」を作成しました。引数としてURL(http://~またはhttps://~)を指定して実行すると、結果を画面表示することができます(画面3)。PowerShellスクリプトの出力結果は、次に紹介するPowerShellスクリプトでCSV形式で出力することを想定し、「URL, OKまたはNG, ステータスコードまたはエラーの理由」の形式にしています。なお、存在しないページを指定したときに、404などのエラーではなく、Webサイト側でトップページにリダイレクトするなどの設定が行われていた場合、正常(200)な応答として扱われます。

[checkurl.ps1].txt形式でダウンロード

param($targeturi)
if ($targeturi -eq $null) { Write-Host "Usage: .\checkurl.ps1 http(s)://..."; exit }

# Using TLS 1.2 only for HTTPS
# [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Using TLS 1.0/1.1/1.2/1.3 for HTTPS
[Net.ServicePointManager]::SecurityProtocol = @([Net.SecurityProtocolType]::Tls,[Net.SecurityProtocolType]::Tls11,[Net.SecurityProtocolType]::Tls12,[Net.SecurityProtocolType]::Tls13)
# Check PSVersion
if ($PSVersiontable.PSVersion.Major -lt 3) {
  Write-Host "To use this script, you need Windows PowerShell 3.0 or later."
  exit
}

$ErrorActionPreference = "Continue"
$outstr
try {
  $httpresponse = (Invoke-WebRequest $targeturi)
  if ($?) {
    $outstr = $targeturi + "," + $httpresponse.StatusDescription + "," + $httpresponse.StatusCode
  }
}
catch
{
    $outstr = $targeturi + ",NG," + $error[0].Exception.Message
}
$outstr

 

画面3
画面3 checkurl.ps1の出力例

 

複数のURLの応答をバッチ的にチェックするPowerShellスクリプト

 

 今回の目的は、“複数のURLをバッチ的にチェックする”ことでした。そこで、チェック対象のURL(1行1URL)を書き込んだテキストファイルを読み込ませ、すべてのURLをバッチ的にチェックするPowerShellスクリプト「checkurllist.ps1」を作成しました。引数として、URLを書き込んだテキストファイルのパスを指定することで、各URLに対してcheckurl.ps1を順番に実行するものです。テキストファイルは空白行やURL以外の行が含まれていても構いません。httpから始まる行のみをチェック対象として扱います。

 出力結果は画面に表示されますが、テキストファイルにリダイレクトすることができます。コマンドラインに「2>&1 > ファイルのパス.csv」と指定すればリダイレクトできますが、Windows PowerShell(powershell.exe)の場合はUTF-16 LEエンコード、PowerShell(pwsh.exe)の場合はUTF-8エンコードで出力されることに注意してください。UTF-8エンコードの場合も、Excelで読み込んだ場合、日本語が文字化けします。Windows PowerShellの場合は、コマンドラインに「2>&1 | Out-File -Encoding default -Append ファイルのパス.csv」と追加することで、シフトJIS形式で出力させることもできます(画面4)。

[checkurllist.ps1].txt形式でダウンロード

Param($targetfile)
if($targetfile -eq $null){ Write-Host "Error: mssing url list file";exit }
if(!(Test-Path $targetfile)){ Write-Host "Error: mssing url list file";exit }

$urllists = Get-Content $targetfile
foreach ($targeturl in $urllists) {
  if(($targeturl -ne "") -and ($targeturl.Substring(0,4) -eq "http")) {
    .\checkurl.ps1 $targeturl 
  }
}

 

画面4
画面4 私が2018年に翻訳出版した「インサイドWindows第7版 上」用に当時作成した書籍に掲載されているURLのチェックリストを4年後の現在実行してみると、全66のURLのうち9のURLがエラー(404が7件、403が1件、名前解決不能が1件)となった

blog_subscribe

blog_comment

最新記事