使用 Windows CMD 或简单的 .TXT 重命名文件以将修改日期添加到文件名

new*_*bie 5 rename batch-file windows-command-prompt executable date-modified

我正在尝试重命名大量文件,以将文件资源管理器中“修改日期”列中的日期合并到 YYYYMMDD 格式的每个文件名中。我能够使用以下步骤从内部所有文件的所需文件夹生成报告:

  1. 单击提示和技巧文件夹
  2. 按住 Shift 键并右键单击 Tips and Tricks 文件夹
  3. 单击“在此处打开命令窗口”
  4. 类型 dir>filename.txt
  5. 点击进入
  6. 打开 Tips and Tricks 文件夹并查找具有您创建的文件名的文本文件

然后我将报告作为带分隔符的文本文件拉入 Excel 并处理内容,因此我现在在一列中有“最后修改”日期,在另一列中有文件名:

修改日期| 文档名称

1/9/2009 | ArcGIS_TT_Projections_Transformations.doc

2/18/2014 | ArcGIS_TT_Re-Projection_WMAS.docx

1/9/2009 | ArcGIS_TT_Set_Selectable_Layers.doc

1/9/2009 | ArcGIS_TT_Spatial_Join.doc

2010/4/21 | ArcGIS_TT_View_CLU_History_Layer.doc

我只成功使用了如下重命名脚本:

@echo off
setlocal enableDelayedExpansion
for %%F in ("ArcGIS_TT_Projections_Transformations*.txt") do (
  set "name=%%F"
  ren "!name!" "!name:ArcGIS_TT_Projections_Transformations=ArcGIS_TT_Projections_Transformations_20090109!"
)
pause
Run Code Online (Sandbox Code Playgroud)

但我试图避免对 61 个文件重复该过程。有没有人建议使用 Windows CMD 提示或一个简单的 .txt,我可以用它来更自动地将日期修改信息提取到文件名中?

谢谢你的帮助!

Ger*_*der 6

在 Powershell 中,您可以使用 One-Liner 执行此操作:

Get-ChildItem |Foreach-Object { Rename-Item $_ -NewName ("{0}-{1}{2}" -f $_.BaseName,$_.LastWriteTime.ToString('yyyyMMdd'),$_.Extension)  }
Run Code Online (Sandbox Code Playgroud)

解释:

  • Get-ChildItem:获取目录中的所有项目。您也可以添加-Recurse以从子目录中获取文件
  • Foreach-Object:对每个文件运行以下代码块
  • $_:当前迭代文件作为对象
  • $_.BaseName : 没有扩展名的文件名
  • $_.LastWriteTime : 最后一次写入时间作为 DateTime 对象
    该方法.ToString()允许您根据需要进行格式化
  • $_.Extension : 文件的扩展名


use*_*571 3

以下是您需要用来迭代文本文件、获取每个文件的修改日期、使用修改日期作为文件名的一部分复制每个文件以及删除原始文件的代码。你们已经很接近了,但你错过了一些东西。

要获取文件的修改日期,我们可以使用set "MDate=%%~tF".

要解析提供的日期,set "MDate=%%~tF"您需要指定要在输出中使用 %MDate% 存储的值的哪些部分。您可以使用该命令set "ParsedDate=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"将 MM/DD/YYYY hh:mm 的输出转换set "MDate=%%~tF"为 YYYYMMDD。

之后,我们可以使用文件名中的 %ParsedDate% 值将文件复制到新文件。

您应该看到文件的两个副本。如果你想删除原来的文件我们只需要运行命令即可for %%F in ("C:\test\*.txt") do ( del %%F )。这将为您留下重命名的文本文件。要将 .txt.new 转换为 .txt,请使用命令ren "C:\test\*.new" *.

因为我们处于 for 循环中,所以我们需要更改变量的寻址方式(基于您到目前为止所写的内容,您已经知道)。我们将 % 更改为 ! 对于循环内的变量名。因此,如果您有变量名称,您可以在循环内部example使用而不是 来引用该变量。!example!%example%

setlocal enabledelayedexpansion为了使循环内的变量起作用,我们还需要在循环之前添加命令。

这应该涵盖一切。如果这解决了您的问题,请随时投票或将答案标记为正确。

下面提供了完整的批处理文件。

setlocal enabledelayedexpansion

for %%F in ("C:\test\*.txt") do ( 
    set "MDate=%%~tF"
    set "ParsedDate=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
    REM To add time
    set "ParsedDate=!MDate:~6,4!!MDate:~3,2!!MDate:~0,2!!MDate:~11,2!!MDate:~14,2!"
    copy %%F %%~dpnF_!ParsedDate!%%~xF.new )

for %%F in ("C:\test\*.txt") do ( 
    del %%F )

ren "C:\test\*.new" *.

exit
Run Code Online (Sandbox Code Playgroud)