プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows、管理者として実行するバッチファイルを作るときの注意事項
結論から書くと、

管理者として実行すると、起動時のカレントディレクトリが普通に起動したときと違うから気を付けてね

です。

それでは詳細を書いていきます。

こんなバッチファイルを用意しますφ(--)

■test.bat
@echo off

echo main

call test_sub.bat

pause

■test_sub.bat
@echo off

echo sub

単に「test.bat」から「test_sub.bat」を呼び出しているだけのバッチファイルです。

この2つを同じフォルダにおいて「test.bat」をダブルクリックすると
こんな結果になりますφ(--)

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

20140927-01.png


特に問題は無いですね。

ところがですね(--)b

この「test.bat」を右クリックして管理者として実行すると、こんな結果になりますφ(--)

main
'test_sub.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

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

20140927-02.png


おぉ、なんてことでしょう。
「test_sub.bat」が見つからないと怒られてしまいました。

これは、管理者として実行した際のカレントディレクトリが

C:\Windows\System32

になっているためです。

違いが分かりやすいように「test.bat」から「@echo off」を消して動かしてみますね。

REM @echo off

echo main

call test_sub.bat

pause

普通にダブルクリックで起動すると、結果はこうですφ(--)

C:\test>REM @echo off

C:\test>echo main
main

C:\test>call test_sub.bat
sub
続行するには何かキーを押してください . . .

20140927-03.png


一方、右クリックして管理者として実行すると、結果はこうなりますφ(--)

C:\Windows\System32>REM @echo off

C:\Windows\System32>echo main
main

C:\Windows\System32>call test_sub.bat
'test_sub.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

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

20140927-04.png


起動時のカレントディレクトリが違いますよね?

このようなことが起こるので、管理者として実行する可能性があるバッチファイルは
パス関係を特に強く意識してあげてください。
本当は、管理者として実行しなくても意識するべきですが、
管理者として実行する場合は特にです。

例えば

%~dp0

で、バッチファイル自身のパスを取得できるので

@echo off

echo main

REM フルパスで指定
REM call test_sub.bat
call %~dp0test_sub.bat

pause

として、呼び出す「test_sub.bat」をフルパスで指定するようにしたり

@echo off

REM カレントディレクトリを移動
cd /d %~dp0

echo main

call test_sub.bat

pause

として、最初にカレントディレクトリを移動してしまったりですね。

起動時のカレントディレクトリに依存しない形にする必要があります。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:コマンド/バッチ  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事