バッチファイル自体を管理者権限で実行させるための PowerShell コマンドレットを組み込んだスクリプト例を紹介します。
コマンドエコーを無効にする設定や、バッチが管理者権限で実行されているかどうかを判定する方法、コマンドプロンプトは終了せずに不要なバッチだけを終了させるコマンドオプションも紹介します。

スクリプト例
管理者権限なしの場合は、管理者権限ありで同じバッチを起動するバッチファイルの例です。
REM から始まる行はコメント扱いで無視されます。
@echo off
REM 管理者かどうか判定し、違うなら再起動(管理者として)
net session >nul 2>&1
if %errorLevel% neq 0 (
echo 管理者権限で再実行します...
powershell -Command "Start-Process '%~f0' -Verb runAs"
exit /b
)
echo 管理者として実行されています。
REM ここに処理を記述します。
echo 処理が完了しました。ウィンドウを閉じるには何かキーを押してください。
pause >nul
文字化けを防ぐため、文字コードは Shift-JIS で、改行コードは CRLF で保存してください。
UTF-8 で行った場合に起きた文字化けや誤認について次回の記事を参照してください。
以下は、各コマンドなどの説明です。
不要なメッセージ標準出力の抑制
echo off によって、コマンド実行時の標準出力(コマンドエコー)を抑制します。
@ を行頭につけることで、これ自体の標準出力も抑制します。
echo コマンドによる標準出力は、 echo off の場合も標準出力されます。
@echo off
echo
echoコマンドは標準出力にメッセージを表示する。メッセージ文字列をダブルクォーテーションやシングルクォーテーションなどで囲む必要はない。また、echo onおよびecho offでコマンドエコーのON/OFFを切り替えることができる。コマンドエコーは既定でONになっており、各コマンド行を実行する前に標準出力にその内容を表示する[4]。この動作は通常必要とされないので、echo off コマンドをバッチファイルの最初に記述してそれを防ぐ。しかし、そのままでは echo off コマンド自体は表示されてしまう。単価記号 @ をコマンド行の先頭に置くと、その行は表示されないようになっているので、多くのバッチファイルには @echo off という行が先頭にある。
バッチファイル – Wikipedia
管理者権限が有効であることを試すコマンドを実行
net session 自体はコマンドのひとつですが、これは管理者権限が必要なコマンドのため、管理者権限がないと最後に実行した内容のエラーの値を持つ %errorLevel% が 0 以外になります。
これを利用して、管理者権限ありで実行しているかを確認します。
net session >nul 2>&1
net sessionコマンドは管理者でないと実行できないことを利用しています。
[Windowsバッチ] 管理者権限で実行しているか判定する | ぱそまき
net sessionコマンドを実行した結果がエラーとなれば管理者ではない、エラーにならなければ管理者と判断しています。
net sessionは、共有にアクセスされているセッションの確認/切断するコマンドです。
net session – Windowsコマンド虎の巻
管理者権限が必要なコマンドの成功・失敗の判定
コマンドの実行直後、それが成功したかどうかを %errorLevel% 変数で確認できます。
neq は比較演算子のひとつで、値が異なる (not equal) 場合に真 (true) を返します。
例では、 %errorLevel% が 0 以外の場合にその次の () 内の処理を実行します。。
if %errorLevel% neq 0 (
現在の ERRORLEVEL の値に展開します。
バッチファイル – Wikipedia
コマンドプロンプト | バッチファイルで条件分岐を使う(IF)
演算子 意味 EQU 等しい NEQ 等しくない LSS より小さい LEQ 以下 GTR より大きい GEQ 以上
管理者権限でこのバッチ自体を起動する
コマンドプロンプトで PowerShell の Start-Process コマンドレットを用いて、管理者権限でこのバッチを起動します。
powershell -Command "Start-Process '%~f0' -Verb runAs"
powershell -Command “PowerShell コマンドレット“
【PowerShell】コマンドプロンプトでPowerShellコマンドレットを実行する | てこエンジニアブログ
と書くことで、コマンドプロンプト上で PowerShell コマンドレットが実行できます。
ローカル コンピューター上の 1 つ以上のプロセスを開始します。
-Verb
このコマンドレットがプロセスを開始するときに使用する動詞を指定します。 使用できる動詞は、プロセスで実行されるファイルのファイル名拡張子によって決まります。この例では、[管理者として実行] オプションを使用して PowerShell を起動します
Start-Process (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
Start-Process -FilePath “powershell” -Verb RunAs
バッチファイル基礎文法リファレンス #コマンドプロンプト – Qiita
書式 説明 値 %~f0 変数を完全なパス文字列に展開 C:\Documents and Settings\xxxxxxxx\デスクトップ\X.bat
管理者権限でバッチを起動後、自身のバッチ処理のみを終了
起動中のコマンドプロンプトで、管理者権限でバッチを起動した後、このバッチ処理のプロセスを終了します。
/b をつけることで、上位からの呼び出しで、上位を巻き込んで終了することを防ぎます。
/b をつけない場合は、たとえば、このバッチファイルが上位から呼び出された場合、その上位のプロセスも含めて終了してしまいます。
exit /b
コマンド インタープリターまたは現在のバッチ スクリプトを終了します。
/b
終了する | Microsoft Learn
Cmd.exe を終了するのではなく、現在のバッチ スクリプトを終了します。 バッチ スクリプトの外部から実行された場合は、Cmd.exe を終了します。
/B オプションを付けるとバッチファイルだけが終了してコマンドプロンプトへ制御が戻ります。
コマンドプロンプト | コマンドプロンプトまたはバッチファイルを終了(EXIT)
実行結果
バッチファイルをダブルクリックして、管理者権限なしで実行すると、判定が行われて管理者権限ありで実行する PowerShell の処理が行われました。
これにより、 UAC(ユーザーアカウント制御)の画面が表示され、そこで同意して進むと、今度は、管理者権限があることで、管理者権限ありの場合の処理に進み、echo のメッセージが表示されました。

まとめ
バッチファイル自体を管理者権限で実行させるための PowerShell コマンドレットを組み込んだスクリプト例を紹介します。
コマンドエコーを無効にする設定や、バッチが管理者権限で実行されているかどうかを判定する方法、コマンドプロンプトは終了せずに不要なバッチだけを終了させるコマンドオプションも紹介します。
参照サイト Thank You!
- バッチファイル – Wikipedia
- PowerShell とは – PowerShell | Microsoft Learn
- [Windowsバッチ] 管理者権限で実行しているか判定する | ぱそまき
- net session – Windowsコマンド虎の巻
- コマンドプロンプト | バッチファイルで条件分岐を使う(IF)
- Start-Process (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
- バッチファイル基礎文法リファレンス #コマンドプロンプト – Qiita
- 【PowerShell】コマンドプロンプトでPowerShellコマンドレットを実行する | てこエンジニアブログ
- コマンドプロンプト | コマンドプロンプトまたはバッチファイルを終了(EXIT)
- 終了する | Microsoft Learn
記事一覧 → Compota-Soft-Press
コメント