批。批次重命名資料夾和所有子資料夾中的文件

批。批次重命名資料夾和所有子資料夾中的文件

我嘗試在 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
)

相關內容