#概説
Windowsのバッチファイルを書く時に役に立つかもしれない小技のテンプレートです。
そのままコピペで動かせるよう極力少ない記述で動作するようにしています。
なお7以前は考慮していません。またARM環境は正直詳しくないのでここでの手法が通じないかもしれません。
##「管理者として実行」されているか判定する(簡易版)
net session >NUL 2>nul
if ERRORLEVEL 1 echo 管理者として実行していません & goto :EOF
net sessionコマンドはネットワークセッション管理用コマンドで、引数なしだと単にセッションを表示するのみでシステム変更が伴わないはずですが、これだけでも管理者特権が無いと拒否されエラーになります。
それを利用しコマンドが成功(ERRORLEVEL==0)なら特権あり、エラー(ERRORLEVEL!=0)の場合は特権なしと判定しできます。
ちなみに
net session >NUL 2>nul || (ECHO 管理者として実行していません & goto :EOF)
とワンライナーな書き方も可能。
##「管理者として実行」されているか判定する(PE対応版)
if not exist "%SYSTEMROOT%\system32\wpeutil.exe" ( net session >nul 2>nul
if ERRORLEVEL 1 echo 管理者として実行していません & goto :EOF )
前項の方法をWindows PEセッションから利用すると、net sessionは常にエラーになり判定に使えません。(serverサービスが動いていない為?)
またPEでは常に特権が有るため判定自体が無意味です。よってPE上では管理者判定を回避するようにします。
WPEUTIL.EXEはWindows PEセッションにしか存在しないコマンドなので、これの有無によりWindows PEセッションか判定する事が可能です。
これを前項の方法と組み合わせれば非PE、PE依存しない管理者権限判定が可能です。
##x86/x64判定
こちらを御覧ください。
Windowsバッチファイルにおける x86/x64判定
#SERVER OSの判定
systeminfo /FO CSV /NH 2>nul | find /i "SERVER" >nul
IF ERRORLEVEL 1 echo SERVER OS ではありません & goto :EOF
クライアント向けのOSかサーバーOSか簡易に判定する方法です。
アンチウイルスソフトなど、サーバーとクライアント用で別のパッケージが必要なアプリなどの無人インストールに使えるかもしれません。
要はsysteminfoの結果からOS名を取り出し、それに"Server"という文字列が含まれているか判定しているだけです。
厳密に判定するならwsh等を使ったほうが良いかもしれません。
#プロセス有無で続行判断
tasklist /NH |find /i "targetprocess.exe" > NUL
if not ERRORLEVEL 1 echo "インストール不要です" goto :EOF
プロセスが存在していることを確認する方法です。これでインストール続行を判断、またはアンインストールさせるなどの判定に使えます。
例ではインストール判定のため「無い時実行」であるのでnot ERRORLEVELとなっていますが、アンインストール判定なら「有る時実行」なのでnotを外す必要があります。
これも単にtasklistの結果からプロセス名をfindで探させてるだけです。
###応用例 プロセスが起動されるまで待機
setup.exe /XXX YYY ZZZ
echo セットアップ完了まで待機中
:WAITSTART
ping 0.0.0.0 -n5 >nul
tasklist /NH |findstr /i "appservice.exe" > nul || goto :WAITSTART
notepad "setup.log"
※pingコマンドはLinux等におけるsleepの代わりです。ping発行1回につき1秒なので上記例では5秒待機となります。
※インストールが失敗した時などは考慮してないです。