我重命名了一堆文件,并将文件的创建时间(包括秒)添加到文件名中,同时保留原始文件。最好是24小时格式,但上午/下午也可以。
理想示例:Video001.mp4
变为20160421-153242-Video001.mp4
,Video002.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部分。我一直在搜索,但还没找到正确的答案:(。
应用程序允许按创建日期(在多个摄像机源之间)轻松排序视频文件。
答案 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:将单引号 '
替换为 \'
以在路径或文件名中对它们进行转义的小改动