web-dev-qa-db-ja.com

バッチ:ファイル拡張子を削除

ウィキペディアから次のバッチスクリプトがあります。

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f
)
pause

Forループでは、拡張子がflvのすべてのファイルがエコーされますが、拡張子のないファイルと拡張子のあるファイルが必要なファイルでアクションを実行する必要があります。どうすればこれら2つを入手できますか?

ソリューションを検索しましたが、見つかりません。私はバッチの本当の初心者です...

133
Poru

%%~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を
の完全修飾名に展開します。最初に見つかったもの。環境変数名が
未定義であるか、ファイルが検索で見つからない場合、
この修飾子は空の文字列に展開されます。 
277
Dirk Vollmar

変数が保持するファイルが実際に存在しない場合、FORアプローチは機能しません。拡張機能の長さがわかっている場合に使用できる1つのトリックは、サブストリングを取得することです。

%var:~0,-4%

-4は、最後の4桁(おそらく。ext)が切り捨てられることを意味します。

26
Ohad Schneider

私もwindows cmdの見知らぬ人ですが、これを試してください:

echo %%~nf
14
Vineet

これは非常に遅い応答ですが、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
8
Agi Hammerthief

単に変数から拡張子を削除したい場合に、ディレクトリまたは既存のファイルをループせずにこれを使用しています:

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
1
marsze

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
0
mosh