あなたが直面している主な問題は、REN の 1 番目の引数が完全なパス情報を受け入れることができるが、2 番目の引数にはパス情報なしで新しい名前しか含めることができないということです。修飾子を使用し~nx
て、FOR /F コマンドによって報告されたフル パスから名前と拡張子を抽出できます。
FOR /F オプションは信頼できません。ファイル名に=
. 代わりに delims を何も設定したくない場合。
この問題は、実際には一見したよりも複雑です。コードは、ファイルとディレクトリの両方の名前を変更しようとします。ディレクトリの名前を変更する場合は、アルファベットの逆順で名前を変更する必要があります。これは、名前が変更される前にリスト全体が作成されるためです。通常のアルファベット順で処理し、ディレクトリの名前を変更すると、そのディレクトリ内の後続のエントリは見つかりません。
IN() 節の FIND フィルターは必要ありません。理想的には、フィルターはパスではなく、ファイルまたはディレクトリ名のみに一致する必要があります。それは実行可能ですが、少し注意が必要です。IN() 句でのフィルタリングを単純にスキップし、DO 句で行います。
ファイルまたはディレクトリ名には!
文字を含めることができます。ただし、FOR 変数の展開は、含まれてい!
て遅延展開が有効になっていると破損します。この問題は、ループ内で遅延展開のオンとオフを切り替えることで回避できます。
検索と置換によって名前全体を削除することは可能ですが、ファイルの名前をゼロにすることはできません。そこで、名前が残っていることを確認するテストを追加しました。
setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b ^| sort /r') do (
set "old=%%F"
set "file=%%~nxF"
setlocal enableDelayedExpansion
set "new=!file:%X%=!"
if defined new if !new! neq !file! ren "!old!" "!new!"
endlocal
)
ディレクトリの名前を変更したくない場合は、/AD オプションを追加する必要があります。最初は FOR /R ステートメントを使用できると思っていましたが、同じファイルの名前が 2 回変更される可能性があります。FOR /F は、ファイルを処理する前に結果セット全体をバッファしますが、FOR /R はバッファしません。
setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b /a-d') do (
set "old=%%F"
set "file=%%~nxF"
setlocal enableDelayedExpansion
set "new=!file:%X%=!"
if defined new if !new! neq !file! ren "!old!" "!new!"
endlocal
)