【问题标题】:Making a folder with incrementing number depending on existing folders with same name根据现有的同名文件夹创建编号递增的文件夹
【发布时间】:2015-02-28 12:53:48
【问题描述】:

我想制作一个批处理文件,当已经存在同名文件夹时,它会创建一个编号递增的文件夹。

例如,对于名为 folder 的文件夹,如下所示:

if exist folder md folder1 if exist folder1 md folder2

当已经有 1 个或多个同名文件夹(文件夹 1、文件夹 2、...)时,我想要在末尾创建另一个带有递增编号的文件夹,并使代码更短。

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    这个批处理代码是基于你最初的想法:

    @echo off
    set "Folder=C:\Temp\Test"
    if not exist "%Folder%" (
        md "%Folder%"
        goto EndBatch
    )
    for /L %%N in (1 1 65534) do (
        if not exist "%Folder%%%N" (
            md "%Folder%%%N"
            goto EndBatch
        )
    )
    :EndBatch
    set "Folder="
    

    但是这个解决方案非常慢,因为已经存在多个文件夹。

    跟随批处理文件要快得多:

    @echo off
    set "Folder=C:\Temp\Test"
    if not exist "%Folder%" (
        md "%Folder%"
        goto EndBatch
    )
    set "FolderCount=0"
    for /F "delims=" %%F in ('dir /AD /B "%Folder%*"') do set /A FolderCount+=1
    md "%Folder%%FolderCount%"
    set "FolderCount="
    :EndBatch
    set "Folder="
    

    但是这个批处理文件并没有真正检查文件夹名称。它只计算以相同字符串开头的文件夹数量,并期望对于新文件夹可以使用下一个数字。这可能是一个错误的假设,例如 C:\Temp\Test1 已删除,C:\Temp\TestC:\Temp\Test2 仍然存在。在这种情况下,上面的批处理文件尝试创建C:\Temp\Test2

    因此,一个更好的批处理文件应该是这个:

    @echo off
    setlocal EnableDelayedExpansion
    set "ParentFolder=C:\Temp"
    set "FolderName=Test"
    if not exist "%ParentFolder%\%FolderName%" (
        md "%ParentFolder%\%FolderName%"
    ) else (
        set "HighestNumber=0"
        for /F "delims=" %%F in ('dir /AD /B "%ParentFolder%\%FolderName%*"') do (
            set "NameFolder=%%~F"
            set "FolderNumber=!NameFolder:%FolderName%=!"
            if !FolderNumber! GTR !HighestNumber! set "HighestNumber=!FolderNumber!"
        )
        set /A HighestNumber+=1
        md "%ParentFolder%\%FolderName%!HighestNumber!"
    )
    endlocal
    

    它也很快,因为它也不检查每个文件夹的存在。但它确实会找出以相同字符串开头的所有文件夹的最大数量,并创建一个具有下一个数字的新文件夹。

    注意 1: 此批处理代码也不是 100% 故障安全的。例如,文件夹 C:\Temp\Test_New_15 可能是这个批处理文件的问题,只需要 C:\Temp\Test, C:\Temp\Test1, C:\Temp\Test2, ... 被发现。 (Test_New_15 被忽略,但类似的事情可能是一个问题。)当然可以消除这个问题,例如在dir 返回的每一行上额外使用findstr 来检查是否在由 FolderName 仅附加一个数字。

    注意 2:0 开头的文件夹编号被解释为八进制数。如果在 if 条件之前的 FolderNumber 值上有 1 个或多个前导 0 的文件夹,则必须删除前导零。

    要了解 3 个批处理文件中的代码,请打开命令提示符窗口,执行以下命令,然后阅读窗口中每个命令的帮助输出。

    1. dir /?
    2. for /?
    3. goto /?
    4. if /?
    5. md /?
    6. set /?
    7. setlocal /?

    【讨论】:

    • 如果有人对价值 65534 的原因感兴趣,请阅读有关 Working with File Systems 的 Microsoft TechNet 文章并查看 表 13-6 FAT32 大小限制 单个文件夹中的文件和子文件夹的最大数量。我观察到如果文件夹 %TEMP% 达到 65534 个文件和子目录条目,即使在 NTFS 分区上,许多应用程序也会停止正常工作。然后是时候使用Windows Disk Cleanup了。
    • 我刚刚尝试了第二个代码(如你所说:更快的那个),它完美运行!
    • 只有当上一个文件夹为空时,有没有办法删除它?如果有,请告诉我。
    【解决方案2】:

    有更好/更快的方法来创建越来越多的文件夹名称(其中一些在 Mofi 的答案中!),但由于指示的标准是短代码,这里有一个替代方案(但正如 Mofi 所指出的,这可以是一个缓慢的解决方案)

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "folderName=test"
    
        2>nul (md "%folderName%"||cmd /q /c"for /l %%a in (1 1 100000) do md "%folderName%%%a"&&exit %%a")
        if errorlevel 1 set "folderName=%folderName%%errorlevel%"
    
        echo Created %folderName%
    

    【讨论】:

    • 好的。这样可行。但是,如果我想在 %AppData%\.minecraft\ 中创建一个“modsBackup”文件夹怎么办?代码会是什么样子?
    • @TomLenc, set "folderName=%AppData%\.minecraft\modsBackup"
    • 谢谢!但是我还需要一件事..如何自动删除“modsBackup”文件夹,无论命令产生了什么数字,但只有当它为空时(因为在我的程序中它会将文件复制到文件夹中,但有时它是不工作。这就是为什么..)?
    • @TomLenc,如果您还没有存储文件夹名称,请尝试全部删除。 2>nul (for /d %%a in ("%AppData%\.minecraft\modsBackup*") do rd "%%~fa") 只会删除空目录。或在这里搜索。关于搜索最后一个文件/文件夹有很多问题。
    猜你喜欢
    • 2021-07-13
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多