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

6

我有一个包含数千个pdf和tifs的目录树。一个文件夹中可能包含多个pdf或tifs,在这种情况下它们都被编号为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(文件创建于2014年5月25日13:24)。但是,如果我使用batch.bat *.tif调用批处理程序如何处理同一文件夹中的多个文件(例如1.tif 2.tif 3.tif)?谢谢。

2个回答

2
@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。重命名是通过echo输出的,这样您就可以看到是否一切正常。如果一切正常,请从第9行中删除echo单词。


1
非常感谢。1. 它正确地回映了ren 1.tif 201504160213.tif,但重命名没有发生。有什么想法吗?2. 此外,如果有多个具有相同时间戳的文件,则尝试将它们重命名为相同的名称,这将无法工作,是否可以实现一个计数器,在扩展名之前添加类似于_N的文件名? - Philä Bu
@PhiläBu - 可能是相同的时间戳引起的问题。您可以将毫秒和秒添加到时间戳中,看看会发生什么。 - npocmaka
1
再次感谢。所以我尝试了这种方法,但它并没有帮助,因为文件本身似乎都有milisecs = 000。我该如何修改上面的脚本来实现以下功能:我有一个特定根目录中的100个目录,我想使用它们的创建日期重命名所有这些100个目录? - Philä Bu

1
这是一个原生的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 [Name] [扩展名]”格式。
@(
  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。这是有效的代码,但它使用本地化日期和时间格式来创建输出。尽管你的回复没有具体说明,但很可能你所在的区域具有不同的日期/时间本地化设置,导致结果日期和时间以错误的顺序出现。解决这个问题只需要重新排列提供期望日期/时间顺序的变量即可。 - Ben Personick
1
在Stack Exchange上,当涉及到日期和时间时,人们经常只使用本地化的值,以编程方式获取这些值是一个问题,可能有自己的问题,与Experts-Exchange不同,这里的社区没有动力,也没有渴望提供全面项目的详细答案,而是提供更小、更集中的问题解决方案,因此,在CMD中,由于日期和时间会带来很多麻烦,你会看到答案总是本地化的。如果您告诉我您的日期/时间格式,我可以告诉您需要更改什么。 - Ben Personick
根据原始代码,OP的日期时间格式为“DAY-MONTH-YEAR HOUR:MINUTE”,而您的可能是其中任何组合。 - Ben Personick
告诉我你的日期/时间格式,如果你愿意的话,我可以为你完成它。 - Ben Personick
你需要编辑的部分是 "%%C%%A%%B%%D%%E%%F%%",它由你系统中日期/时间格式的顺序决定。你系统中的第一个日期/时间项目是 "%%A",第二个是 "%%B",第三个是 "%%C",以此类推。如果你系统的日期时间格式是 "YYYY-MM-DD HH:mm",那么 YYYY=%%A,MM=%%B,DD=%%C,HH=%%D,mm=%%E。在OP的情况下,他的格式为 DD-MM-YYYY HH:mm,因此格式为 YYYY=%%C,MM=%%A,DD=%%B,HH=%%C,mm=%%E。希望这很清楚。 - Ben Personick
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接