2013-07-12 22 views
2

你好人,批處理腳本:該命令的語法不正確 - 當腳本正在通過子目錄時?

我的問題可能很簡單。

當我試圖使用/ r作爲批處理腳本的參考去遍歷所有文件夾和子文件來執行這個小腳本時,我得到「該命令的語法錯誤」錯誤。

@echo off 
setlocal enabledelayedexpansion enableextensions 
for /r %%f in ("*[]*.*") do (
    set oldname=%%f 
    set newname=!oldname:[]=! 
    echo !oldname! 
    echo !newname! 
    pause 
    ren !oldname! !newname! 
) 

然而,當我刪除/ R此實際工作,沒有任何問題:

@echo off 
setlocal enabledelayedexpansion enableextensions 
for %%f in ("*[]*.*") do (
    set oldname=%%f 
    set newname=!oldname:[]=! 
    echo !oldname! 
    echo !newname! 
    pause 
    ren !oldname! !newname! 
) 

所以,我怎樣才能讓這個腳本走線槽的所有文件夾和潛艇,沒有問題好?

謝謝

回答

2

使用REN時,不能在新文件名中包含路徑信息。指定原始文件名(和位置)時,只能包含路徑信息。任何嘗試在第二個參數中使用REN和路徑信息都會導致語法錯誤。

您可以使用%%~nxf來獲取文件的名稱和擴展名。然後搜索並替換該值以提出新名稱。

@echo off 
setlocal enabledelayedexpansion 
for /r %%F in ("*[]*.*") do (
    set "newname=%%~nxF" 
    set "newname=!newname:[]=!" 
    echo %%F 
    echo !newname! 
    pause 
    ren "%%F" "!newname!" 
) 

如果你曾經碰到一個!在原來的文件名(或路徑)以上將失敗。這可以通過在循環中打開和關閉延遲擴展來解決。

@echo off 
setlocal disableDelayedExpansion 
for /r %%F in ("*[]*.*") do (
    set "oldname=%%F" 
    set "newname=%%~nxF" 
    setlocal enableDelayedExpansion 
    set "newname=!newname:[]=!" 
    echo !oldname! 
    echo !newname! 
    pause 
    ren "!oldname!" "!newname!" 
    endlocal 
) 
0

您的問題,從當您使用/ R你所得到的完整路徑,當你不使用/ R,你只得到文件名的事實造成的。試試這個:

@echo off 
setlocal enabledelayedexpansion enableextensions 
for /r %%f in ("*[]*.*") do (
    set oldname=%%f 
    set newname=!oldname:[]=! 
    call :NewFileNameOnly "!newname!" 
    echo !oldname! 
    echo !newname! 
    pause 
    ren "!oldname!" "!newname!" 
) 
goto :eof 

:NewFileNameOnly 
set newname=%~nx1 
goto :eof 
+0

使用dbenham的解決方案。這很簡單...沒有子程序。 – RGuggisberg