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!
)

那么,我怎样才能让这个脚本通过所有的文件夹和子目录,而不会出现问题呢?

谢谢

4

2 回答 2

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!"
)

!如果您在原始文件名(或路径)中遇到 a,上述操作将失败。这可以通过在循环中打开和关闭延迟扩展来解决。

@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
)
于 2013-07-12T16:07:52.580 回答
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
于 2013-07-12T16:18:17.340 回答