Windowsバッチの簡易な運用活用法

Pocket

Windowsのバッチと言うと既に枯れた技術の印象ですが、日々の運用や簡単な作業を自動化するものとして重宝されています。ミドルウェアに依存せず、どのWindows OS上でも動作し、さらには自動化することで日々の作業削減と人的ミスの予防も期待できます。そこで、今までの私の構築経験などから役に立ちそうなバッチ・スクリプトを備忘録的にいくつか紹介します。

注)エラー処理を省略しています。必要に応じてエラー処理を行ってください。

監視運用に使えるバッチ

監視と言えば、エージェントを入れて監視サーバで集中管理することもできますが、1~2台のサーバを監視するために別途で専用の監視サーバを構築したり、監視用のアプリケーションを購入するのは現実的ではありません。バッチで、ある程度のことは実現可能なので、そのいくつかを紹介します。

注)Windowsタスクスケジューラなどで定期動作することを前提にしています。

プロセスの監視

動作中のプロセスをtasklistコマンドで監視して、特定のプロセスが見つからない場合にアクションを起こすことができます。下記は、SQL Serverのプロセスが見つからない場合に、Windowsイベントログにエラーを出すサンプルです。

サービスの監視

動作中のサービスプログラムをsc queryコマンドで監視して、「開始」状態になっていなければアクションを起こすことができます。
下記は、Internet Information Services(以下、IIS)のサービスが動作中でなければ、Windowsイベントログにエラーを出すサンプルです。

メールの送信

監視結果をイベントログにエラーとして出している場合、異常の発見が遅れる可能性があります。監視対象のサーバ等からアラートを出す手段としては、メールが効果的です。メールの送信はバッチでは難しいため、VBScriptを使用します。

上記VBScriptのファイルを作成し、バッチから下記の方法でスクリプトを呼び出してメールを送信することができます。

これまでの「プロセスの監視」「サービスの監視」「メールの送信」のサンプルを合わせたものを下記に掲載します。プロセスとサービスの確認を行い、その結果をメールで送信するサンプルです。なお、メール送信のVBScriptは、バッチを実行する都度、バッチ内で作成しています。

定期処理運用に使えるバッチ

運用で自動化しておきたいものに、古いファイルの削除や再起動などがあります。

注)Windowsタスクスケジューラなどで定期動作することを前提にしています。

更新日時による古いファイルの削除

IISのような日々ログが蓄積されるシステムの過去ログを削除する運用は多々あります。ファイルの更新日による過去ログの削除は、forfilesコマンドを使用することで簡単に行うことができます。下記は、IISのログファイルの更新日を確認して、現在より60日以上古いファイルを削除するサンプルです。

ファイル名に入っている日付で古いファイルの削除

ファイル名に含まれる日付(例えば 20180607 がファイル名に入る)を元に古いファイルを削除する場合は、forfilesコマンドは使えません。ファイル名から日付を抜き出して削除対象となる日付と比較して削除する方法になります。下記は、IISのログファイルのファイル名に含まれる日付を抜き出して、現在より60日以上古い日付のファイルを削除するサンプルです。なお、日付の計算はバッチでは長くなるのでVBScriptを使って簡単に行っています。

サービス停止・開始

バックアップを行う際などに、サービスやプロセスの動作を停止したい場合があります。サービスを停止・開始したい場合は、netコマンドを使用します。(scコマンドもありますが、非同期でコマンドが実行されるため、サービスの停止を待ってくれる netコマンドを使用しています)
下記は、IISのサービスを停止して、何かの処理の後に起動するサンプルになります。

再起動

システムの安定稼働やWindows Updateなど、定期的に再起動を行いたい場合は、shutdownコマンドを使用します。下記で、再起動を待ち時間無し(0秒)で開始するサンプルです。

その他の使えるかもしれないバッチ

運用シーンでは無いですが、作業する際などに使えるかもしれないバッチです。

ネットワーク設定の変更

「本番用と開発用」や「社内用とメンテナンス用」など異なるネットワーク環境で作業する際に、毎回ネットワーク設定を変更するのは手間がかかります。固定IPをネットワークの設定から変更するのはnetshコマンドを使用して、それぞれのネットワーク用のバッチを用意すればネットワークの切り替えも楽になります。
下記は、固定IPアドレス、サブネット、ゲートウェイ、DNSを変更するサンプルです。

インターネットプロキシの設定

最近はモバイル端末を社外へ持ち出すような運用も増え、社内ネットワークや持ち出し環境ネットワークといった異なるネットワーク経路になることがあります。この際、不便なのがインターネットプロキシ設定です。インターネットプロキシ設定は、レジストリに情報が格納されていますので、regコマンドを使用して設定を変更します。
下記は、プロキシが無効の場合は所定の設定を有効にし、プロキシが有効な場合は無効にするサンプルです。(Internet Explorerやインターネット設定が開いている場合は一度閉じる必要があります)

Windows更新情報の取得

作業PCの確認や何か問題が起きた時の調査のために、Windowsのパッチが適用されているか確認することがあります。「インストールされた更新プログラム」から確認することもできますが、WMICコマンドを使うことで簡単に一覧保存できます。下記は、パッチのKB番号とインストール日時をCSV形式でファイルに出力するサンプルです。

下記は、知りたいKB番号だけ(例:KB2515325)を指定してインストールされているか確認するサンプルです。インストールされていれば、ホスト名、KB番号、インストール日が画面に表示され、インストールされていなければ何も表示されません。

別ユーザでのプログラム実行

バッチの自動化で難しいのが別ユーザでコマンドを実行することです。”別ユーザでコマンドを実行する”こと自体は、runasコマンドがありますが、ユーザのパスワード入力が必要になります。そこで、PowerShellを利用してユーザの入力なしに”別ユーザでコマンドの実行”を行う例を挙げます。下記は、あるバッチファイルを管理者(Administrator)で実行するサンプルです。

最後に…

いくつかのバッチを紹介してきましたが如何でしたでしょうか。流行のRPAには及びませんが、バッチでできることは非常に多く、工夫次第ではWindows上のもっと色々なことが実現できます。もし興味を持たれましたら、「こんなこと自動化できたら良いな」というちょっとした思いをバッチで実現してみては如何でしょうか。

お問い合わせ先

執筆者プロフィール

Kawamura Masashi
Kawamura Masashitdi iDC&セキュリティ推進部
10年くらい研究・開発の経験を経た後に、複数のパッケージ製品の構築・サポート要員として活動する器用貧乏なエンジニア。
Pocket

関連記事