如何使用渐进编号重命名多个文件夹?

时间:2019-01-04 18:14:56

标签: batch-file for-loop directory rename

我使用Windows 7 Ultimate。我的目录中有很多文件夹,我需要使用固定的基本名称和从1到无穷大的递增数字来重命名。

文件夹路径具有空间,基本文件夹为D:\Programmi Installati

要重命名的文件夹的示例:

log_04-01-2019 15-15-11,51
log_03-01-2019 21-18-16,22
log_02-01-2019 6-21-17,34
log_01-01-2019 8-22-14,19
log_27-12-2018 14-23-18,28

所需文件夹名称示例:

log_1
log_2
log_3
log_4
log_5

要重命名的文件夹的数量可以很大,但是结构是相同的。

3 个答案:

答案 0 :(得分:1)

此文件夹重命名任务的批处理文件代码:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Counter=1"
for /F "delims=" %%I in ('dir "D:\Programmi Installati\log_*" /AD /B /ON 2^>nul') do ren "D:\Programmi Installati\%%I" "log_!Counter!" & set /A Counter+=1
endlocal
pause

FOR 命令与cmd.exe /C(更精确的%ComSpec% /C)一起在后台命令行的单独命令进程中运行:

dir "D:\Programmi Installati\log_*" /AD /B 2>nul

DIR 输出以处理此后台命令过程的 STDOUT

  • 仅由于选项/AD(属性目录)而导致的所有目录的名称
  • 由于选项/B没有文件夹路径而以裸格式显示
  • 匹配通配符模式log_*
  • 在指定目录D:\Programmi Installati
  • 由于选项/ON,按名称排序。
如果

DIR 找不到符合这些条件的任何目录条目,则会输出一条错误消息来处理 STDERR 。此错误消息将重定向到设备 NUL 进行抑制。

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>必须在 FOR 命令行上使用脱字符号^进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式dir命令行。

FOR 捕获所有输出的行以处理已启动命令过程的 STDOUT ,并在启动cmd.exe自身终止后处理这些行。对于此文件夹重命名任务而言,非常重要的一点是, FOR 将在捕获的文件夹名称列表上运行,然后再进行文件夹重命名,否则在 FOR 访问它们时目录条目将发生更改。因此,在这种情况下不能使用for /D,因为for /D将处理log_*目录条目的列表,而每次成功重命名文件夹时,该列表都会更改。结果将是目录没有多次重命名或重命名,甚至是无限循环的运行循环,具体取决于文件系统(NTFS或FAT32或ExFAT之类的FAT文件系统)。

带有选项/F

FOR 会忽略此处未出现的空行。 FOR 也忽略以分号开头的行,因为默认行号为eol=;。但是 DIR 输出的所有行都以log_开头,因此,可以保留此任务的默认行尾定义。

带有选项/F

FOR 默认情况下使用常规空格和水平制表符作为分隔符将行拆分为子字符串,并仅将第一个空格/制表符分隔的字符串分配给指定的循环变量。这里不需要这种行拆分行为,因为循环变量I应该使用所有空格保存目录名称。因此,delims=用于定义一个空的定界符列表以禁用行拆分行为。

分配给循环变量I的目录名称用%%I引用, DIR 不输出完整路径作为命令 REN 的源名称。新文件夹名称为log_,计数器变量值使用delayed environment variable expansion引用。

在重命名目录后,使用独立的算术表达式将计数器变量加1,而与目录重命名成功(由于各种原因而失败)无关。

最后添加了命令 PAUSE ,以查看在重命名目录失败的情况下命令 REN 输出的错误消息。除了可以成功重命名所有目录上的 PAUSE 提示以外,没有任何输出。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • pause /?
  • ren /?
  • set /?
  • setlocal /?

有关运算符&的说明,另请参见single line with multiple commands using Windows batch file

PS:我建议使用共享软件文件管理器Total Commander,它具有内置的重命名工具,可以为没有编码经验的人重命名文件和文件夹。下载,安装并启动Total Commander,导航到包含所有这些文件夹的文件夹,按 Ctrl + A 选择文件夹,按 Ctrl + M 打开多重重命名工具窗口,其余的不言而喻。但是,如果您仍需要帮助,请按 F1 键以打开多重命名工具的帮助页面。

答案 1 :(得分:0)

假设您不想基于log_04-01-2019 15-15-11,5104-01-2019的文件夹日期进行排序。然后,波纹管解决方案将起作用。在这里,我们使用FOR循环使用dir %folder% /S /b /AD获取每个文件夹名称,并为原始文件夹名称扩展%%~nA

将来,如果您想按文件夹名称中的日期排序,则可以添加另一个循环来获取日期,然后使用IF对其进行排序。可以随意搜索该站点,因为有许多示例可以帮助您。

重命名.bat:

@ECHO OFF
@setlocal enabledelayedexpansion

Rem | Folder Path & CD To Location
Set "Folder=C:\Folder"
CD %Folder%

Rem | Get Raw File Name
Set "Number=1"
for /F "tokens=*" %%A in ('dir "log_*" /S /b /AD') do (

    Rem | Rename Folder || Raw Name - %%~n1
    rename "%%~nA" "log_!Number!"

    Rem | Add One To Number
    set /a "number+=1"

)

Goto :EOF

要获取有关任何命令的帮助,请执行以下操作:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • 等等。

答案 2 :(得分:0)

powershell脚本,用于将数字的前导零格式化为3位:

$iref = [ref]0 
Get-ChildItem 'D:\Programmi Installati\log_[0-9][0-9]-*' -Dir|
   Rename-Item -NewName {'log_{0:D3}' -f (++$iref.Value)}

要成为主题,使用cmd行/批处理

powershell -NoP -C "$iref=[ref]0;Get-ChildItem 'D:\Programmi Installati\log_[0-9][0-9]-*' -Dir|Rename-Item -NewName {'log_{0:D3}' -f (++$iref.Value)}"

抽样结果:

log_001
log_002
log_003
log_004
log_005

如果没有期望的前导零,则删除:D3部分。