(1) バッチでファイルパスやファイル名を取得する方法
(1-1) 構文
(1-2) コマンドのオプションについて
(1-3) サンプルプログラム
「for %%f in (“[コマンド]”) do ([中身])」の中身に「%%~nf」のような文言を見たことはありますでしょうか?実はこの文言がファイルパスやファイル名を取得するための記述なのですが、今回はこの「%%~nf」が何者なのか?について簡単に紹介します。
(1) バッチでファイルパスやファイル名を取得する方法
(1-1) 構文
(構文)
for %%f in ("[フォルダパス/ファイルパス]") do ( echo %%~nf )
(補足1)「%%f」について
変数「%%f」について単独の%は消滅するため、%でエスケープをして「%%f」としています。
(補足2)「%%~nf」について
forループ等でファイルパスを扱う場合に、フルパスではなく「ファイル名のみ」を取得したいケースに「%%~nf」を使います。
(例)
フルパス「C:\Temp\20201231\aaa.sql」の中からファイル名「aaa.sql」のみを抽出したいケースや、あるいは拡張子を取り除いて「aaa」のみを抽出したいケースなど。
(1-2) コマンドのオプションについて
上記の構文で紹介している「%%~nf」は一般化すると次のようになります。
%[変数] + ~[オプション] = %~[オプション][変数] rem (例) %f + ~n = %~nf
つまり変数「%f」にファイル名のみを取得するためのオプションを足すと「%~nf」になるという形です。
そしてオプションの部分に関してはいくつかパターンがあり、「ファイル名のみを出したい」とか「拡張子は表示したくない」といった様々な要望に合わせて調節できるようになっています。
(オプション) | (説明) |
%~n[変数] | %[変数]から「ファイル名」を抽出(拡張子なし) |
%~x[変数] | %[変数]からファイル名の「拡張子」を抽出 |
%~nx[変数] | %[変数]から「ファイル名」を出力(拡張子あり) |
%~d[変数] | %[変数]からドライブレター(例「C:」)のみを抽出 |
%~p[変数] | %[変数]からドライブレター(例「C:」)を除いたパスを抽出 |
%~dp[変数] | %[変数]からドライブレターを含むフルパスを出力 |
%~t[変数] | %[変数]からファイルのタイムスタンプを出力 |
%~z[変数] | %[変数]からファイルのサイズ(単位:byte)を出力 |
上記のオプションについて、実際の値でのINPUT/OUTPUTの例を以下に示します。
(表)
(オプション) | (入力=INPUT) | (出力=OUTPUT) |
%~n[変数] | C:\Temp2\SQL\ccc.txt | ccc |
%~x[変数] | 〃 | .txt |
%~nx[変数] | 〃 | ccc.txt |
%~d[変数] | 〃 | C: |
%~p[変数] | 〃 | \Temp2\SQL\ |
%~dp[変数] | 〃 | C:\Temp2\SQL\ |
%~t[変数] | 〃 | 2020/10/29 12:42:00 |
%~z[変数] | 〃 | 2020/10/29 12:45:00 |
(1-3) サンプルプログラム
上記のオプションを一通り試すサンプルプログラムをご紹介します。
(サンプルプログラム)
@echo off set TEST_FOLDER=C:\Temp2\SQL\*.txt rem フォルダ(今回の場合はフォルダ配下の拡張子「.txt」のファイル)が存在するかチェック if exist "%TEST_FOLDER%" ( rem もしフォルダ配下のファイルが存在するなら、そのファイル数だけループ for %%f in ("%TEST_FOLDER%") do ( rem テスト01:フルパスをそのまま出力 echo Test01 %%f rem テスト02:「~n」を使って、ファイル名のみを出力(拡張子なし) echo Test02 %%~nf rem テスト03:「~nx」を使って、ファイル名のみを出力(拡張子あり) echo Test03 %%~nxf rem テスト04:「~d」を使って、ドライブレターのみを出力 echo Test04 %%~df rem テスト05:「~dp」を使って、ファイルパス(ファイル名は除く)を出力 echo Test05 %%~dpf rem テスト06:「~tf」を使って、ファイルのタイムスタンプを出力 echo Test06 %%~tf rem テスト07:「~zf」を使って、ファイルの容量(単位:byte)を出力 echo Test07 %%~zf byte ) )
(補足)
(補足事項) | (補足説明) |
if exist “%TEST_FOLDER%” | 「%TEST_FOLDER%」のみですと、半角スペース等が入った時に正常動作しなくなるため、ダブルクォーテーション「”」で囲っています。 |
for %%f in (“%TEST_FOLDER%”) | forループ変数「%f」について、単独の%は消滅するため「%」でエスケープをしているため「%%f」となっています。 |
(図131)サンプルプログラム実行結果