1

我有一个文件列表。每天我都会生成一个新的文件列表。我需要保留以前生成的文件列表。我想在昨天文件的末尾添加和编号,并且我想将所有以前的文件增加 1,以便昨天的文件始终为 0001。例如:

昨天生成的文件有:

P.xls
T.xls
W.xls

我想运行一个命名它们的批处理文件:

P0001.xls
T0001.xls
W0001.xls

好的。我可以做那部分。没什么大不了。这些文件总是命名为 P、T 和 W,因此这部分很容易。更难的部分是每天重命名 P0001.xls、T0001.xls 和 W0001.xls。我可以制作一个像这样开头的批处理文件:

rename P9998.xls P9999.xls

并一直工作到 P0001.xls,但这太荒谬了。我不想为每个文件输入 10,000 行。

对此批处理文件的任何帮助将不胜感激。

基思

4

2 回答 2

0

下面的批处理文件以更快的方式实现所需的重命名,因为它处理文件编号而不是文件名,因此每个循环重命名 3 个文件;此外,循环比使用文件名for /L的常规运行得更快。for如果文件数量很大,速度很重要。

@echo off
setlocal EnableDelayedExpansion

rem Rename files generated yesterday
ren ?.xls ?0000.xls

rem Get the number of the last file
for /F "delims=" %%a in ('dir /B /A-D /O-N *.xls') do (
   set lastName=%%a
   goto continue
)
:continue
set /A oldNumber=1%lastName:~1,4%, newNumber=oldNumber+1, numFiles=newNumber-10000

rem Rename all files
for /L %%a in (1,1,%numFiles%) do (
   ren ?!oldNumber:~1!.xls ?!newNumber:~1!.xls
   set /A oldNumber-=1, newNumber-=1
)
于 2013-07-13T03:50:38.170 回答
0

与其迭代所有可能的数字,不如只处理存在的文件更有效。作为第一步,我暂时附加.ren到文件中,这样我就不必担心按降序处理。

此解决方案假定所有以 PW 或 T 开头的现有 .XLS 文件都将被重命名并遵循正确的命名约定。它还假定要重命名的文件位于当前目录中。

@echo off
setlocal enableDelayedExpansion
for %%C in (P T W) do ren %%C*.xls *.*.ren
ren ?.xls.ren ?0000.*
for %%F in (*.xls.ren) do (
  set "num=%%F"
  set /a "num=1!num:~1,4! - 9999"
  set "num=000!num!"
  ren %%F ?!num:~-4!.xls
)

这是一个更直接但效率可能较低的版本,可以安全地忽略以 PT 或 W 开头的不符合命名约定的 .XLS 文件。在这里,我按降序对文件进行排序,这样我只需要重命名每个文件一次。

@echo off
setlocal enableDelayedExpansion
for /f "delims=" %%F in (
  'dir /b /a-d /o-n *.xls^|findstr /rix [PTW][0-9][0-9][0-9][0-9].xls'
) do (
  set "num=%%F"
  set /a "num=1!num:~1,4! - 9999"
  set "num=000!num!"
  ren %%F ?!num:~-4!.xls
)
for %%C in (P T W) do ren %%C.xls ?0001.*

我正在利用 REN 如何处理通配符的一些鲜为人知的特性。请参阅Windows RENAME 命令如何解释通配符?了解更多信息。

于 2013-07-12T20:57:03.267 回答