.bat バッチファイルで sudo もどき


これは何

Windows のバッチファイルで、 sudo っぽいことをする方法を紹介します。

  • できること
    • 管理者権限で実行
    • 実行コマンドの終了コード(%errorlevel%)の取得
  • できないこと
    • 現在のコマンドプロンプトで実行。必ず新しいウィンドウが開きます

想定読者

pip や choco コマンドを実行する時、管理者権限つきターミナルを起動し忘れる人

結論

sudo.bat
@echo off
setlocal
if ""=="%~1" exit /b 1
set "cmd=%~1"
if ""=="%~2" goto :parse_end
set "args="
shift
:parse
if not "%~1"=="" (
  set args=%args%,\"%~1\"
  shift
  goto :parse
)
set args=-ArgumentList %args:~1%
:parse_end
powershell -command "exit (start \"%cmd%\" -Wait -PassThru -Verb runas %args%).ExitCode"
exit /b %errorlevel%

使用例

sudo.bat py -m pip install tensorflow

管理者権限のウィンドウが新たに開き、そこで pip が走ります。

感想

実行直後にウィンドウが閉じてしまうため、エラー修了したときの原因を追うのが困難。
pip とか choco とかでしくじったときに確認したいとき使い勝手が悪すぎるぅぅ。
終了コードが取れるだけましだけど、 if errorlevel 1 pause とかでウィンドウを閉じるのを止めたいところと思って、 pause を仕込んでみたけれど start-process が完了したときにウィンドウが閉じてしまっているので意味なかった。
エラーでたら、管理者権限付与した cmd から実行し直すってことで。

参考リンク

Windowsでsudoしたい
How to make SHIFT work with %* in batch files
【Start-Process】PowerShellでプロセスをバックグラウンド起動する方法
Obtaining ExitCode using Start-Process and WaitForExit instead of -Wait
呼び出し元のバッチに戻り値を返す方法