Cou氏の徒然日記

ほのぼの日記ブログです。

Windowsでバッチファイルを管理者として実行する場合の落とし穴

新人OJTネタです。

 

Windows上でツールを作っていたときのこと。

メインの処理はJavaプログラムですが、そのラッパーbatchを作ってもらっていて、一応、安全のために管理者権限で実行してもらうことを想定した作りになっています。

そのため、実行時には、バッチを右クリックして [管理者として実行(A)] で実行することを想定していたのですが、あがってきたバッチを試しに実行してみると…

Javaのプログラム起動で失敗するという問題が発生。

 

実行パスを見ると、相対パスで定義されていますが、実行パスは問題なさそう。

 

…と、ここで思いつくのが「管理者として実行」という操作

f:id:coublood:20210806230734p:plain

管理者権限で実行した場合の注意事項として、実行時のカレントディレクトリは、実際のバッチの格納されているディレクトリではなく、

「C:¥Window¥System32」

となります。

そのため、きちんとカレントディレクトリに移動する処理をバッチ内に組み込んでおかないと、バッチ内で定義している相対パスが、「C:¥Windows¥System32」からの相対パス検索になり、想定している通りの動作にならないことがあります。

 

試しにバッチを作ってみて、これを「管理者として実行」をしてみると…

f:id:coublood:20210806231408p:plain

 

f:id:coublood:20210806231626p:plain

最初の行で出しているカレントは、バッチの実行ディレクトリではありません。

 

そこで、

cd %~dp0

として、カレントディレクトリをバッチの階層に移動させる必要があります。

 

…ということで問題が解決したので、できました!という報告が来て確認しましたが、ここでもう一つの落とし穴に。

システムドライブ以外のドライブ(例えばC:¥がシステムドライブの場合、別パーティションのE:¥など)で「管理者権限で実行」をすると、やっぱり失敗します。

 

これは、「管理者として実行」することで、カレントディレクトリが「C:¥Windows¥System32」になりますが、その後の

cd %~dp0

 に、「/d」(ドライブを変更可能にする)オプションがついていないために、「C:¥」から「E:¥」に移動ができないために起きます。

 

なので、システムドライブ以外も考慮するのであれば、

cd /d %~dp0

 とするのが正しいですね。