重命名文件“命令的语法不正确” .bat

时间:2019-03-08 23:29:02

标签: batch-file file-rename

我正在尝试从多个目录中的多个文件名中删除字符串。该文件与正在创建的一些文件一样,以便我可以检查实际设置了哪些值。

当我到达最底端的rename时,我得到一个错误:

  

该命令的语法不正确。

在创建的_intf_fnlf文本文件中没有任何异常。在重命名中使用变量作为文件路径有一些技巧吗?

@ECHO off

echo Delete dir.txt?
PAUSE

del dir.txt
del item.txt
del file.txt

::paths for all directories in root (where filerename.bat is run)
 ::get root dir path
 SET "_c=%CD%"
 SET /A "counter=0"
 ::get dir list and concats root dir path before
 FOR /F "tokens=*" %%A in ('DIR /on /b /a:d /p %svnLOCAL%') DO ( 
    SET "_dirp=%_c%\%%A"
    CALL :sub1
    SET /A "_counter+=1"
 )

::finds each file in dir
:sub1
 ::make file to check dir path
 ECHO "%_dirp%" > dir.txt
 FOR /F "tokens=*" %%B in ('DIR /b %_dirp%') DO (
  ECHO "%%B" > item.txt
  SET "_item=%%B"
  SET "_filep=%_dirp%\"
  CALL :sub2 %%~nB
PAUSE
 )
 ECHO "%_counter%"
EXIT /b 0

::builds file paths
:sub2
 set "str=%*"
 set "str=%str:[1]=%"
 SET "_intf=%_filep%%_item%"
 SET "_fnlf=%_filep%%str%"
 CALL :sub3
EXIT /b 0

::Renames each file
:sub3
 ECHO "%_intf%" > _intf.txt
 ECHO "%_fnlf%" > _fnlf.txt
 ren "%_intf%" "%_fnlf%.jpg"
EXIT /b 0

1 个答案:

答案 0 :(得分:2)

您的错误是因为您没有正确使用REName命令。

这可以通过在命令提示符处输入Ren /?来注意,其语法为:

REN [drive:][path]filename1 filename2

您似乎正在使用:

REN [drive:][path]filename1 [drive:][path]filename2

...这将产生错误:

  

该命令的语法不正确。

作为脚本的简单修复,您需要更改以下行:

set "str=%str:[1]=%"

收件人:

set "_fnlf=%str:[1]=%"

然后删除该行:

SET "_fnlf=%_filep%%str%"

如果您想整理一下代码,则可以将其更改为:

@Echo Off
Set "i=0"
For /F "Delims=" %%A In ('Dir /B/AD "%svnLOCAL%" 2^>Nul') Do (
    Set /A i+=1
    For /F "Delims=" %%B In ('Dir /B/A-D "%~dp0%%A\*[1]*" 2^>Nul') Do (
        Set "$=%%~nB"
        Call Ren "%~dp0%%A\%%B" "%%$:[1]=%%.jpg"
    )
)
Echo "%i%"
Pause

或使用DelayedExpansion:

@Echo Off
Set "i=0"
For /F "Delims=" %%A In ('Dir /B/AD "%svnLOCAL%" 2^>Nul') Do (
    Set /A i+=1
    For /F "Delims=" %%B In ('Dir /B/A-D "%~dp0%%A\*[1]*" 2^>Nul') Do (
        Set "$=%%~nB"
        SetLocal EnableDelayedExpansion
        Ren "%~dp0%%A\%%B" "!$:[1]=!.jpg"
        EndLocal
    )
)
Echo "%i%"
Pause

在上面的两个示例中,我接受了您的评论where filerename.bat is run,表示此脚本filerename.bat所在的目录。如果您要表示当前的工作目录(不一定相同),则应将以上%~dp0的实例替换为%__CD__%

另外,根据您提供的信息还不清楚 ,我假设已经定义了%svnLOCAL%