首先,我在批处理文件脚本中完全是新手,并愿意学习它。
假设我的文件扩展名为/ 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”。
非常感谢您的任何帮助。
答案 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,但for
或dir
命令给出的姓氏是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
关键字以激活重命名并移动。