2010-10-04
バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法
でシェルについて書かれていたのでそのバッチファイル版
説明
%~I - すべての引用句 (") を削除して、I を展開します。 %~fI - %I を完全修飾パス名に展開します。 %~dI - %I をドライブ文字だけに展開します。 %~pI - %I をパス名だけに展開します。 %~nI - %I をファイル名だけに展開します。 %~xI - %I をファイル拡張子だけに展開します。 %~sI - 展開されたパスは短い名前だけを含みます。 %~aI - %I をファイルの属性に展開します。 %~tI - %I ファイルの日付/時刻に展開します。 %~zI - %I ファイルのサイズに展開します。 %~$PATH:I - PATH 環境変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %I を 展開します。 環境変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 修飾子を組み合わせて、複合結果を得ることもできます: %~dpI - %I をドライブ文字とパスだけに展開します。 %~nxI - %I をファイル名と拡張子だけに展開します。 %~fsI - %I を完全なパスと短い名前だけに展開します。 %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを 検索して %I を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 %~ftzaI - %I を DIR コマンドの出力行のように展開します。
ソース
@echo off set TEST1=D:\workspace\batch_SandBox\filename.bat set TEST2="D:\workspace\batch_SandBox\filename.bat" set TEST3=grep.exe echo ■フルパス call :GET_FILENAME %TEST1% echo ■""でくくったファイルパス call :GET_FILENAME %TEST2% echo ■カレントにはなく、環境変数PATHに設定されてるディレクトリにあるコマンド call :GET_FILENAME %TEST3% GOTO :END :GET_FILENAME echo -オリジナル echo %1 echo -すべての引用句 (") を削除して、%変数 を展開します。 echo %~1 echo -%変数 を完全修飾パス名に展開します。 echo %~f1 echo -%変数 をドライブ文字だけに展開します。 echo %~d1 echo -%変数 をパス名だけに展開します。 echo %~p1 echo -%変数 をファイル名だけに展開します。 echo %~n1 echo -%変数 をファイル拡張子だけに展開します。 echo %~x1 echo -展開されたパスは短い名前だけを含みます。 echo %~s1 echo -%変数 をファイルの属性に展開します。 echo %~a1 echo -%変数 ファイルの日付/時刻に展開します。 echo %~t1 echo -%変数 ファイルのサイズに展開します。 echo %~z1 echo -PATH 環境%変数に指定されているディレクトリを echo 検索し、最初に見つかった完全修飾名に %変数 を echo 展開します。 echo 環境%変数名が定義されていない場合、または検索 echo してもファイルが見つからなかった場合は、この echo 修飾子を指定すると空の文字列に展開されます。 echo %~$PATH:1 echo. echo 修飾子を組み合わせて、複合結果を得ることもできます: echo -%変数 をドライブ文字とパスだけに展開します。 echo %~dp1 echo -%変数 をファイル名と拡張子だけに展開します。 echo %~nx1 echo -%変数 を完全なパスと短い名前だけに展開します。 echo %~fs1 echo -PATH 環境%変数に指定されているディレクトリを echo 検索して %変数 を探し、最初に見つかったファイル echo のドライブ文字とパスだけに展開します。 echo %~dp$PATH:1 echo %変数 を DIR コマンドの出力行のように展開します。 echo %~ftza1 echo. echo. echo. goto :EOF :END
結果
[D:\workspace\batch_SandBox]filename.bat ■フルパス -オリジナル D:\workspace\batch_SandBox\filename.bat -すべての引用句 (") を削除して、%変数 を展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 を完全修飾パス名に展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 をドライブ文字だけに展開します。 D: -%変数 をパス名だけに展開します。 \workspace\batch_SandBox\ -%変数 をファイル名だけに展開します。 filename -%変数 をファイル拡張子だけに展開します。 .bat -展開されたパスは短い名前だけを含みます。 D:\WORKSP~1\BATCH_~1\filename.bat -%変数 をファイルの属性に展開します。 --a------ -%変数 ファイルの日付/時刻に展開します。 2010/09/26 09:00 -%変数 ファイルのサイズに展開します。 1936 -PATH 環境%変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %変数 を 展開します。 環境%変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 D:\workspace\batch_SandBox\filename.bat 修飾子を組み合わせて、複合結果を得ることもできます: -%変数 をドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ -%変数 をファイル名と拡張子だけに展開します。 filename.bat -%変数 を完全なパスと短い名前だけに展開します。 D:\WORKSP~1\BATCH_~1\filename.bat -PATH 環境%変数に指定されているディレクトリを 検索して %変数 を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ %変数 を DIR コマンドの出力行のように展開します。 --a------ 2010/09/26 09:00 1936 D:\workspace\batch_SandBox\filename.bat ■""でくくったファイルパス -オリジナル "D:\workspace\batch_SandBox\filename.bat" -すべての引用句 (") を削除して、%変数 を展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 を完全修飾パス名に展開します。 D:\workspace\batch_SandBox\filename.bat -%変数 をドライブ文字だけに展開します。 D: -%変数 をパス名だけに展開します。 \workspace\batch_SandBox\ -%変数 をファイル名だけに展開します。 filename -%変数 をファイル拡張子だけに展開します。 .bat -展開されたパスは短い名前だけを含みます。 D:\WORKSP~1\BATCH_~1\filename.bat -%変数 をファイルの属性に展開します。 --a------ -%変数 ファイルの日付/時刻に展開します。 2010/09/26 09:00 -%変数 ファイルのサイズに展開します。 1936 -PATH 環境%変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %変数 を 展開します。 環境%変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 D:\workspace\batch_SandBox\filename.bat 修飾子を組み合わせて、複合結果を得ることもできます: -%変数 をドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ -%変数 をファイル名と拡張子だけに展開します。 filename.bat -%変数 を完全なパスと短い名前だけに展開します。 D:\WORKSP~1\BATCH_~1\filename.bat -PATH 環境%変数に指定されているディレクトリを 検索して %変数 を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ %変数 を DIR コマンドの出力行のように展開します。 --a------ 2010/09/26 09:00 1936 D:\workspace\batch_SandBox\filename.bat ■カレントにはなく、環境変数PATHに設定されてるディレクトリにあるコマンド -オリジナル grep.exe -すべての引用句 (") を削除して、%変数 を展開します。 grep.exe -%変数 を完全修飾パス名に展開します。 D:\workspace\batch_SandBox\grep.exe -%変数 をドライブ文字だけに展開します。 D: -%変数 をパス名だけに展開します。 \workspace\batch_SandBox\ -%変数 をファイル名だけに展開します。 grep -%変数 をファイル拡張子だけに展開します。 .exe -展開されたパスは短い名前だけを含みます。 D:\WORKSP~1\BATCH_~1\grep.exe -%変数 をファイルの属性に展開します。 ECHO は <OFF> です。 -%変数 ファイルの日付/時刻に展開します。 ECHO は <OFF> です。 -%変数 ファイルのサイズに展開します。 ECHO は <OFF> です。 -PATH 環境%変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %変数 を 展開します。 環境%変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 C:\usr\bin\grep.exe 修飾子を組み合わせて、複合結果を得ることもできます: -%変数 をドライブ文字とパスだけに展開します。 D:\workspace\batch_SandBox\ -%変数 をファイル名と拡張子だけに展開します。 grep.exe -%変数 を完全なパスと短い名前だけに展開します。 D:\WORKSP~1\BATCH_~1\grep.exe -PATH 環境%変数に指定されているディレクトリを 検索して %変数 を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 C:\usr\bin\ %変数 を DIR コマンドの出力行のように展開します。 D:\workspace\batch_SandBox\grep.exe
grep.exeは、カレントディレクトリに存在せず、「C:\usr\bin」に存在する。
「grep.exe」と記載して変換しようとする場合は、%~$PATH:I、%~dp$PATH:Iのように
$PATHを指定しないならない。
$PATHを指定しないと「.\grep.exe」として誤認してしまう。
この展開方法って「for /?」 にそのまま書いてあるんだけどね。(^ ^;)
トラックバック - http://d.hatena.ne.jp/orangeclover/20101004/1286120668