ウィキペディアから次のバッチスクリプトがあります。
@echo off
for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
echo %%f
)
pause
Forループでは、拡張子がflvのすべてのファイルがエコーされますが、拡張子のないファイルと拡張子のあるファイルが必要なファイルでアクションを実行する必要があります。どうすればこれら2つを入手できますか?
ソリューションを検索しましたが、見つかりません。私はバッチの本当の初心者です...
%%~nf
を使用して、 for
のリファレンスで説明されている方法でのみファイル名を取得できます。
@echo off
for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
echo %%~nf
)
pause
次のオプションが利用可能です。
修飾子付き変数Description %〜Iは、周囲の 引用符( "")を削除する%Iを展開します。 %〜fIは展開します完全修飾パス名への%I。 %〜dI%Iをドライブ文字のみに展開します。 %〜pI%Iをパスのみに展開します。 %〜nI %Iをファイル名のみに展開します。 %〜xI%Iをファイル拡張子のみに展開します。 %〜sI短い名前のみを含むようにパスを展開します。 %〜aI %Iをファイルのファイル属性に展開します。 %〜tI%Iをファイルの日付と時刻に展開します。 %〜zI%Iをファイルのサイズに展開します。 %〜$ PATH:I PATH環境 変数にリストされているディレクトリを検索し、%Iを の完全修飾名に展開します。最初に見つかったもの。環境変数名が 未定義であるか、ファイルが検索で見つからない場合、 この修飾子は空の文字列に展開されます。
変数が保持するファイルが実際に存在しない場合、FOR
アプローチは機能しません。拡張機能の長さがわかっている場合に使用できる1つのトリックは、サブストリングを取得することです。
%var:~0,-4%
-4
は、最後の4桁(おそらく。ext)が切り捨てられることを意味します。
私もwindows cmdの見知らぬ人ですが、これを試してください:
echo %%~nf
これは非常に遅い応答ですが、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
単に変数から拡張子を削除したい場合に、ディレクトリまたは既存のファイルをループせずにこれを使用しています:
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 %~nf
REM ===========
REM OUTPUT:
REM file name
REM C:\Dir\file
Cygwin bashを使用してチョッピングを行う
:: e.g. FILE=basename.mp4 => FILE_NO_EXT=basename
set FILE=%1
for /f "delims=" %%a in ('bash -c "FILE=%FILE%; echo ${FILE/.*/}" ') do set FILE_NO_EXT=%%a