前回、PowerShellスクリプトからMicrosoft Edgeを操作してルータのログデータを取得できるようにした。今回はこのスクリプトを定期的かつ自動的に実行できるように変更、および設定する方法を取り上げる。

→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。

ルータからログを取得してファイルへ書き出す

前回のPowerShellスクリプトでは、次の処理でルータのログデータを取得していた。 $Element = Get-SeElement -By XPath -Value '/html/body/div[3]/pre' $Element.Text

ルータのログを取得するといった処理は手動でやるようなものではなく、機械的かつ自動的に行っておけばよいものだ。上記処理はログデータをそのまま標準出力へ送っているので、この部分をファイルに出力するように書き換えて、実行するごとにローカルファイルシステムにログデータをファイルとして書き出すように変更する。

ここでは1日に1回くらいのペースでログデータを取得すれば十分なので、日時をファイル名にしたファイルを作成することにする。次のような感じでファイル名とパスを用意する。これでPowerShellスクリプト実行時の日時でファイル名が作られる。

$Out = "~\Documents\router-log\" + $(Get-Date).ToString("yyyyMMdd_hhmmss") + ".txt"

そしてログデータをこのファイルへ書き出す。

$Element.Text > $Out

上記書き換えをまとめると次のようになる。

# ログデータを取得
'ログデータを取得します。'
$Element = Get-SeElement -By XPath -Value '/html/body/div[3]/pre'

# ログデータを書き込み
'ログデータを保存します。'
$Out = "~\Documents\router-log\" + $(Get-Date).ToString("yyyyMMdd_hhmmss") + ".txt"
$Element.Text > $Out

これで~\Documents\router-log\フォルダに「年月日_時分秒.txt」という名前のログファイルが作られることになる。

全ての処理をPowerShellスクリプト「router_showlog.ps1」にまとめると次のようになる。

# Microsoft Edge Webドライバを起動
webdriver_edge_start.ps1

# ルータログページをオープン
'ルータログページをオープンします。'
Set-SeUrl -Url http://ユーザ名:パスワード@192.168.1.1/ntt/information/troubleLog

# ログデータを取得
'ログデータを取得します。'
$Element = Get-SeElement -By XPath -Value '/html/body/div[3]/pre'

# ログデータを書き込み
'ログデータを保存します。'
$Out = "~\Documents\router-log\" + $(Get-Date).ToString("yyyyMMdd_hhmmss") + ".txt"
$Element.Text > $Out

# Microsoft Edge Webドライバを終了
'Webドライバを終了します。'
Stop-SeDriver
webdriver_edge_stop.ps1

後はこのPowerShellスクリプトをタスクスケジューラから定期的に起動するように仕掛ければよい。

PowerShellスクリプトをタスクスケジューラに登録する

先ほどのPowerShellスクリプトをタスクスケジューラに登録する。

  • タスクスケジューラに登録する

    タスクスケジューラに登録する

スケジュールに関しては自分の求めるように設定すればよい。例えば、下記スクリーンショットの場合だと、平日の16時にPowerShellスクリプトを実行するようになる。

  • トリガーの編集

    トリガーの編集

次にPowerShellスクリプトを登録する。

  • PowerShellスクリプトの登録

    PowerShellスクリプトの登録

登録する内容は次のようになる。

操作の編集
操作 プログラムの開始
プログラム/スクリプト "C:\Program Files\WindowsApps\Microsoft.PowerShell_7.3.1.0_x64__8wekyb3d8bbwe\pwsh.exe"
引数の追加 Command "C:\Users\daichi\Documents\router-log\router_showlog.ps1"

上記のケースだとPowerShellスクリプトは「~\Documents\router-log\router_showlog.ps1」に配置してある。PowerShell 7自身のパスは「C:\Program Files\WindowsApps\Microsoft.PowerShell_7.3.1.0_x64__8wekyb3d8bbwe\pwsh.exe」だ。

ここが問題なのだが、PowerShell 7のバイナリパスは上記のようにバージョンなどによって変わるスタイルになってしまった。つまり、バージョンが上がることにこの部分を書き換えるか、書き換えたくないなら何らかのギミックを用意しなければならない。

タスクスケジューラに登録する方法に関しては今後の状況を見つつ、あまりに状況が変わりそうになければいくつか代替方法を示していこうと思う。

PowerShellスクリプトとタスクスケジューラで自動実行

どのようにタスクスケジュールを組むかによるのだが、例えば毎日16時に実行するといった仕組みにしておくと、次のようにログデータが溜まっていく。

  • router_showlog.ps1の定期実行で溜まっていったログ・ファイル

    router_showlog.ps1の定期実行で溜まっていったログ・ファイル

こんな感じで、PowerShellスクリプトとタスクスケジューラで処理の自動化が可能だ。やってみるとわかると思うが、自動化はとても便利だ。その良さがわかれば、さまざまな処理を自動処理にしたくなるのではないかと思う。PowerShellスクリプトは、自動化に便利に使える方法であり、とてもオススメだ。

付録

webdriver_edge_start.ps1

#!/usr/bin/env pwsh

#========================================================================
# Microsoft Edge WebDriverを起動する
#========================================================================

#========================================================================
# 動作しているMicrosoft Edge WebDriverをすべて終了
#========================================================================
webdriver_edge_stop.ps1

#========================================================================
# Seleniumモジュールがない場合にはインストール
#========================================================================
if (-Not (Get-InstalledModule -Name Selenium 2> $Null)) {
    'Seleniumモジュールをインストールします。'
    Install-Module -Name Selenium -AllowPrerelease -Force
    Get-InstalledModule -Name Selenium
}

#========================================================================
# Microsoft Edge WebDriverを起動
#========================================================================
'Microsoft Edge WebDriverを起動します。'
$Size = '1200,800'
if  (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null))
{
    #================================================================
    # Microsoft EdgeとMicrosoft Edge WebDriverのバージョンが一致して
    # いないためにドライバが動作しなかった可能性がある。
    #================================================================

    #================================================================
    # 不要なドライバプロセスを終了
    #================================================================
    webdriver_edge_stop.ps1

    #================================================================
    # Microsoft Edgeのバージョン番号
    #================================================================
    $EdgeDir='C:\Program Files (x86)\Microsoft\Edge\Application\'
    $EdgeVersion=(  Get-ChildItem -Name $EdgeDir                    | 
                    Where-Object { $_ -NotMatch "[a-zA-Z]+" }       |
                    Select-Object -First 1                          )
                    # ↑ 【Select-Object -First 1の理由】
                    # 更新前のバージョンと更新後のバージョンが同時に
                    # 存在するタイミングがあるので、更新後のバージョン
                    # のみを取得するためにSelect-Objectを実行している。

    #================================================================
    # Microsoft Edge WebDriverダウンロードURLとデプロイ先パス
    #================================================================
    $DriverURL="https://msedgedriver.azureedge.net/$EdgeVersion/edgedriver_win64.zip"

    $SeModVer=(Get-InstalledModule -Name Selenium).Version -replace "-.+$",""
    $DriverDir="$env:HOME\Documents\powershell\Modules\Selenium\$SeModVer\assemblies"
    $DriverDownloadDir="$DriverDir\_download"

    #================================================================
    # WebDriverダウンロード用の一時ディレクトリを作成
    #================================================================
    New-Item        $DriverDownloadDir -ItemType Directory -Force

    #================================================================
    # Microsoft Edgeと同じバージョンのMicrosoft Edge WebDriverを
    # ダウンロード
    #================================================================
    "Microsoft Edge WebDriver version $EdgeVersion をダウンロードします。"
    curl            -get                                            `
                    -o      $DriverDownloadDir\edgedriver_win64.zip `
                    $DriverURL

    #================================================================
    # Microsoft Edge WebDriverをデプロイ
    #================================================================
    "Microsoft Edge WebDriver version $EdgeVersion をインストールします。"
    Expand-Archive  -Path $DriverDownloadDir\edgedriver_win64.zip   `
                    -Destination $DriverDownloadDir                 `
                    -Force

    Copy-Item       -Path $DriverDownloadDir\msedgedriver.exe       `
                    -Destination $DriverDir\msedgedriver.exe        `
                    -Force

    #================================================================
    # WebDriverダウンロード用の一時ディレクトリを削除
    #================================================================
    Remove-Item     $DriverDownloadDir -Recurse -Force

    #================================================================
    # Microsoft Edge WebDriverを起動する
    #================================================================
    if      (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null)) 
    {
            #========================================================
            # 原因不明の起動不能
            #========================================================

            #========================================================
            # 不要なドライバプロセスを終了
            #========================================================
            webdriver_edge_stop.ps1

            Exit
    }
}
'Microsoft Edge WebDriverの起動処理完了。'

webdriver_edge_stop.ps1

#!/usr/bin/env pwsh

#========================================================================
# Microsoft Edge WebDriverを終了する
#========================================================================

#========================================================================
# WebDriverプロセスを終了
#========================================================================
if  (Get-Process -Name msedgedriver 2> $Null) 
{
    '動作しているMicrosoft Edge WebDriverを終了します。'
    Get-Process -Name msedgedriver 2> $Null

    # Microsoft Edge WebDriverを終了
    Stop-SeDriver 2> $Null

    # まだ動作しているほかのMicrosoft Edge WebDriverを終了
    if      (Get-Process -Name msedgedriver 2> $Null) 
    {
            Get-Process -Name msedgedriver 2> $Null | Stop-Process
    }

    '動作しているMicrosoft Edge WebDriverの終了処理完了。'
}