ファイル名に埋め込まれた文字を別の文字に変更するにはどうすればよいですか?


0

複数のサブディレクトリがあるディレクトリでは、その_文字を含むファイル名を別の文字に変更する必要があります。.たとえば、

ABC12345_DEF --> ABC12345.DEF

これは、ディレクトリツリーを通じて再帰的に行う必要があります。
ファイル名の最後の3文字は常に同じではありません。

_またはのいずれかの側で名前変更ワイルドカードを使用しても.機能しません(さらに、いくつかのディレクトリでこれを行う必要があります)。


2
オペレーティング・システム?
ダニエルベック


Windows XP。ファイルの最後の3文字が同じではない
-PilotMom

回答:


0

以下が動作するはずです。引用符で囲まれたファイル名の処理の特性moverenために、代わりに使用renしました。

for /f "tokens=1,2 delims=_" %i in ( 'dir /s/b *_*.' ) do @( move "%i_%j" "%i.%j" )

@コマンドの進行状況を視覚的に追跡する場合は、を削除できます。


将来使用するために、これをBATファイルに記述されたとおりに配置できますか?または私はそれを動作させるために何かを追加する必要があります...私は本当にあなたの助けに感謝します!
PilotMom

バッチファイルで機能させるには、単一パーセント記号を使用するすべての変数を二重パーセント記号に変更する必要があります。すなわち、%ito %%iおよび%jtoのすべてのインスタンスを変更します%%j
アスタリスク

以来dir /s/b戻って完全なパスとファイル名、renために失敗するでしょうren第二引数好きではない%i.%jパスを含むようにします。動きはそれがうまく好きです。
ケビンフェガン

区切り文字は " _"(delims=_)に等しく、 " dir /s/b"は完全なパスとファイル名を返すため、パスの一部に " _"(アンダースコア)が1つ以上含まれている場合、このソリューションは失敗します。ファイル名に複数の " _" が含まれている場合、完全なファイル名は%iand で表されないため、このソリューションも失敗します%j
ケビンフェガン

1

このバッチファイルはあなたのためにそれを行う必要があります。

以下のバッチファイルをテキストファイルにコピーし、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"を削除しないでください(いくつかの場所で見つかる可能性があるため、必ず正しい場所を削除してください)。

これがうまくいかない場合、またはバッチファイルの内容を説明してほしい場合は、お知らせください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.