【问题标题】:How do I increment a folder name using Windows batch?如何使用 Windows 批处理增加文件夹名称?
【发布时间】:2012-11-11 03:50:59
【问题描述】:

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

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

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    这是一个始终有效的解决方案,即使数字上存在差距。文件夹编号始终比当前最大编号大 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%"
    

    【讨论】:

      【解决方案2】:

      这样您就可以计算“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 开始,都会创建新文件夹:) 希望你会喜欢!

      【讨论】:

      • 我同意你的最后一句话。如果编号中存在空白,您现有的解决方案可能会失败。
      • 非常感谢!我结束了使用 dbenham 的解决方案,因为代码更简洁,但我感谢您放入您的所有 cmets:就像我说的,我以前从未真正使用过批处理脚本,所以很高兴看到它背后的一些逻辑!
      【解决方案3】:

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

      @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%
      

      【讨论】:

      • 如果已经有 10 个,那将不起作用,因为 x10 在 x9 之前排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2018-09-24
      • 2013-04-22
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多