批处理脚本在重命名文件时循环遍历文件

时间:2013-05-08 09:13:40

标签: windows for-loop batch-file cmd directory

我可以用它来循环文件:

for %%a in ("%directory%\*.%extension%") do (
    echo FILE: %%~fa
)
goto :eof

如果我也重命名文件怎么办?:rename是一个重命名文件的子程序:

for %%a in ("%directory%\*.%extension%") do (
    echo FILE: %%~fa
    call :rename "%%~fa"
)
goto :eof

在这种情况下,一些文件被重命名(和回显)两次甚至三次。我认为这是因为在重命名后,在某些情况下,它们被视为需要循环的新文件。但是,所有重命名的文件都不会发生这种情况。

我怎样才能克服这一点?我希望每个文件只重命名一次。

解决方案:

:: remove quotes:
:: http://www.dostips.com/?t=Snippets.TrimQuotes

for /f "useback tokens=*" %%a in ('%extension%') do set extension=%%~a

for /f "useback tokens=*" %%a in ('%directory%') do set directory=%%~a

for /f "delims=" %%a in ('dir /b /a-d "%directory%\*.%extension%" ^| sort /r') do (
    echo FILE: %directory%\%%a
    call :renamingSubroutine "%directory%\%%a"
)
goto :eof

OR:

:: remove quotes:
:: http://www.dostips.com/?t=Snippets.TrimQuotes

for /f "useback tokens=*" %%a in ('%extension%') do set extension=%%~a

for /f "useback tokens=*" %%a in ('%directory%') do set directory=%%~a

for /f "delims=" %%a in ('dir /b /a-d /s /on "%directory%\*.%extension%"') do (
    echo FILE: %%~fa
    call :renamingSubroutine "%%~fa"
)
goto :eof

1 个答案:

答案 0 :(得分:2)

试试这个:

for /f "delims=" %%a in ('dir /b /a-d /s "%directory%\*.%extension%"^|sort /r') do (
    echo FILE: %%~fa
    call :rename "%%~fa"
)
goto :eof

顺便说一下,你不应该给批处理功能提供cmd命令的名称(rename)。