読者です 読者をやめる 読者になる 読者になる

サラリーマンIT技術者の調査レポート

日々の業務で気付いた当たり障りのない技術的なあれこれを綴ります。

Windowsバッチファイルを管理者として実行したときの問題点と回避方法

Windowsでバッチファイル(*.bat, *.cmd)を「管理者として実行」すると、通常実行では普通に動くプログラムが上手く動かないことがあります。

問題点

例えば、以下のようにtest.batを作成してC:\Tempに配置します。

@echo off
cd
pause

エクスプローラーでC:\Tempを開いてtest.batを起動すると

C:\Temp
続行するには何かキーを押してください . . .

という感じになります。
次に、このtest.batをコンテキストメニューの「管理者として実行(A)...」から起動します。
ユーザーアカウント制御のダイアログが出てきますので、ここで「はい(Y)」を選択します。すると、

C:\Windows\system32
続行するには何かキーを押してください . . .

ということで、通常実行と管理者として実行ではカレントディレクトリが違うことが確認できます。
カレントディレクトリの違いにより挙動に違いが発生する場合があります。

それ以外の問題の場合はこちらもどうぞ

Windowsバッチファイルを管理者として実行したときの問題点と回避方法2 - サラリーマンIT技術者の調査レポート

回避方法

この問題の回避方法としては次の2つが考えられます。

  • フルパス指定する
  • バッチファイルの場所をカレントにする

このうち、フルパスを指定するのは芸がないので、バッチファイルの場所をカレントにする方法について調べてみました。
いきなり答えを書いてしまうと次のようになります。

%~d0
cd %~d0%~p0
cd

ということで、C:\Temp\test.batを書き換えて早速実行してみます(「管理者として実行」を忘れずに)。

C:\Windows\system32>C:

C:\Windows\system32>cd C:\Temp\

C:\Temp>cd
C:\Temp

C:\Temp>pause
続行するには何かキーを押してください . . .

試しに、管理者としてではなく、通常実行してみます。

C:\Temp>C:

C:\Temp>cd C:\Temp\

C:\Temp>cd
C:\Temp

C:\Temp>pause
続行するには何かキーを押してください . . .

ということで、バッチファイルの先頭にこの記述を追加すれば、通常実行・管理者として実行のいずれでも同じカレントディレクトリを想定することができます。

お疲れ様でした。