バッチ。フォルダとすべてのサブフォルダ内のファイルの名前を一括変更します。

バッチ。フォルダとすべてのサブフォルダ内のファイルの名前を一括変更します。

Win7のバッチスクリプトの助けを借りて、各ファイル名から「-min」部分を削除して、フォルダーとサブフォルダー内のすべてのファイルの名前を変更しようとしています。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
FOR /R %%A in (.*)-min.png DO REN "%%A-min.png" "%%A.png"

どうやら SET パラメータに何か問題があるようですので、次のようにしてみます:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "oldname=%%G"
    SET "newname=!oldname:~0,-8!.png"
    REN "!oldname!" "!newname!"
)

しかし、エラーしか得られません。ループから最後の命令をエコーすると、適切なパスが返されます。何が足りないのでしょうか?

答え1

ファイル名を変更する場合、ターゲット名にフォルダー パスを含めることはできません。 を使用して、%%~nxGパスなしでファイル名と拡張子を取得できます。 oldname 変数は必要ありません。 を使用するだけで済みます%%G。 行を削除して、REN ステートメントで直接文字列操作を行うことができます。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "newname=%%~nxG"
    REN "%%G" "!newname:~0,-8!.png"
)

ファイル パスの一部に文字が含まれている場合、!FOR 変数の展開が遅延展開の前に行われるため、上記は失敗し、値が破損することに注意してください。FOR!変数の展開時に遅延展開が無効になっていることを確認することで、値を保持できます。これには、ループ内で遅延展開のオンとオフを切り替える必要があります。

@echo off
setlocal disableDelayedExpansion
cd F:\Mega.Pack-128x128\textures\
for /r %%G in (*-min.png) do (
  set "oldpath=%%G"
  set "newname=%%~nxG"
  setlocal enableDelayedExpansion
  ren "!oldpath!" "!newname:~0,-8!.png"
  endlocal
)

関連情報