如何将子文件夹中的文件重命名为特定格式

时间:2017-07-05 16:54:12

标签: windows batch-file batch-rename

我在文件夹的子文件夹中有RabcdYYMMKKACCOUNT.TXT个文件,其中YYMM是年份,月份会发生变化。 KK是另一个标识符,我希望将所有文件重命名为MSFKKDNB.ABCKK是输入文件中的标识符。

以下是我尝试的那个及其结果:

FOR /R %%f IN (*account.txt) DO REN "%%f" *dnb.abc

R00531706AUAccount.txt已重命名为R00531706AUAccount.txtdnb.abc

但输出应为MSFAUDNB.abc

3 个答案:

答案 0 :(得分:0)

试试这个:

@Echo Off
For %%A In ("*account.txt") Do (Set "_=%%~nA"
    SetLocal EnableDelayedExpansion
    Ren "%%A" "MSF!_:~-9,2!DNB.abc"
    EndLocal)

答案 1 :(得分:0)

这可以通过以下方式完成:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /R %%I in (???????????account.txt) do (
    set "FileName=%%~nI"
    set "NewFileName=MSF!FileName:~9,2!DNB.abc"
    if not exist "%%~dpI!NewFileName!" (
        ren "%%~fI" "!NewFileName!" 2>nul
        if not exist "%%~dpI!NewFileName!" echo Failed to rename file: "%%~fI"
    ) else (
        echo Cannot rename file: "%%~fI"
    )
)
endlocal

找到的帐户文本文件的文件名已分配给环境变量FileName

通过使用字符串替换和delayed expansion将固定部分MSFDNB.abc与2个字符连接起来来创建文件的新名称。

接下来检查是否已存在具有新名称的文件。这是文件重命名的情况,否则输出错误消息。

重命名文件后,检查是否成功。如果重命名失败,例如由于共享冲突,则输出略有不同的错误。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • ren /?
  • set /?
  • setlocal /?

另请阅读Microsoft有关Using Command Redirection Operators

的文章

答案 2 :(得分:0)

我可能会按照以下方式执行此操作,前提是要重命名的文件位于给定根目录的直接子目录(YYMM)中,而不是其他地方:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "_ROOT=." & rem // (specify path to the root directory)

for /D %%D in ("%_ROOT%\????") do (
    for %%F in ("%_ROOT%\%%~nxD\R??????????Account.txt") do (
        set "FDIR=%%~nxD" & set "FILE=%%~nxF"
        setlocal EnableDelayedExpansion
        ECHO ren "!_ROOT!\!FDIR!\!FILE!" "MSF!FILE:~9,2!DNB.abc"
        endlocal
    )
)

endlocal
exit /B

如果要检查文件名的子目录名称和年/月部分是否都是纯数字,可以使用以下脚本:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "_ROOT=." & rem // (specify path to the root directory)

for /F "delims= eol=|" %%D in ('
    dir /B /A:D "%_ROOT%\????" ^| ^
        findstr "^[0123456789][0123456789][0123456789][0123456789]$"
') do (
    for /F "delims= eol=|" %%F in ('
        dir /B /A:-D "%_ROOT%\%%~nxD\R??????????Account.txt" ^| ^
            findstr "^R....[0123456789][0123456789][0123456789][0123456789].."
    ') do (
        set "FDIR=%%~nxD" & set "FILE=%%~nxF"
        setlocal EnableDelayedExpansion
        ECHO ren "!_ROOT!\!FDIR!\!FILE!" "MSF!FILE:~9,2!DNB.abc"
        endlocal
    )
)

endlocal
exit /B

如果要检查子目录名称是否与文件名的年/月(YYMM)部分匹配,请将模式R??????????Account.txt替换为R????%%~nxD??Account.txt(对于这两个脚本) )。

在验证了任一脚本的正确输出后,删除大写ECHO命令以实际重命名任何文件!

基本上,两个脚本都使用sub-string expansion从文件名中提取标识符部分(KK)。由于在同一代码块中设置和读取变量,因此需要delayed expansion。第二种方法没有按standard for loops列出子目录和文件,它使用dir commandfindstr来过滤它们的名称,使用for /F loop来捕获结果输出子目录和文件。