5

我有一个批处理脚本,它创建一个名为 New_Folder 的文件夹以及其中的一些子目录和文件。目前,如果我需要创建多个 New_Folder,我必须重命名批处理创建的每个 New_Folder,然后才能再次运行它并创建一个新文件夹。我想做的是进行批量检查,看看 New_Folder 是否已经存在,如果存在,将 New_Folder 增加一个数字。所以我会有 New_Folder、New_Folder1、New_Folder2 等等。

我该怎么做呢?我在批处理脚本中看到的增加内容的解决方案似乎不适用于我的情况,除了我为自己的代码复制/粘贴的内容之外,我对批处理脚本一无所知。

4

3 回答 3

8

这是一个始终有效的解决方案,即使数字上存在差距。文件夹编号将始终比当前最大编号大 1。

@echo off
setlocal enableDelayedExpansion
set "baseName=New_Folder"
set "n=0"
for /f "delims=" %%F in (
  '2^>nul dir /b /ad "%baseName%*."^|findstr /xri "%baseName%[0-9]*"'
) do (
  set "name=%%F"
  set "name=!name:*%baseName%=!"
  if !name! gtr !n! set "n=!name!"
)
set /a n+=1
md "%baseName%%n%"
于 2012-11-11T06:24:42.460 回答
3

这样,您将能够计算“New_Folder *”的出现次数并使用下一个数字创建一个。

@echo off
set /a count=0

for /d %%d in (New_Folder*) do (
    set /a count+=1
)

set /a count+=1

mkdir New_Folder%count%

请注意,最好的方法是在 New_Folder 的末尾找到最大的数字,但是 Windows Batch 非常有限,而且我是 Linux 人!

编辑:经过大约一小时的谷歌搜索和测试:

@echo off

setlocal EnableDelayedExpansion

set max_number=0

for /d %%d in (New_Folder*) do (
    set current_directory=%%~nxd

    call:StrLength name_length !current_directory!
    call:Substring directory_number,!current_directory!,10,!name_length!

    if !directory_number! gtr !max_number! (
        set max_number=!directory_number!
    )
)

set /a max_number+=1

mkdir New_Folder%max_number%

:Substring
::Substring(retVal,string,startIndex,length)
:: extracts the substring from string starting at startIndex for the specified length 
 SET string=%2%
 SET startIndex=%3%
 SET length=%4%

 if "%4" == "0" goto :noLength
 CALL SET _substring=%%string:~%startIndex%,%length%%%
 goto :substringResult
 :noLength
 CALL SET _substring=%%string:~%startIndex%%%
 :substringResult
 set "%~1=%_substring%"
GOTO :EOF

:StrLength
::StrLength(retVal,string)
::returns the length of the string specified in %2 and stores it in %1
set #=%2%
set length=0
:stringLengthLoop
if defined # (set #=%#:~1%&set /A length += 1&goto stringLengthLoop)
::echo the string is %length% characters long!
set "%~1=%length%"
GOTO :EOF

请注意,命令行返回错误“命令的语法不正确”。但一切正常,所以我会让你找到原因......无论目录的顺序如何,或者它们是否从 1 开始,都会创建新文件夹 :) 希望你会喜欢!

于 2012-11-11T04:52:36.907 回答
2

此解决方案找到编号最大的名称,并为其创建下一个名称:

@echo off
for /d %%d in (New_Folder*) do set lastFolder=%%d
set /A nextFolder=%lastFolder:*New_Folder=% + 1
mkdir New_Folder%nextFolder%

编辑:以前的解决方案没有正确获得最后一个编号的文件夹,但下一个是正确的:

@echo off
setlocal EnableDelayedExpansion
set lastFolder=0
for /d %%d in (New_Folder*) do (
   set folder=%%d
   set folder=!folder:New_Folder=!
   if not defined folder set folder=0
   if !folder! gtr !lastFolder! set lastFolder=!folder!
)
set /A nextFolder=lastFolder+1
mkdir New_folder%nextFolder%
于 2012-11-11T05:08:39.693 回答