日常的にPCを使う職種であれば、インターネットから情報を入手することも多いはずだ。場合によっては、毎日決まったWebサイトをチェックして情報を取得・整理し、社内で利用できるフォーマットに加工する、といった作業をしていることもあるだろう。

そうした情報収集の際には、当然Webブラウザを使うことが多いが、Webブラウザを使うとどうしてもGUIによる操作が発生する。GUIは、まだ作業に慣れていないときには良いのだが、ある程度作業内容が固定されると、いちいちマウスを動かしたり、ボタンを押したりといったアクションが面倒に感じられるようになる。

現在のWindowsでは「Power Automate」を使って、GUIの作業も比較的簡単に自動化できる。人によるとは思うが、ローコードなので導入の敷居は低い(プログラミングの経験がない方にとっては、謳われているほど簡単ではないと思う)。

そしてもちろん、そうした自動化処理はPowerShellからも行うことができる。今回からは数回にわたり、Webページを自動取得するスクリプトをPowerShellで組んでいってみたい。

PowerShellスクリプトを活用する

PowerShellはLinuxのシェルと違い、オブジェクト指向の概念に基づいている。さらに、.NETやC#という実装系があった上での「シェルという体」を成したプログラミング言語であるため、単体でかなり複雑な処理を実現することができる。したがって、PowerShellとそのモジュールだけで、Webからコンテンツを取得して加工する処理を行うことも可能だ。

しかし、今回はもっとシンプルに考える。すでにWebからコンテンツを取得するためのソフトウエアは存在しており、Windowsにデフォルトで搭載されている。そうした既存ソフトウエアを使うためのグルー言語として、Powershellを使おうという発想だ。

前回までメールコンポーザを起動する「mail.ps1」というPowerShellスクリプトを作ってきた。その実態は、Thunderbirdのメールコンポーザを起動するためのラッパースクリプトだ。つまり、「mail.ps1」というインタフェースがあれば、その内側で使われているソフトウエアが変わっても問題ないのである。

こうしたスクリプトをPowerShellで組むのは、PowerShellがWindowsでデフォルトのシェルだからだ。Microsoftは今後もPowerShellをサポートし続ける可能性が高い。したがって、Windowsで長く使えるスクリプトを作りたいのであれば、PowerShellが第1候補になるのである。

まずはcurlを使う

Webページを取得する代表的なコマンドに、curlコマンドがある。LinuxやMacではよく使われるコマンドであり、Webページを含む何らかのWebリソースを取得したり、逆にHTTPリクエストを送信する目的で使ったりと、さまざまな目的で使用できる便利なコマンドだ。

現在のWindowsにはcurlコマンドがマージされている。C:\Windows\System32\curl.exeにあるはずなので、ご確認いただきたい。

  • C:\Windows\System32\curl.exeにデプロイされているcurlコマンド

    C:\Windows\System32\curl.exeにデプロイされているcurlコマンド

例えば、Microsoft Edgeで次のページを閲覧するケースを考える。

  • Microsoft EdgeでWebページを閲覧しているサンプル

    Microsoft EdgeでWebページを閲覧しているサンプル

このWebページをcurlコマンドで取得してみよう。PowerShellシェルで、次のようにcurlコマンドを実行する。

C:\Windows\System32\curl.exe -get https://news.mynavi.jp/techplus/article/20220622-2375422/
  • curlコマンドを実行してWebページを取得する

    curlコマンドを実行してWebページを取得する

実行すると次のようになる。

  • curlコマンドの実行結果 その1

    curlコマンドの実行結果 その1

  • curlコマンドの実行結果 その2

    curlコマンドの実行結果 その2

出力が長くてよくわからないので、いったんファイルに落として確認してみよう。次のようにリダイレクトし、ファイルに出力する。

C:\Windows\System32\curl.exe -get https://news.mynavi.jp/techplus/article/20220622-2375422/ > out.html
  • curlコマンドを実行してWebページを取得し、ファイルへ保存する

    curlコマンドを実行してWebページを取得し、ファイルへ保存する

保存したファイルをエディタで見てみると、次のようにHTMLファイルが取得できていることを確認できる。

  • 取得したWebページの内容を確認

    取得したWebページの内容を確認

curlコマンドで全てのWebリソースが欲しい形式で得られるわけではない。だが、シンプルな上に強力なので、最初に取り組むコマンドとしては妥当だと思う。

title=PowerShellスクリプトにまとめていく

PowerShellスクリプトにまとめていく

curlコマンドだけで全ての要望に応えられるわけではないので、最終的にはいくつかのソフトウエアを組み合わせてWebリソースを取得することになる。まずはPowerShellスクリプトを書き、そこから必要に応じて必要なソフトウエアを使ってWebリソースを取得するような仕組みにしていこう。

というわけで、まずは簡単に、今回紹介したcurlコマンドをPowerShellスクリプトから呼ぶように記述する。ネットワークのリソースをLinuxのcatコマンドを使うイメージで持ってくるというところから「netcat.ps1」という名前を付けた。

#!/usr/bin/env pwsh

#========================================================================
# URLで指定されたリソースを取得
#========================================================================

#========================================================================
# 引数を処理
#   -URL url        WebリソースのURL
#========================================================================
Param(
    [Parameter(Mandatory=$true)][String]$URL = ""
)

#========================================================================
# Webリソース取得に利用するアプリケーション
#========================================================================
$curl='C:\Windows\System32\curl.exe'

#========================================================================
# curl を使って取得する
#========================================================================
& $curl -get $URL

最初の取っ掛かかりとしてはこんなところだろう。実行すると、次のようになる。当然だが、curlコマンドを実行しているだけなので結果は先ほどと同じだ。

  • netcat.ps1の実行結果

    netcat.ps1の実行結果

上記スクリプトで使っている機能は、「mail.ps1」を作るのに使っていた機能よりもシンプルだ。これくらいなら、もう説明なしで読めるようになっているのではないだろうか。ここから徐々に、このPowerShellスクリプトを育てていってみよう。