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

How to rename files in subfolder into a specific format

我在一个文件夹的子文件夹中有一个名为 RabcdYYMMKKACCOUNT.TXT 的文件,其中 YYMM 是年月,这将更改。 KK是另一个标识符,我想把所有文件重命名为MSFKKDNB.ABCKK是输入文件中的标识符。

下面是我试过的那个及其结果:

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

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

但输出应该是MSFAUDNB.abc

试试这个:

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

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

@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

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

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

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

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

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

另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章。

我可能会按以下方式进行,前提是要重命名的文件位于给定根目录的直接子目录 (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

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

@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

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

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

基本上,两个脚本都使用 sub-string expansion to extract the identifier part (KK) from the file names. Since there are variables set and read in the same block of code, delayed expansion is required for that. The second approach does not list the sub-directories and files by standard for loops, it uses the dir command, findstr to filter their names and a for /F loop 来捕获子目录和文件的结果输出。