首先,我是批处理文件脚本的新手并且愿意学习它。
假设我在一个文件夹中有一堆文件,文件扩展名为/file-ext:ext1、ext2和ext3。
每个文件都有增量,例如:
文件名.file -ext.1 文件名.file
-ext.2
文件名.file-ext.3
...
文件名.file-ext.x
主要目标是备份旧增量(从1到x-1),然后将它们备份到新文件夹中,然后将最后一个增量“x”更改为“1”。
您的任何帮助将不胜感激。
首先,我是批处理文件脚本的新手并且愿意学习它。
假设我在一个文件夹中有一堆文件,文件扩展名为/file-ext:ext1、ext2和ext3。
每个文件都有增量,例如:
文件名.file -ext.1 文件名.file
-ext.2
文件名.file-ext.3
...
文件名.file-ext.x
主要目标是备份旧增量(从1到x-1),然后将它们备份到新文件夹中,然后将最后一个增量“x”更改为“1”。
您的任何帮助将不胜感激。
文件名包含数字时的主要问题是它们以字母顺序而不是数字顺序出现。例如:
filename.file-ext.1
filename.file-ext.10
filename.file-ext.11
filename.file-ext.12
filename.file-ext.2
filename.file-ext.3
filename.file-ext.4
filename.file-ext.5
filename.file-ext.6
filename.file-ext.7
filename.file-ext.8
filename.file-ext.9
上一个列表中的最后一个文件应该是 12,但for
or dir
commands 给出的最后一个名称是 9。下面的批处理文件使用了两遍方法:它首先查看整个列表并获取真正的最后一个数字文件,然后处理再次列出并备份除最后一个文件之外的所有文件。
@echo off
setlocal EnableDelayedExpansion
rem First pass: Get the last numeric file
set last=0
for %%a in (filename.ext.*) do (
set num=%%~Xa
if !num:~1! gtr !last! set last=!num:~1!
)
rem Second pass: Backup all files excepting the last one
for %%a in (filename.ext.*) do (
if %%a neq filename.ext.%last% move %%a \backupDir
)
rem Rename the last file, if it is not 1
if %last% gtr 1 ren filename.ext.%last% filename.ext.1
上面的程序写得尽可能简单明了。如果文件名可能包含空格,则必须插入一些引号。
@ECHO OFF
SETLOCAL
SET filename=FILENAME
SET fileext=FILE-EXT
SET "deedpoll="
FOR /f "delims=" %%i IN ('dir /b /a-d /o:-d "%filename%.%fileext%*"') DO (
IF DEFINED deedpoll ECHO MOVE "%%i" "\newdir\" >nul
IF NOT DEFINED deedpoll SET "deedpoll=%%i"
)
IF DEFINED deedpoll ECHO REN "%deedpoll%" "%filename%.%fileext% 1"
由于我们不知道所涉及的真实文件名或文件扩展名,我们只能假设它们将是简单的字母和空格。我还假设您的目标目录存在并且您的当前目录是包含您的文件集的目录。
而且我假设您的排序将在 DATE 工作 - 这是最新的文件,没有备份(移动到newdir
)并重命名...1
这很简单。首先清除deedpoll
然后执行裸文件名dir
列表,没有目录名按日期倒序排列。/b
/a-d
/o:-d
因此,分配给 %%i 的第一个文件名将是最新的。deedpoll
尚未设置,因此move
不执行,然后deedpoll
分配最新文件的名称。
由于deedpoll
现在已设置(或定义),因此move
将为与提供的掩码匹配的每个其他文件名完成。
最后,deedpoll
重命名为版本 1。
请注意,REN
ame 和MOVE
commands 仅ECHO
在屏幕上显示。这是为了让您确保该批次将执行您希望它执行的操作。如果一切正确,请删除这两个ECHO
关键字以激活重命名和移动。