最近 Vista の UAC にほんとイライラさせられてる3流プログラマです。
ほんと、UAC は PG に対するいやがらせとしかとれませんね。
さて、今回はバッチファイルの実行パスに関する話です。
たとえば C:\testDir に battest.bat というバッチファイルが置いてあるとします。
中身はなんでもいいんですが、こんな感じで。
echo バッチテスト
pause
これを Vista で UAC 有効の状態でエクスプローラから普通に実行します。(一般ユーザ権限で実行される)
するとこんな感じになります。
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 さん。有難うございました。