帰りは気楽な歌で

Windows、VBScript等の小ネタ、その他個人の趣味(音楽等)を書いていきます。

Windowsコマンドでファイル名だけ/パスだけ取得する

linuxには文字列を渡すとファイル名だけ返すコマンド(basename)とパスだけ返すコマンド(dirname)がある。

例えばこんな感じだ。

basename /test/hoge/fuga.csv
[結果]
fuga.csv
dirname /test/hoge/fuga.csv
[結果]
/test/hoge/

しかしながら、windowsにはそんな便利な一発コマンドがない・・・のだが、バッチパラメータの置換を利用して、似たようなことはできるようになっている。

下記のようなバッチファイルを作成してみる。

[basename.bat]

@echo off
echo %~nx1

[dirname.bat]

@echo off
echo %~dp1

それぞれの実行結果は下記の通り。

C:\>basename.bat C:\testhoge\fugafuga.csv
fugafuga.csv

ファイル名だけ取れてる。

C:\>basename.bat C:\testhoge\fugafuga.csv
C:\testhoge\

パスだけ取れてる。

他にも、ドライブ名だけ取得する、拡張子だけ取る、等も可能。詳細はcallコマンドのヘルプを参照するといい。下記callコマンドのhelpより引用。

バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
を使うことができます:

    %~1         - すべての引用句 (") を削除して、%1 を展開します。
    %~f1        - %1 を完全修飾パス名に展開します。
    %~d1        - %1 をドライブ文字だけに展開します。
    %~p1        - %1 をパスだけに展開します。
    %~n1        - %1 をファイル名だけに展開します。
    %~x1        - %1 をファイル拡張子だけに展開します。
    %~s1        - 展開されたパスは、短い名前だけを含みます。
    %~a1        - %1 をファイル属性に展開します。
    %~t1        - %1 をファイルの日付/時刻に展開します。
    %~z1        - %1 をファイルのサイズに展開します。
    %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                   最初に見つかった完全修飾名に %1 を展開します。
                   環境変数名が定義されていない場合、または
                   検索してもファイルが見つからなかった場合は、
                   この修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dp1       - %1 をドライブ文字とパスだけに展開します。
    %~nx1       - %1 をファイル名と拡張子だけに展開します。
    %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                   検索して %1 を探し、最初に見つかったファイル
                   のドライブ文字とパスだけに展開します。
    %~ftza1     - %1 を DIR の出力行のように展開します。
本ブログに記載のソースコード・情報を利用した際に生じたいかなる損害において、筆者は責任を負いません。十分な知識を持ったうえでご利用ください。