根据具有相同名称的现有文件夹制作编号递增的文件夹

Making a folder with incrementing number depending on existing folders with same name

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

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

if exist folder md folder1 if exist folder1 md folder2

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

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

@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 个批处理文件中的代码,请打开命令提示符 window,执行以下命令,并阅读每个命令的 window 中的帮助输出。

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

有 better/faster 创建文件夹名称的方法(其中一些在 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%