批处理如何读取文件名中的最后一位数字然后使用该数字+ 1移动

Batch How to read last digit in file name then move using that digit + 1

所以我有一个程序制作一个名为 "demo.dem" 的文件,我现在正在做的是将它移到另一个文件夹。我想要一个批处理脚本将文件从 "C:\foo" 移动到 "C:\bar" 这本身很简单,但该文件将包含多个名为 "demo.dem" 的文件,所以我需要它来添加一个新数字根据文件夹中已有的内容。假设我的文件夹中已经有演示 1-5。那么下一个需要是 "demo6.dem" 下面我有一些代码,但我不是批处理专家。

copy C:\foo\demo.dem C:\bar\demo1.dem
del C:\bar\demo.dem

如您所知,这是行不通的。任何人都知道如何让它正常工作? (如果您觉得可以更好地措辞,请编辑 post。)

这可能不是最优雅的方法,因为它只是迭代直到成功,但它应该有效:

@echo off 
set counter=1
:retry
if NOT EXIST c:\bar\demo%counter%.dem (
  move c:\foo\demo.dem c:\bar\demo%counter%.dem
 ) else (
  set /a counter=%counter%+1
  goto retry
 )
echo.
echo Created c:\bar\demo%counter%.dem!
echo.
set counter=

这并不完全是您想要做的,但可以使用变量 %RANDOM%%TIME% 作为名称来实现目标,但无论如何以下内容应该可以完成工作。

注意: 命令 FOR 搜索由连字符 - 和点 . 包围的数字,即。演示-001.dem

所以遵守重命名掩码很重要,否则稍后脚本可能无法检测到最大数字。

如果万一你想换掩码,那么会带你去处理设置tokendelims

@echo off
echo List directory
dir /b C:\bar\ |sort /r

for /f "tokens=2 delims=-." %%a in ('dir /b C:\bar\demo-???.dem ^|sort /r ^|findstr /r [0-9]') do (
  set "num=%%a"
  goto done
)

:done
set /a "num=%num%+1"
dir /b |sort /r
echo the highest number found is %num% -1
move c:\foo\demo.dem  c:\bar\demo-%num%.dem
dir /b C:\bar\ |sort /r

更新: 我已经编辑了 Dir 命令的掩码以仅列出具有特定掩码 (dir /b C:\bar\demo-???.dem) 的文件以保持文件正确排序,否则如果你有 1-2 位数字且前面没有 0 的文件应该打破排序。

示例:假设您对这堆文件进行排序:demo-009.txt、demo-010.txt、demo-3.txt;没有面具 (dir /b demo-???.txt) 你会得到 demo-3.txt 作为最高数字。所以编号前面的0很重要。