バッチファイルの実行フォルダを取得する方法
バッチファイルを実行して、相対フォルダにあるEXEを叩きたい時など、CDコマンドにて場所を移動する必要があります。
しかしそれには、場所の取得がまず必要なので、バッチを実行しているディレクトリ情報の取得方法についてのメモ書き。
まぁ、メモ書きといっても、実際にはコマンド叩いたら結果が書いてあったんですけどね。(笑)
コマンドプロンプトにて「CALL /?」コマンドを叩くと、次のように書いてあります。
を使うことができます:
%~1 - すべての引用句 (") を削除して、
%1 を展開します。
%~f1 - %1 を完全修飾パス名に展開します。
%~d1 - %1 をドライブ文字だけに展開します。
%~p1 - %1 をパスだけに展開します。
%~n1 - %1 をファイル名だけに展開します。
%~x1 - %1 をファイル拡張子だけに展開します。
%~s1 - 展開されたパスは、短い名前だけを含みます。
%~a1 - %1 をファイル属性に展開します。
%~t1 - %1 をファイルの日付/時刻に展開します。
%~z1 - %1 をファイルのサイズに展開します。
%~$PATH:1 - PATH 環境変数に指定されているディレクトリを
検索し、最初に見つかった完全修飾名に %1 を
展開します。環境変数名が定義されていない場合、
または検索してもファイルが見つからなかった
場合は、この修飾子を指定すると空の文字列に
展開されます。
ただ、%1はスクリプト内でCALL呼び出しした時の引数だと思うので、そのままの実行時は%0が当てはまりそう。
CALLを参考にスクリプトを起こすと、たぶん次のような感じになるはず。
@rem 引用句(")を削除して展開
set SCRIPTS=%~0
@rem 完全修飾パス名
set SCRIPTPATH=%~f0
@rem ドライブ文字
set SCRIPTDRIVE=%~d0
@rem パス名
set SCRIPTDIRECTORY=%~p0
@rem ファイル名
set SCRIPTNAME=%~n0
@rem ファイル拡張子
set SCRIPTEXTENSION=%~x0
@rem 短いパス名
set SCRIPTSHORTNAME=%~s0
@rem ファイル属性
set SCRIPTATTRIBUTE=%~a0
@rem ファイルの日付/時刻
set SCRIPTTIME=%~t0
@rem ファイルのサイズ
set SCRIPTSIZE=%~z0
@rem ドライブ文字とパス
set DrivePath=%~dp0
@rem ファイル名と拡張子
set FileNames=%~nx0
@rem 完全なパスと短い名前
set ShortNames=%~fs0
echo SCRIPTS=%SCRIPTS%
echo SCRIPTPATH=%SCRIPTPATH%
echo SCRIPTDRIVE=%SCRIPTDRIVE%
echo SCRIPTDIRECTORY=%SCRIPTDIRECTORY%
echo SCRIPTNAME=%SCRIPTNAME%
echo SCRIPTEXTENSION=%SCRIPTEXTENSION%
echo SCRIPTSHORTNAME=%SCRIPTSHORTNAME%
echo SCRIPTATTRIBUTE=%SCRIPTATTRIBUTE%
echo SCRIPTTIME=%SCRIPTTIME%
echo SCRIPTSIZE=%SCRIPTSIZE%
echo DrivePath=%DrivePath%
echo FileNames=%FileNames%
pause
SCRIPTS=C:\Documents and Settings\Administrator\デスクトップ\ScriptSample.bat
SCRIPTPATH=C:\Documents and Settings\Administrator\デスクトップ\ScriptSample.bat
SCRIPTDRIVE=C:
SCRIPTDIRECTORY=\Documents and Settings\Administrator\デスクトップ\
SCRIPTNAME=ScriptSample
SCRIPTEXTENSION=.bat
SCRIPTSHORTNAME=C:\DOCUME~1\ADMINI~1\デスク~1\SCRIPT~1.BAT
SCRIPTATTRIBUTE=--a------
SCRIPTTIME=2010/09/08 23:34
SCRIPTSIZE=813
続行するには何かキーを押してください . . .
つまり、バッチファイルの実行フォルダは「%~dp0」で取得可能。
そして実行時に移動するには、次のような感じでCDコマンドをスクリプト内で叩けばOK。
cd /d "%~dp0"
よく考えれば当たり前ですな。
普通にバッチ実行したときも、CALLで内部ラベルや外部バッチを呼び出したときも、区別されないのは仕様ですし。
う~む、バッチファイルは奥が深いです。
トラックバック(0)
トラックバックURL: http://type-y.com/mt/mt-tb.cgi/1381
コメントする