Windowsバッチファイルの作成Tips|タイトル設定と管理者権限の自動昇格
こんにちは。Kalsarikannintのフロントエンド担当・daiです。
最近、社内の定型業務をWindowsバッチファイル(.bat)で自動化する機会があったんですが、使ってみると「なんか微妙に使いにくいな」と感じる場面がちょこちょこ出てきました。
少し工夫するだけで運用時のストレスがぐっと減ったので、今回はそのTipsを2つご紹介しようと思います。
そもそも、どんな「使いにくさ」が起きていたのか
まず前提として、僕が直面していた状況はこんな感じでした。
- 複数のバッチファイルを同時に動かしていたので、タスクバーが「コマンドプロンプト」だらけになっていた
- 管理者権限が必要な処理を含むバッチを、うっかりダブルクリックで起動してエラーになってしまっていた
どちらも「仕組みを理解していれば防げるミス」なんですが、毎回気をつけるのも面倒ですよね。なので、バッチファイルの書き方自体で対処できないか考えてみました。
1. 実行中のバッチを識別しやすくする「title」コマンド
困っていたこと
複数のバッチファイルを並列で実行していると、タスクバーが「コマンドプロンプト」という名前のウィンドウで埋め尽くされてしまいます。
どれがどの処理をしているのか一切わからないんですよね。誤って関係ないウィンドウを閉じてしまったり、「あれ、このバッチ終わったっけ?」と二度見したり…。
解決策:1行目に title コマンドを入れる
バッチファイルの冒頭に title コマンドを書くだけで、ウィンドウのタイトルバーに任意の名前が表示されるようになります。
@echo off
title 【実行中】ログ転送バッチ(サーバーA)
たったこれだけです。タスクバーやウィンドウのタイトル部分に指定した文字列が表示されるので、複数起動していても一目でどれが何の処理かわかるようになります。
ちなみに、処理のフェーズに応じてタイトルを動的に変えることもできます。
@echo off
title 【準備中】バックアップ処理
:: 前処理...
title 【実行中】バックアップ処理
:: メイン処理...
title 【完了】バックアップ処理
echo 処理が完了しました。
pause
こうしておくと、「今どこまで進んでいるか」がタスクバーを見るだけでわかるので、特に時間のかかる処理のときに重宝します。
2. 管理者権限への自動昇格スクリプト
困っていたこと
システム環境変数の書き換えや、特定のシステムディレクトリへのファイル操作など、管理者権限が必要な処理を含むバッチファイルを使うとき、毎回「右クリック → 管理者として実行」をしていました。
これ、地味に手間なんですよ。しかも慣れてくると、うっかり普通にダブルクリックしてしまって、処理が途中で失敗する…という事故が起きやすくなります。
解決策:自分自身を管理者として起動し直すコードを先頭に入れる
バッチファイルの冒頭に「権限チェック → 足りなければ自分を昇格して再起動」というコードを仕込んでおくと、ダブルクリックするだけで自動的にUAC(ユーザーアカウント制御)のダイアログが表示されるようになります。
@echo off
:: 管理者権限のチェック
openfiles >nul 2>&1
if %errorlevel% neq 0 (
echo 管理者権限がありません。昇格して実行し直します...
powershell -Command "Start-Process '%~f0' -Verb RunAs"
exit /b
)
:: ここから管理者権限が必要な処理を記述
title 管理者実行:システム設定更新
echo 現在、管理者権限で実行されています。
pause
仕組みをざっくり解説
少し補足しておきます。ポイントは3つです。
① openfiles コマンドで権限をチェックする
openfiles は管理者権限がないと実行に失敗するコマンドです。これを利用して、%errorlevel%(コマンドの終了コード)が 0 でなければ「管理者権限なし」と判断しています。>nul 2>&1 は出力を捨てるおまじないですね。
② PowerShell の Start-Process で自分自身を昇格起動する
-Verb RunAs というオプションを指定することで、「管理者として実行」する動作をスクリプトから呼び出せます。%~f0 は「このバッチファイル自身のフルパス」を表す特殊変数です。
③ 元のプロセスは exit /b で終了させる
昇格した新しいプロセスが起動したあと、権限のない元のプロセスはそのまま終了させます。これをしないと、ウィンドウが2つになってしまうので注意です。
小さな工夫で「めんどくさい」を減らす
今回ご紹介した Tips をまとめると、こんな感じです。
| やりたいこと | 解決策 |
|---|---|
| 複数バッチを識別したい | title コマンドでウィンドウ名を設定 |
| 毎回の「管理者として実行」を省きたい | 冒頭に自動昇格スクリプトを追加 |
どちらも数行追加するだけで導入できます。テンプレートとして手元に持っておくと、次回バッチを書くときにコピペするだけで済むので、ぜひ活用してみてください。
運用時の視認性や実行の手間を少し意識しておくだけで、日々のちょっとしたストレスがかなり減ります。手作業でやるにはめんどくさい処理のためにバッチを書くと思うので、バッチを実行するときにめんどくさいことが増えたら本末転倒かなと思っています。なので、バッチは快適に実行できることを念頭に書くことを意識しています。
今後もまた何か便利なTipsがあれば書いていこうと思います。
