在 Windows 批处理中使用创建日期和时间重命名文件

Posted

技术标签:

【中文标题】在 Windows 批处理中使用创建日期和时间重命名文件【英文标题】:Rename File with Creation Date & Time in Windows Batch 【发布时间】:2015-07-16 18:26:09 【问题描述】:

我有一个包含数千个 pdf 和 tif 的目录树。一个文件夹可能包含多个 pdf 或 tif,在这种情况下它们的编号为 1.pdf、2.pdf 等...我必须使它们可用并确保它们首先是经过处理的最旧的文件 - 所以我想用它们的重命名它们创建日期和时间(1.pdf -> 20150415481876.pdf):

目前我使用

@echo off  
set datetime=%~t1
set name=%~n1 
set extension=%~x1
set year=%datetime:~6,4%
set month=%datetime:~3,2%
set day=%datetime:~0,2%
set hour=%datetime:~11,2%
set min=%datetime:~14,2%
ren %1 "%year%%month%%day%%hour%%min%%name%%extension%"

现在可以正确地将文件 1.tif 重命名为 2014052513241.tif(文件创建时间为 25.05.2014 13:24)。但是,如果我用 batch.bat *.tif 调用批处理,我怎样才能使它能够处理同一文件夹中的多个文件(例如 1.tif 2.tif 3.tif)? 谢谢你

【问题讨论】:

【参考方案1】:
@if (@X)==(@Y) @end /* JScript comment
    @echo off

    set "extension=tiff"
    set "directory=c:\somedir"

    pushd "%directory%"

    setlocal enableDelayedExpansion
    for %%a in (*%extension%) do (
        for /f %%# in ('cscript //E:JScript //nologo "%~f0" %%a') do set "cdate=%%#"
        echo ren "%%a" "!cdate!%%~xa"
    )

    rem cscript //E:JScript //nologo "%~f0" %*
    exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */


FSOObj = new ActiveXObject("Scripting.FileSystemObject");
var ARGS = WScript.Arguments;
var file=ARGS.Item(0);

var d1=FSOObj.GetFile(file).DateCreated;

d2=new Date(d1);
var year=d2.getFullYear();
var mon=d2.getMonth();
var day=d2.getDate();
var h=d2.getHours();
var m=d2.getMinutes();
var s=d2.getSeconds();
var ms=d2.getMilliseconds();

if (mon<10)mon="0"+mon;
if (day<10)day="0"+day;
if (h<10)h="0"+h;
if (m<10)m="0"+m;
if (s<10)s="0"+s;
if (ms<10)ms="00"+ms;else if(ms<100)ms="0"+ms;

WScript.Echo(""+year+mon+day+h+m+s+ms);

设置您自己的扩展名和目录,以将目录中具有给定扩展名的所有文件重命名为其创建日期。格式将为YYYYMMDDhhmm。重命名为echoed,因此您可以查看是否一切正常。如果删除第 9 行中的 echo 字。

【讨论】:

非常感谢。 1. 它正确地呼应了 ren 1.tif 201504160213.tif 但重命名没有发生。知道为什么吗? 2. 此外,如果有多个具有相同时间戳的文件,它会尝试将它们重命名为相同的名称,但这是行不通的,是否可以实现一个计数器,在扩展名之前的文件名中添加 _N 之类的内容? @PhiläBu - 可能是相同的时间戳是问题。您可以将毫秒和秒添加到时间戳,看看会发生什么。 再次感谢。所以我尝试了这种方法,但它没有帮助,因为文件本身似乎都有milisecs = 000。我将如何采用上述脚本来执行以下操作:我在某个根目录中有 100 个目录,我想用它们的创建日期重命名所有这 100 个目录?【参考方案2】:

这是执行此操作的本机 Windows CMD 方法(无需 vb/java 脚本)。

如果你想真正快速和简单,只需在 CMD 窗口中使用它,而不是编写批处理:

FOR /R "Drive:\folder\subfolder\" %Z IN (*.tiff) DO @( FOR /F "Tokens=1-6 delims=:-\/. " %A IN ("%~tZ") DO @( ren "%~dpnxZ" "%~C%~A%~B%~D%~E%~F%~nZ%~xZ") )

如果您仍然喜欢批处理/CMD 文件,这是重写您的脚本以用作 CMD,并将匹配特定搜索模式的目录中的所有文件重写为格式“ YYYYMMDDHHM[姓名][分机]"

@(
  SETLOCAL  
  echo off
  SET "_Skip=NO"
  Set "_elvl=0"
)
IF /I "%~2" EQU "" (
  SET "_Skip=YES"
)
IF /I "%~1" EQU "/?" (
  SET "_Skip=YES"
)
IF /I "%~1" EQU "?" (
  SET "_Skip=YES"
)
IF /I "%_Skip%" EQU "YES" (
  ECHO. Usage:
  ECHO.
  ECHO.  Rename.bat "Drive:\Path\" "File Glob to match"
  ECHO.
  ECHO. Example:
  ECHO. 
  ECHO.   Rename.bat "C:\Users\%Username%\Desktop\" "*.lnk"
  ECHO.
  Set "_elvl=2"
  GOTO :Finish
)
ECHO. Searching through "%~1" for Files matching this pattern: "%~2"
ECHO.
FOR /R "%~1" %%Z IN (%~2) DO ( FOR /F "Tokens=1-6 delims=:-\/. " %%A IN ("%%~tZ") DO ( REN "%%~dpnxZ" "%%~C%%~A%%~B%%~D%%~E%%~F%%~nZ%%~xZ) )
ECHO.
ECHO. Completed rename of all files matching pattern "%~2" which were found within path: "%~1"
ECHO.
:Finish
(
  EndLocal
  EXIT /B %_elvl%
)

【讨论】:

您好 Laercio,这是工作代码,但它使用本地化的日期和时间格式来创建输出,虽然您的回复不具体,但您可能位于日期/时间不同的区域本地化,因此生成的日期和时间以错误的顺序出现。解决这个问题只需按照您期望的顺序重新排列用于提供日期/时间的变量。 你会经常在 Stack Exchange 上看到人们只使用本地化值的日期和时间,以编程方式获取它的问题本身就是一个问题,并且可能在这里有它自己的问题,不像说 Experts-Exchange 没有动机,实际上社区也没有希望得到深入的答案,这是一个完整的项目,而是提供更小、更关注问题的响应,因此日期和时间是在 CMD 中遇到的麻烦不止一点,您会看到答案总是本地化的。如果您告诉我您的日期/时间格式,我可以告诉您要更改的内容。 特别基于 OPs 原始脚本,他的日期时间格式为“DAY-MONTH-YEAR HOUR:MINUTE”,而您的 s 可能是其中的任意组合。 你是对的!但是我需要修改代码的哪一部分?我现在不知道该怎么做。谢谢你的回答。 告诉我你的日期/时间格式,如果你愿意,我可以为你做。

以上是关于在 Windows 批处理中使用创建日期和时间重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

Windows批处理:如何读取文件中的日期和时间并将其与当前日期和时间进行比较

在 Windows 批处理脚本中格式化日期和时间

计划批处理文件不将文件重命名为使用 %date% 和 %time% 变量指定的名称

Windows批处理中获取日期和时间

如何查找上周日的日期并将其保存在Windows批处理文件的变量中

跳过在 Windows 98 批处理文件中输入新日期