Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 根据同名的现有文件夹创建编号递增的文件夹_Batch File - Fatal编程技术网

Batch file 根据同名的现有文件夹创建编号递增的文件夹

Batch file 根据同名的现有文件夹创建编号递增的文件夹,batch-file,Batch File,我想创建一个批处理文件,当已经存在一个同名文件夹时,该文件将创建一个编号递增的文件夹 例如,对于名为folder的文件夹,如下所示: if exist folder md folder1 if exist folder1 md folder2 我想要的是,当已经有一个或多个同名文件夹(folder1,folder2,…)时,创建另一个末尾编号递增的文件夹,并缩短代码。此批处理代码基于您最初的想法: @echo off set "Folder=C:\Temp\Test" if not exist

我想创建一个批处理文件,当已经存在一个同名文件夹时,该文件将创建一个编号递增的文件夹

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

if exist folder md folder1 if exist folder1 md folder2

我想要的是,当已经有一个或多个同名文件夹(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\u New\u 15
可能是此批处理文件的问题,该批处理文件只需要
C:\Temp\Test
、C:\Temp\Test1
、C:\Temp\Test2
、。。。被发现了。(
Test_New_15
被忽略,但类似的东西可能是一个问题。)当然可以消除这个问题,例如,在
dir
返回的每一行上额外使用
findstr
,检查在FolderName定义的字符串之后是否只追加了一个数字

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

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

  • dir/?
  • 获取/?
  • goto/?
  • 如果/?
  • md/?
  • 设置/?
  • setlocal/?

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

    @echo关闭
    setlocal enableextensions disabledelayedexpansion
    设置“folderName=test”
    2> nul(md”%folderName%%“| | cmd/q/c”代表(11 100000)中的/l%%a执行md”%folderName%%%a“&退出%%a”)
    如果errorlevel 1设置“folderName=%folderName%%errorlevel%”
    echo已创建%folderName%
    
    如果有人对值为65534的原因感兴趣,请阅读Microsoft TechNet文章,并查看表13-6 FAT32大小限制(单个文件夹中的最大文件数和子文件夹数)。我观察到,即使在NTFS分区上,如果文件夹%TEMP%达到65534个文件和子目录条目,许多应用程序也会停止正常工作。现在是时候使用了。我刚刚尝试了第二个代码(正如你说的:更快的代码),它工作得非常好!是否有办法仅在上一个文件夹为空时删除它?如果有,请告诉我。这很有效。但如果我想在%AppData%\.minecraft\中创建一个“modsBackup”文件夹,该怎么办?代码会是什么样子?@TomLenc,
    set“folderName=%AppData%\.minecraft\modsBackup”
    谢谢!但我还需要一件事。。如何自动删除“modsBackup”文件夹,无论该文件夹由命令生成的数字是多少,但仅当其为空时(因为在我的程序中,它会将文件复制到该文件夹,但有时无法工作。这就是为什么…)@TomLenc,如果尚未存储文件夹名称,请尝试全部删除<代码>2>nul(对于(“%AppData%\.minecraft\modsBackup*”)do rd“%%~fa”中的/d%%a)仅删除空目录。或者在这里搜索。关于搜索最后一个文件/文件夹,有很多问题。