Windows10に標準搭載されたcurlコマンドを使ってWEBサイトの死活確認をする簡単なバッチファイル

2 min read読了の目安(約2300字

はじめに

Windows10にCURLコマンドが標準搭載されていたそうです。

◆下記のサイトを参考にさせていただきました
Windows 10 に curl がプリインストールされてた | もやもやプログラミング3

試しに死活確認のコードを作成して動かしてみました

LINUXではcurlコマンドを使ってWEBサイトの死活監視を実装することがありました。といってもSNMPや閾値などの実装ではなくWEBサーバから返ってくるステータスコードが正常:200を確認する程度のモノでした。
そこでWindowsクライアントからCURLでWEBサイトが生きているか確認するWindowsのバッチファイルをサンプルとして書いてみました。WindowsからWEBサイトの死活確認に使えるかもしれません。

まずはWindows10のcurlコマンドの動きを確認します。

> curl --version
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: 2017-11-14, security patched: 2019-11-05
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL

2021年4月時点の状態です。バージョンを見てみると2017年に実装されてたんですね。

curlコマンド例

> curl -s -I -o nul -w "%{http_code}" https://www.google.co.jp
正常:200
エラー:200以外

-s 進捗状況など余計な出力を非表示にする
-o ファイル吐き出し先の指定(Linuxの/dev/nullの代わりにWindowsはnilを使います。)
-I ヘッダ情報(ステータスラインとレスポンスヘッダ)が出力される。
-w "%{http_code}" ステータスコードのみ取得する

簡単な使い方

下記のコードを「website_monitoring_status_code.bat」のようにバッチファイルとして保存をしてダブルクリック(もしくはコマンドライン)から実行すると指定されたURLから戻ってくるステータスコード確認するだけのシンプルな作りです。
check_urls[] を変更するとループで回してますので複数URLを確認可能にしています。

@echo off
setlocal enabledelayedexpansion

echo Website monitoring.
echo ----

set check_urls[0]=https://example1.co.jp
set check_urls[1]=https://example2.co.jp
set check_urls[2]=https://example3.co.jp
set check_urls[3]=https://example4.co.jp

set k=0
:LOOP
  call set check_url=%%check_urls[%k%]%%
  if defined check_url (
    set http_code=
    FOR /F %%i in ('curl.exe -s -k -I -L -o nul -w "%%{http_code}" %check_url%') DO SET http_code=%%i
    echo %check_url%
    if !http_code! neq 200 (
      echo -^> !http_code! NG
    ) else (
      echo -^> !http_code! OK
    )
    set /a k=%k%+1
    goto LOOP
  )
:LOOP_END

echo ----

pause

ちょっとハマったところ

バッチファイル内での外部コマンドの実行について、一度ファイルに書き出して読み込み直しをするというのも手なのですが、そうすると一時ファイルを作らないといけなくなります。一次ファイルは作りたくなったのでforを使った方法を採用してみたのですが、変数の値が上手く変更されない状態となりました。バッチファイルはforやカッコなどでくくられた処理は1行として認識するため変数の変更が反映されないそうです。
回避策として遅延変数(変数を%%でくくるのではなく!!でくくる)を使うことで実行したコマンド結果を正しく取得できるようになしました。「setlocal enabledelayedexpansion」は遅延変数を使えるようにするために足しています。

最後に

今時であれば「Microsoft automate desktop」などのRPAツール「Selenium」などの自動化ツールもあるため選択肢は多いのですが、curlはBasic認証に対応していたりPOSTも送れたりするのでサイトの死活確認をバッチファイルにしておいて手動実行する程度のモノであれば難しいRPAツールと比較するとすぐに使えそうです。