質問: 指定したフォルダ配下に特定のファイルがある場合、指定したフォルダの リネームを行うバッチファイルを作成しております。 下記記述でリネーム自体は可能になったのですが、 このバッチは定期的に複数回実行するためすでにリネームされている フォルダについてもまたリネームされてしまいます。 すでにリネーム済みのフォルダはスキップするという動作にしたいのですが、 良い方法がございましたらお知恵をお貸しください。 ``` cd C:\Users\Desktop\IN1 dir /s /b > C:\Users\Desktop\file.tmp for /f "delims=" %%F in (C:\Users\kcc\Desktop\file.tmp) do ( rem 1パス名の分解(ディレクトリ名の取り出し) for /f "delims=\ tokens=5" %%D in ("%%F") do ( rem 2リネーム IF EXIST "C:\Users\Desktop\IN1\%%D\abc.txt" rename %%D %%D_除外 )) ``` 説明> C:\Users\Desktop\IN1 | | |--------フォルダA | | | |------abc.txt | |--------フォルダB ↓ ↓ ↓ C:\Users\Desktop\IN1 | | |--------フォルダA_除外 | | | |------abc.txt | |--------フォルダB フォルダA、B、・・とあり、各フォルダ直下にabc.txtがある場合のみ フォルダ名の後部に"_除外"を付与する ・想定 すでにリネームされたものはスキップしたい abc.txtが無く、リネーム済みのものは"_除外"部分を消したい よろしくお願い致します。
回答: 以前のリネームの事は忘れてこんな感じでしょうか。 1.全てのディレクトリに対して以下を実行 2.ディレクトリ名に「_除外」があればそれを削除 3.ディレクトリ内に「abc.txt」があれば、ディレクトリ名に「_除外」を付ける 4.必要があれば、リネーム実行 ``` cd C:\Users\Desktop\IN1 for /f "delims=" %%D in ('dir /s /b /ad') do call :SUB "%%~D" goto :EOF :SUB set DIR=%~1 set OLD=%~nx1 set NEW=%OLD:_除外=% if exist "%DIR%\abc.txt" set NEW=%NEW%_除外 if "%OLD%" neq "%NEW%" ren "%DIR%" "%NEW%" goto :EOF ``` ↓こういうケースがあると先にDIRAがリネームされるので、DIRXのリネームが失敗すると思いますが、想定範囲外です。 ``` IN1-----DIRA--+--abc.txt | +--DIRX--abc.txt ```