前提
これらのオプションは、環境変数に対して使用することができない。
使用可能な対象は、引数(%1、%2など)、またはfor文内で使用するメタ変数(%%aなど)のみであるため、基本的には無理矢理for文内変数へ格納することが必要となる。
~:引用句(")を削除して展開
@echo off
set txtFile="sample.txt"
for %%a in (%tgtFile%) do echo %%~a
sample.txt
~f:ファイル名からフルパスへ展開
※C:\【 実験 】\例\sample.txt、とする
@echo off
cd "C:\【 実験 】\例"
set txtFile="sample.txt"
for %%a in (%tgtFile%) do echo %%~fa
C:\【 実験 】\例\sample.txt
~d:ファイル名のフルパスから、ドライブ文字だけを展開
@echo off
set txtFile="C:\【 実験 】\例\sample.txt"
for %%a in (%tgtFile%) do echo %%~da
C:
~p:ファイル名のフルパスから、パス名だけを展開
@echo off
set txtFile="C:\【 実験 】\例\sample.txt"
for %%a in (%tgtFile%) do echo %%~pa
\【 実験 】\例\
~n:ファイル名のみを展開
@echo off
set txtFile="C:\【 実験 】\例\sample.txt"
for %%a in (%tgtFile%) do echo %%~na
sample.txt
~x:ファイル名の拡張子のみを展開
@echo off
set txtFile="C:\【 実験 】\例\sample.txt"
for %%a in (%tgtFile%) do echo %%~xa
.txt
~s:ファイル名以外のパス(短縮名)を展開
短縮名とは?
8.3形式という命名規則に従って作成された名前のこと。
最大8文字(ファイルの場合は追加で拡張子部が最大3文字)という、かなりの制限が求められる形式であり、MS-DOS・Windows3.1といった古いOSで採用されていた命名規則となる。
Windows95以降はファイル名が250文字まで設定可となったことで影は薄れたが、互換性のため今でも秘密裡にこの形式のファイル名も生成されるようになっているらしい。
(例:C:\Program Files
=C:\PROGRA~1
。これはエクスプローラなどでも問題なく動作する)
短縮名の取得
基本は
dir /x
で取得する。
find
においては、/s
で変換が可能。
※存在しないパスなどでは、短縮名が生成されていないため効力が発揮されない。注意
短縮名の使用
8.3形式のファイル名が必要になるケースとしては、
・古いアプリを利用する時
・cmd上で他プログラムを起動する際、空白文字を含む長いファイル名ではうまく動作しない時
などが考えられる。
スペースを含んでいるパスに対し、エスケープ文字の仕様や""での囲みといった、様々な策を弄しても失敗するというような場合、これを利用するのが吉のよう。
(というか最初からこちらで良い気がする)
@echo off
set txtFile="C:\新しいフォルダー\新しいフォルダー\新しいフォルダー\asdfghjklqwertyuiopzxcvbnm.txt"
for %%a in (%tgtFile%) do echo %%~sa
C:\temp\新しい~1\新しい~1\新しい~1\ASDFGH~1.TXT
~a:ファイルの属性を展開
アルファベットに対応するファイル属性
d:ディレクトリ
r:読み取り専用
h:隠しファイル
s:システムファイル
a:アーカイブファイル
他
@echo off
set directory="C:\新しいフォルダー"
for %%a in (%directory%) do echo %%~aa
set txtFile="C:\新しいフォルダー\asdfghjklqwertyuiopzxcvbnm.txt"
for %%a in (%tgtFile%) do echo %%~aa
d---------
--a--------
~t:ファイルのタイムスタンプを展開
@echo off
set directory="C:\新しいフォルダー"
for %%a in (%directory%) do echo %%~ta
yyyy/mm/dd hh:mm
~z:ファイルサイズを展開
※KB・MB・GBなどではなく、バイト単位で表示されることに注意
@echo off
set directory="C:\新しいフォルダー\FAQ.txt"
for %%a in (%directory%) do echo %%~za
nnnnn
※捕捉
ディレクトリを対象としても、基本は0になる。
ディレクトリ内のファイルの合計サイズを取得したい場合は、dir
を使用する。
リンク先参照。