批处理文件脚本,用于备份多个文件的旧增量,并将最后一个增量更改为“1”

时间:2013-04-16 10:20:01

标签: batch-file

首先,我在批处理文件脚本中完全是新手,并愿意学习它。

假设我的文件扩展名为/ file-ext的文件夹中有一堆文件: ext1 ext2 ext3

每个文件都有增量,例如:

filename.file-扩展1
filename.file-EXT.2
filename.file-ext.3
...
filename.file-ext.x

主要目标是备份旧增量(从1到x-1),然后将它们备份到新文件夹中,然后将最后一个增量“x”更改为“1”。

非常感谢您的任何帮助。

2 个答案:

答案 0 :(得分: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,但fordir命令给出的姓氏是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

上面的程序尽可能简单明了。如果文件名可能包含空格,则必须插入一些引号。

答案 1 :(得分:0)

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

因为我们不知道所涉及的真实文件名或文件扩展名,我们只能假设它们是简单的alphamerics和空格。我还假设您的目标目录存在,并且您当前的目录是包含您的文件集的目录。

我假设您的排序将在DATE上运行 - 它是最新的文件,不会备份(移至newdir)并重命名为... 1

这很简单。首先清除deedpoll,然后执行dir裸名称/b的{​​{1}}列表,其中/a-d没有目录名/o:-d,且日期相反。

分配给%% i的第一个文件名因此是最新的。 deedpoll尚未设置,因此move未执行,然后为deedpoll分配了最新文件的名称。

由于deedpoll现在已设置(或已定义),因此将为与提供的掩码匹配的每个其他文件名执行move

最后,deedpoll被重命名为版本1.

请注意,REN ame和MOVE命令仅仅ECHO显示在屏幕上。这是为了确保批处理可以执行您想要的操作。如果一切正确,请删除这两个ECHO关键字以激活重命名并移动。