回答:
%%~nf
のリファレンスで説明されているようにのみ、を使用してファイル名を取得できますfor
。
@echo off
for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
echo %%~nf
)
pause
次のオプションを使用できます。
修飾子付きの変数説明 %〜Iは%Iを展開し、周囲をすべて削除します 引用符( "")。 %〜fI%Iを完全修飾パス名に展開します。 %〜dI%Iをドライブ文字のみに展開します。 %〜pI%Iをパスのみに展開します。 %〜nI%Iをファイル名のみに展開します。 %〜xI%Iをファイル拡張子のみに展開します。 %〜sI短い名前のみを含むようにパスを拡張します。 %〜aI%Iをfileのファイル属性に展開します。 %〜tI%Iをファイルの日付と時刻に展開します。 %〜zI%Iをファイルのサイズに拡張します。 %〜$ PATH:I PATH環境にリストされているディレクトリを検索します 変数と%Iを完全修飾名に展開します 最初に見つかったもの。環境変数名が 定義されていないか、ファイルが検索で見つかりません、 この修飾子は空の文字列に展開されます。
%1
、バッチスクリプトでparamから拡張子なしのファイル名を取得していました。echo %~n1
私が求めていたものでした。
変数が保持するファイルが実際に存在しない場合、FOR
アプローチは機能しません。拡張子の長さがわかっている場合に使用できるトリックの1つは、部分文字列を取ることです。
%var:~0,-4%
-4
最後の4桁の数字(おそらくことを意味.EXTが)切り捨てられます。
echo %f:~0,-4%
質問で使用されている例のコンテキストで試した場合、誤解している可能性があります。何が悪いのですか?
SET fl=%%f
それからecho %fl:~0,-4%
これは本当に遅い応答ですが、私はDiskInternals LinuxReaderが非NTFS(FAT32)ディレクトリに保存したファイルに '.efs_ntfs'を追加していた特定の問題を解決するためにこれを思いつきました:
@echo off
REM %1 is the directory to recurse through and %2 is the file extension to remove
for /R "%1" %%f in (*.%2) do (
REM Path (sans drive) is given by %%~pf ; drive is given by %%~df
REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them
copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf"
echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf"
echo.
)
pause
.encrypted
身代金要求とともに、添付ファイルを開いてすべてのファイルに追加した私の友人を助けました。攻撃スクリプトは、これとは逆のバッチファイルであり、.encrypted
すべてのファイルに追加されているようです。
(ディレクトリや既存のファイルをループせずに)変数から拡張子を削除するだけの場合は、これを使用しています。
for %%f in ("%filename%") do set filename=%%~nf
完全なパスから拡張機能を削除する場合は、%%dpnf
代わりに次を使用します。
for %%f in ("%path%") do set path=%%~dpnf
例:
(コンソールで直接使用)
@for %f in ("file name.dat") do @echo %~nf
@for %f in ("C:\Dir\file.dat") do @echo %~dpnf
OUTPUT:
file name
C:\Dir\file
変数が引数の場合は%~dpn
、引数番号を続けて使用するだけでよいので、拡張子の長さを変えることを心配する必要はありません。
たとえば%~dpn0
、拡張子なしでバッチファイルのパスを返す、拡張子なしなどに%~dpn1
なります%1
。
C:\Users\Admin\Ordner\foo.flv
なり、%%〜nfが表示されますfoo
。拡張機能以外のすべてが必要な場合は、%%C:\Users\Admin\Ordner\foo