使用秒将文件批量重命名为创建时间

时间:2016-04-21 04:37:25

标签: batch-file

我重命名了一堆文件,并将文件的创建时间(包括秒)添加到文件名中,同时保留原始文件。最好是24小时格式,但上午/下午也可以。

理想示例:Video001.mp4变为20160421-153242-Video001.mp4Video002.mp4变为20160421-153248-Video002.mp4。格式可能会有所不同。

这是我写的代码CLOSE,但不包括秒:

@echo off

FOR %%V IN (%1) DO (
FOR /F "tokens=1-6 delims=/: " %%J IN ("%%~tV") DO (

IF EXIST %%L%%J%%K_%%O%%M%%N-%%~nV%%~xV (ECHO Cannot rename %%V)

ELSE (Rename "%%V" %%L%%J%%K_%%O%%M%%N-%%~nV%%~xV)

我无法弄清楚如何获取该文件的CREATION时间的SECONDS部分。我一直在搜索,但还没找到正确的答案:(。

应用程序允许按创建日期(在多个摄像机源之间)轻松排序视频文件。

3 个答案:

答案 0 :(得分:2)

您可以使用以下批处理代码:

@echo off
if "%~1" == "" goto :EOF
setlocal EnableDelayedExpansion
for %%V in (%1) do (

    rem Get name of file with full path.
    set "FileName=%%~fV"

    rem Escape each backslash in file path with one more backslash.
    set "FileName=!FileName:\=\\!"

    rem Get creation date and time of file in format YYYYMMDDHHMMSS.
    for /F "usebackq skip=1 tokens=1 delims=." %%T in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE where "name='!FileName!'" get CreationDate`) do set "FileDateTime=%%T"

    rem The first 8 characters are file creation date.
    set "FileDate=!FileDateTime:~0,8!"
    rem The next 6 characters are file creation time.
    set "FileTime=!FileDateTime:~8,6!"

    if exist "!FileDate!_!FileTime!-%%~nV%%~xV" (
        echo Cannot rename file: %%~fV
    ) else (
        ren "%%~fV" "!FileDate!-!FileTime!-%%~nV%%~xV"
    )
)
endlocal

%%~tV以区域和语言相关的格式返回上次修改文件时间而没有秒。但是你想要创建文件时间,也需要第二个。

wmic - Windows Management Instrumentation命令行实用程序 - 可用于以区域和语言无关的日期/时间格式获取第二个创建文件时间。使用 wmic 的缺点是速度。这个命令很慢。有关文件时间 wmic 使用情况的详细信息,请阅读Find out if file is older than 4 hours in batch file上的答案。

如果您想要上次修改文件时间而不是创建文件时间,请使用LastModified代替CreationDate

创建和上次修改日期之间有什么区别?

上次修改日期是上次修改文件内容的日期。

创建日期是文件首次在其当前所在的目录中创建的日期。

例如,如果文件是昨天创建的,则它具有相同的创建和最后修改日期,因为该文件是在目录中创建的,并且内容是最后一次同时修改的。如果文件今天被复制到另一个目录,则上次修改日期仍然是相同的日期(昨天),但是副本的创建日期是今天。

大多数人只对上次修改日期感兴趣,而不是在文件创建日期感兴趣,因为重要的是上次修改文件内容的时间,而不是在当前目录中创建文件的时间。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?
  • ren /?
  • set /?
  • setlocal /?
  • wmic DATAFILE get /?

答案 1 :(得分:1)

您无法从纯批处理语法中获得秒数。为此,您需要使用其他工具。以下PowerShell脚本可以满足您的要求:

MyRename.ps1

dir $args[0] | foreach {
  $newname = "$($_.CreationTime.toString('yyyyMMdd-HHmmss'))-$($_.Name)"
  if (test-path $newname) {
    "Cannot rename $_"
  } else {
    ren $_ $newname -WhatIf
  }
}

注意:此代码仅显示要重命名的内容。要实际执行重命名,请从ren命令

中删除-WhatIf参数

如果您想要修改时间而不是创建时间,请将脚本中的$_.CreationTime更改为$_.LastWriteTime

要从批处理文件中调用此PowerShell脚本,请运行powershell.exe

powershell -f .\MyRename.ps1 *.mp4

如果您收到有关运行脚本的错误,请将-ExecutionPolicy bypass添加到命令行。

powershell -ExecutionPolicy bypass -f .\MyRename.ps1 *.mp4

答案 2 :(得分:0)

基于@Mofi 对 OP 和 this 的回答,这是我的版本,允许通过拖放重命名多个文件:

@echo off
if "%~1" == "" goto :eof
SETLOCAL EnableDelayedExpansion

REM outer loop
for %%V in (%*) do (
    set "FileName=%%~fV"
    set "FileName=!FileName:\=\\!"
    set "FileName=!FileName:'=\'!"

    call :sub "!FileName!"

    set "FileDate=!FileDateTime:~0,8!"
    set "FileTime=!FileDateTime:~8,6!"

    if exist "!FileDate!_!FileTime!-%%~nV%%~xV" (
        echo Cannot rename file: %%~fV
    ) else (
        ren "%%~fV" "!FileDate!-!FileTime!-%%~nV%%~xV"
    )
)
REM ENDLOCAL
goto :eof

REM inner loop
:sub
for /F "usebackq skip=1 tokens=1 delims=." %%T in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE where "name='%~1'" get CreationDate`) do set "FileDateTime=%%T" & goto :next
:next
goto :eof

编辑:对路径或文件名中的空格进行少量更改;)

EDIT2:将单引号 ' 替换为 \' 以在路径或文件名中对它们进行转义的小改动