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