根据具有相同名称的现有文件夹制作编号递增的文件夹
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\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 个批处理文件中的代码,请打开命令提示符 window,执行以下命令,并阅读每个命令的 window 中的帮助输出。
dir /?
for /?
goto /?
if /?
md /?
set /?
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%
我想制作一个批处理文件,当已经存在一个同名的文件夹时,它会创建一个编号递增的文件夹。
例如,对于名为 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\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 个批处理文件中的代码,请打开命令提示符 window,执行以下命令,并阅读每个命令的 window 中的帮助输出。
dir /?
for /?
goto /?
if /?
md /?
set /?
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%