2013-07-12 24 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