3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(Vista)UACによりバッチファイルを管理者として実行するとパスが変わる

最近 VistaUAC にほんとイライラさせられてる3流プログラマです。

ほんと、UAC は PG に対するいやがらせとしかとれませんね。

さて、今回はバッチファイルの実行パスに関する話です。

たとえば C:\testDir に battest.bat というバッチファイルが置いてあるとします。

中身はなんでもいいんですが、こんな感じで。

echo バッチテスト

pause

これを VistaUAC 有効の状態でエクスプローラから普通に実行します。(一般ユーザ権限で実行される)

するとこんな感じになります。

C:\testDir>echo バッチテスト

バッチテスト

C:\testDir>pause

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

カレントディレクトリはちゃんとバッチファイルを起動したパス C:\testDir になってますね。

次にこのバッチファイルをエクスプローラから右クリック→管理者として実行 とします。

UAC の警告ダイアログがでるので実行を許可します。

すると

C:\Windows\system32>echo バッチテスト

バッチテスト

C:\Windows\system32>pause

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

となります。

カレントディレクトリが C:\Windows\system32 になっちゃってます。

おそらくUAC が有効だと cmd.exe に対して引数でバッチファイルを渡すという仕様なんでしょう。

このわけわかめな仕様によりバッチファイル内で相対パスでなんか処理するときにうまくいきません。

全く困ったもんです。

ついでにいうと下記画像のように UAC で保護されてるフォルダで新規作成メニューを表示してもフォルダしかないのも不便極まりないですね。

追記(2009/7/6):

コメントでご指摘いただいたように、バッチファイルの1行目に、

cd /d %~dp0

とすると、カレントディレクトリがバッチファイルの置いてあるパスになるようなので、これで問題解決です。

tetsu さん。有難うございました。