複数のサブディレクトリがあるディレクトリでは、その_
文字を含むファイル名を別の文字に変更する必要があります。.
たとえば、
ABC12345_DEF --> ABC12345.DEF
これは、ディレクトリツリーを通じて再帰的に行う必要があります。
ファイル名の最後の3文字は常に同じではありません。
_
またはのいずれかの側で名前変更ワイルドカードを使用しても.
機能しません(さらに、いくつかのディレクトリでこれを行う必要があります)。
複数のサブディレクトリがあるディレクトリでは、その_
文字を含むファイル名を別の文字に変更する必要があります。.
たとえば、
ABC12345_DEF --> ABC12345.DEF
これは、ディレクトリツリーを通じて再帰的に行う必要があります。
ファイル名の最後の3文字は常に同じではありません。
_
またはのいずれかの側で名前変更ワイルドカードを使用しても.
機能しません(さらに、いくつかのディレクトリでこれを行う必要があります)。
回答:
以下が動作するはずです。引用符で囲まれたファイル名の処理の特性move
のren
ために、代わりに使用ren
しました。
for /f "tokens=1,2 delims=_" %i in ( 'dir /s/b *_*.' ) do @( move "%i_%j" "%i.%j" )
@
コマンドの進行状況を視覚的に追跡する場合は、を削除できます。
%i
to %%i
および%j
toのすべてのインスタンスを変更します%%j
。
dir /s/b
戻って完全なパスとファイル名、ren
ために失敗するでしょうren
第二引数好きではない%i.%j
パスを含むようにします。動きはそれがうまく好きです。
_
"(delims=_
)に等しく、 " dir /s/b
"は完全なパスとファイル名を返すため、パスの一部に " _
"(アンダースコア)が1つ以上含まれている場合、このソリューションは失敗します。ファイル名に複数の " _
" が含まれている場合、完全なファイル名は%i
and で表されないため、このソリューションも失敗します%j
。
このバッチファイルはあなたのためにそれを行う必要があります。
以下のバッチファイルをテキストファイルにコピーし、xrename.cmd(または「whatever you want.cmd」)として保存します。
次のようなファイルを実行する場合:
xrename.cmd
現在のフォルダーとすべてのサブフォルダーを検索し、ABC12345_DEFからABC12345.DEF(「text_moretext」から「text.moretext」など)のようなすべてのファイルの名前を変更します。
コマンドラインで「search-string」、「replace-string」、「search-pattern」の値を指定することもできます。
手順を表示するには、次のように実行します:
xrename.cmd / help
注:名前を変更するファイルのみを表示するようにバッチファイルを作成しましたが、実際には名前の変更は行われません。バッチファイルを実行して、実際に名前を変更せずに何が起こるかを確認できます。実行して、正しいファイルの名前が適切に変更されると確信したら、以下の説明に従って行を削除して、名前の変更をアクティブにし、バッチファイルを再度実行します。
必要なファイルを表示するには、「search-pattern」の値を変更する必要がある場合があります。
ラベル「:default1」および「:default2」では、ニーズに合わせて「match-string」、「search-pattern」、および「replace-string」の値を編集できます。
このバッチファイルにはいくつかのエラーチェックがあり、フォルダーまたはサブフォルダーの名前に「一致文字列」が見つかっても失敗しません。
@echo off
if "%~1%~2%~3."=="." goto :default1
if /i "%~1."=="/help." goto :syntax
if "%~1."=="." goto :syntax
rem %2 can be empty to use "*matchstring*" as the "search-pattern"
rem %3 can be empty to make replacement with empty string (delete matchstring).
set "matchstring=%~1"
set "replacestring=%~3"
if "%~2."=="." goto :default2
set "searchpattern=%~2"
goto :start
:default1
set "matchstring=_"
set "replacestring=."
:default2
set "searchpattern=*%matchstring%*"
:start
set "renamecount=0"
set "errorcount=0"
echo.
for /r %%f in ("%searchpattern%") do call :work "%%~dpf" "%%~nxf"
echo.
if %renamecount% EQU 0 echo No files renamed.
if %renamecount% EQU 1 echo Renamed %renamecount% file.
if %renamecount% GEQ 2 echo Renamed %renamecount% files.
if %errorcount% EQU 1 echo %errorcount% error renaming files.
if %errorcount% GEQ 2 echo %errorcount% errors renaming files.
echo.
goto :cleanexit
:work
set matchedfilepath=%~1
set matchedfilename=%~2
rem You can't do it directly like this:
rem set "newfilename=%matchedfilename:%matchstring%=%replacestring%%"
for /F "usebackq delims=" %%g in (`echo set "newfilename=%%matchedfilename:%matchstring%=%replacestring%%%"`) do %%g
echo In path "%matchedfilepath%": Renaming "%matchedfilename%" to "%newfilename%"
rem delete the next line (goto :EOF) to make renaming active
goto :EOF
ren "%matchedfilepath%%matchedfilename%" "%newfilename%"
if %errorlevel% NEQ 0 goto :workerror
if not exist "%matchedfilepath%%newfilename%" goto :workerror
goto :workok
:workerror
echo Rename "%matchedfilepath%%matchedfilename%" failed.
set /A errorcount=errorcount+1
echo.
goto :EOF
:workok
set /A renamecount=renamecount+1
goto :EOF
:syntax
rem:syntax
echo.
echo Syntax:
echo %~nx0 ["match-string" ["search-pattern"] ["replace-string"]]
echo.
echo Search for files matching "search-pattern" in current folder and through all
echo subfolders. For each matched file, rename file by replacing "match-string"
echo with "replace-string".
echo.
echo If "replace-string" is empty or not specified, rename file by deleting
echo "match-string".
echo.
echo If "search-pattern" is empty, use "*matchstring*" as the "search-pattern".
echo.
echo If "match-string" "search-pattern" and "replace-string" are all empty or not
echo specified, then defined defaults will be used.
echo.
echo If "search-pattern" and/or "replace-string" are NOT empty then "match-string"
echo cannot be empty,
echo.
goto :EOF
:cleanexit
set "matchstring="
set "replacestring="
set "searchpattern="
set "renamecount="
set "errorcount="
set "matchedfilepath="
set "matchedfilename="
set "newfilename="
goto :EOF
バッチファイルを実行し、正しいファイルの名前が適切に変更されると確信したら、ファイルを編集して説明されている行を削除し、名前変更をアクティブにしてから、バッチファイルを再度実行できます。
これを行うには、次のような2行を見つけます。
rem delete the next line (goto :EOF) to make renaming active
goto :EOF
次に、「goto:EOF」という行を削除します(または両方の行を削除します)。
バッチファイルの他の場所から "goto:EOF"を削除しないでください(いくつかの場所で見つかる可能性があるため、必ず正しい場所を削除してください)。
これがうまくいかない場合、またはバッチファイルの内容を説明してほしい場合は、お知らせください。
このバッチ名前変更/移動スクリプトで見つけたものを変更すると、これが機能するはずです:
for /r %x in (*_*) do ren "%x" *.*