【问题标题】:Rename File with Creation Date & Time in Windows Batch在 Windows 批处理中使用创建日期和时间重命名文件
【发布时间】: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)? 谢谢你

【问题讨论】:

    标签: windows date batch-file time renaming


    【解决方案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 可能是其中的任意组合。
    • 你是对的!但是我需要修改代码的哪一部分?我现在不知道该怎么做。谢谢你的回答。
    • 告诉我你的日期/时间格式,如果你愿意,我可以为你做。
    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 2011-12-05
    • 2023-03-04
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多