【发布时间】:2015-02-28 12:53:48
【问题描述】:
我想制作一个批处理文件,当已经存在同名文件夹时,它会创建一个编号递增的文件夹。
例如,对于名为 folder 的文件夹,如下所示:
if exist folder md folder1 if exist folder1 md folder2
当已经有 1 个或多个同名文件夹(文件夹 1、文件夹 2、...)时,我想要在末尾创建另一个带有递增编号的文件夹,并使代码更短。
【问题讨论】:
标签: batch-file
我想制作一个批处理文件,当已经存在同名文件夹时,它会创建一个编号递增的文件夹。
例如,对于名为 folder 的文件夹,如下所示:
if exist folder md folder1 if exist folder1 md folder2
当已经有 1 个或多个同名文件夹(文件夹 1、文件夹 2、...)时,我想要在末尾创建另一个带有递增编号的文件夹,并使代码更短。
【问题讨论】:
标签: batch-file
这个批处理代码是基于你最初的想法:
@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\Test 和 C:\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 个批处理文件中的代码,请打开命令提示符窗口,执行以下命令,然后阅读窗口中每个命令的帮助输出。
dir /?for /?goto /?if /?md /?set /?setlocal /?【讨论】:
有更好/更快的方法来创建越来越多的文件夹名称(其中一些在 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%
【讨论】:
set "folderName=%AppData%\.minecraft\modsBackup"
2>nul (for /d %%a in ("%AppData%\.minecraft\modsBackup*") do rd "%%~fa") 只会删除空目录。或在这里搜索。关于搜索最后一个文件/文件夹有很多问题。