2014.
09.
27
13:19:53
結論から書くと、
管理者として実行すると、起動時のカレントディレクトリが普通に起動したときと違うから気を付けてね
です。
それでは詳細を書いていきます。
こんなバッチファイルを用意しますφ(--)
■test.bat
■test_sub.bat
単に「test.bat」から「test_sub.bat」を呼び出しているだけのバッチファイルです。
この2つを同じフォルダにおいて「test.bat」をダブルクリックすると
こんな結果になりますφ(--)

特に問題は無いですね。
ところがですね(--)b
この「test.bat」を右クリックして管理者として実行すると、こんな結果になりますφ(--)

おぉ、なんてことでしょう。
「test_sub.bat」が見つからないと怒られてしまいました。
これは、管理者として実行した際のカレントディレクトリが
になっているためです。
違いが分かりやすいように「test.bat」から「@echo off」を消して動かしてみますね。
普通にダブルクリックで起動すると、結果はこうですφ(--)

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

起動時のカレントディレクトリが違いますよね?
このようなことが起こるので、管理者として実行する可能性があるバッチファイルは
パス関係を特に強く意識してあげてください。
本当は、管理者として実行しなくても意識するべきですが、
管理者として実行する場合は特にです。
例えば
で、バッチファイル自身のパスを取得できるので
として、呼び出す「test_sub.bat」をフルパスで指定するようにしたり
として、最初にカレントディレクトリを移動してしまったりですね。
起動時のカレントディレクトリに依存しない形にする必要があります。
そんな感じ\(--)/
管理者として実行すると、起動時のカレントディレクトリが普通に起動したときと違うから気を付けてね
です。
それでは詳細を書いていきます。
こんなバッチファイルを用意しますφ(--)
■test.bat
@echo off
echo main
call test_sub.bat
pause
echo main
call test_sub.bat
pause
■test_sub.bat
@echo off
echo sub
echo sub
単に「test.bat」から「test_sub.bat」を呼び出しているだけのバッチファイルです。
この2つを同じフォルダにおいて「test.bat」をダブルクリックすると
こんな結果になりますφ(--)
main
sub
続行するには何かキーを押してください . . .
sub
続行するには何かキーを押してください . . .

特に問題は無いですね。
ところがですね(--)b
この「test.bat」を右クリックして管理者として実行すると、こんな結果になりますφ(--)
main
'test_sub.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
続行するには何かキーを押してください . . .
'test_sub.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
続行するには何かキーを押してください . . .

おぉ、なんてことでしょう。
「test_sub.bat」が見つからないと怒られてしまいました。
これは、管理者として実行した際のカレントディレクトリが
C:\Windows\System32
になっているためです。
違いが分かりやすいように「test.bat」から「@echo off」を消して動かしてみますね。
REM @echo off
echo main
call test_sub.bat
pause
echo main
call test_sub.bat
pause
普通にダブルクリックで起動すると、結果はこうですφ(--)
C:\test>REM @echo off
C:\test>echo main
main
C:\test>call test_sub.bat
sub
続行するには何かキーを押してください . . .
C:\test>echo main
main
C:\test>call test_sub.bat
sub
続行するには何かキーを押してください . . .

一方、右クリックして管理者として実行すると、結果はこうなりますφ(--)
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
続行するには何かキーを押してください . . .
C:\Windows\System32>echo main
main
C:\Windows\System32>call test_sub.bat
'test_sub.bat' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\Windows\System32>pause
続行するには何かキーを押してください . . .

起動時のカレントディレクトリが違いますよね?
このようなことが起こるので、管理者として実行する可能性があるバッチファイルは
パス関係を特に強く意識してあげてください。
本当は、管理者として実行しなくても意識するべきですが、
管理者として実行する場合は特にです。
例えば
%~dp0
で、バッチファイル自身のパスを取得できるので
@echo off
echo main
REM フルパスで指定
REM call test_sub.bat
call %~dp0test_sub.bat
pause
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
REM カレントディレクトリを移動
cd /d %~dp0
echo main
call test_sub.bat
pause
として、最初にカレントディレクトリを移動してしまったりですね。
起動時のカレントディレクトリに依存しない形にする必要があります。
そんな感じ\(--)/