タスクを実行するために必要なテクニックは2つ(おそらく3つ)あります。
1)ファイル名とファイル拡張子を解析する必要があります。これはFORHELPで説明されているように簡単です。(HELP FOR
コマンドラインから入力)
%%~nG
=ファイル名
%%~xG
=ファイル拡張子
2)各ファイル拡張子を変数に格納し、次のようなコードを使用して小文字に変換する必要があります
for %%C in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "ext=!ext:%%C=%%C!"
setlocal enableDelayedExpansion
スクリプトの上部で遅延拡張を有効にする必要があります。
検索と置換の検索部分では大文字と小文字が区別されないため、上記は機能します。
3)ファイル拡張子にが含まれている可能性が低い状況では!
、ループ内で遅延拡張のオンとオフを切り替える必要があります。しかし、私はあなたがそのような状況に遭遇することを真剣に疑っています。
これは、ポイント3を無視して機能する完成したスクリプトです。
@echo off
setlocal enableDelayedExpansion
for /r "c:\test" %%F in (*) do if "%%~xF" neq "" (
set "ext=%%~xF"
for %%C in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "ext=!ext:%%C=%%C!"
ren "%%F" "%%~nF!ext!"
)
バリCは彼の答えに興味深いアイデアを持っていましたが、それはうまくいきませんでした。一時フォルダにファイル拡張子のみで構成される名前の一時ファイルを作成することで、なんとか機能させることができました。しかし、それは上記の解決策よりも遅いです。
@echo off
setlocal
set "folder=%temp%\ren%random%"
md "%folder%"
for /r "c:\test" %%F in (*) do if "%%~xF" neq "" (
copy nul "%folder%\%%~xF" >nul
for /f "delims=" %%X in ('dir /b /l "%folder%"') do ren "%%F" "%%~nF%%X"
del /q "%folder%"
)
rd "%folder%"