我正在尝试重命名一大批文件,以将文件资源管理器中“修改日期”列中的日期合并到 YYYYMMDD 格式的每个文件名中。我能够使用以下步骤从所需文件夹中生成一份包含其中所有文件的报告:
- 点击“提示和技巧”文件夹
- 按住 Shift 键并右键单击“提示和技巧”文件夹
- 点击“在此处打开命令窗口”
- 类型
dir>filename.txt
- 单击 Enter
- 打开“技巧和窍门”文件夹并查找具有您创建的文件名的文本文件
然后,我将报告作为带分隔符的文本文件拉入 Excel,并处理其内容,这样现在一列中就有“上次修改”日期,另一列中就有文件名:
修改日期|文件名
2009 年 1 月 9 日 | ArcGIS_TT_Projections_Transformations.doc
2014 年 2 月 18 日 | ArcGIS_TT_Re-Projection_WMAS.docx
2009 年 1 月 9 日 | ArcGIS_TT_Set_Selectable_Layers.doc
2009 年 1 月 9 日 | 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
但我试图避免对 61 个文件重复该过程。有没有人建议我使用 Windows CMD 提示或简单的 .txt 文件来更自动地将修改日期信息提取到文件名中?
感谢您的帮助!
答案1
以下是您需要使用的代码,用于迭代文本文件、获取每个文件的修改日期、使用修改日期作为文件名的一部分复制每个文件以及删除原始文件。您已经非常接近了,但您遗漏了一些东西。
要获取文件的修改日期,我们可以使用set "MDate=%%~tF"
。
要解析提供的日期,set "MDate=%%~tF"
您需要指定要在输出中使用 %MDate% 存储的值的哪些部分。您可以使用该命令set "ParsedDate=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
将输出set "MDate=%%~tF"
从 MM/DD/YYYY hh:mm 转换为 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
答案2
在 Powershell 中,你可以使用单行命令执行此操作:
Get-ChildItem |Foreach-Object { Rename-Item $_ -NewName ("{0}-{1}{2}" -f $_.BaseName,$_.LastWriteTime.ToString('yyyyMMdd'),$_.Extension) }
解释:
- 获取子项:获取目录中的所有项目。您
-Recurse
也可以添加从子目录获取文件 - Foreach 对象:对每个文件运行以下代码块
- $_:当前迭代文件作为对象
- $_.基本名称:不带扩展名的文件名
- $_.最后写入时间:最后写入时间为 DateTime 对象
该方法.ToString()
允许您根据需要进行格式化 - $_.扩展:文件的扩展名