更新的答案
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:: Create Empty Folder
rd /Q "%Temp%\Temp" 2>nul & mkdir "%Temp%\Temp"
:: Loop through Folders
pushd "xPath=x:\processing"
for /d %%D in (*) do call :Process "%%~fD"
popd
goto End
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Process <Parent>
:: Folder Name
set "xFolder=%~nx1"
:: Set Sub Folder
if not exist "%~1\VIDEO\" goto :eof
pushd "%~1\VIDEO"
:: Loop through Videos
for /f "delims=" %%A in ('dir *.avi /b') do if exist "%%~fA" (
set "xDateWritten=%%~tA"
set "xDateGMT=0000/00/00 00:00:00"
for /f "tokens=1,2" %%X in ('robocopy . "%Temp%\Temp" "%%~nxA" /TS /FP /NS /NC /NP /NJH /NJS /NDL /L') do set "xDateGMT=%%X %%Y"
rem Format = FF-FF-YYYYMMDD-HHh-MMm-SSs-FF-FF.ext
echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA
)
popd
goto :eof
:End
endlocal
pause
由于您将其更改为T:C
,T:W
我将脚本调整为仅使用 Last Written Date 并添加了文件夹递归。
准备好后用以下内容替换该echo
行:
ren "%%~fA" "%xFolder:~0,2%-%xFolder:~2,2%-!xDateWritten:~6,4!!xDateWritten:~0,2!!xDateWritten:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xA"
原创 & 编辑
好吧,为了保持脚本简单,我严格按照您发布的文件夹结构来设置格式。这只是一个让您入门的框架脚本。它有效,但没有获得视频的长度。长度可以根据已经检索到的信息来计算,但我现在不想做日期数学。:)
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:: Setup
rd /Q "%Temp%\Temp" & mkdir "%Temp%\Temp" 2>nul
set "xPath=x:\processing\01020304\VIDEO"
set "xFolder="
:: Parse Folder Name
for /f "tokens=3 delims=\" %%A in ("%xPath%") do set "xFolder=%%A"
:: Loop through Videos
pushd %xPath%
for /f "tokens=1,2,3,4,*" %%A in ('dir *.avi /T:C /4') do if exist "%%~fE" (
set "xDateWritten=%%~tE"
set "xDateCreated=%%~A %%~B %%~C"
set "xDateGMT=0000000000000000000"
for /f "tokens=1,2" %%X in ('robocopy . "%Temp%\Temp" "%%~E" /TS /FP /NS /NC /NP /NJH /NJS /NDL /L') do set "xDateGMT=%%X %%Y"
echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateCreated:~6,4!!xDateCreated:~0,2!!xDateCreated:~3,2!-!xDateWritten:~11,2!h-!xDateWritten:~14,2!m-!xDateGMT:~17,2!s-%xFolder:~4,2%-%xFolder:~6,2%%%~xE
)
popd
endlocal
pause
不幸的是,t
选项和dir
命令不提供秒所需的日期分辨率。要获取文件的完整最后修改时间戳,您可以使用forfiles
orrobocopy
命令。
rd /Q "%Temp%\Temp" 2>nul & mkdir "%Temp%\Temp" && robocopy . "%Temp%\Temp" *.avi /TS /FP /NS /NC /NP /NJH /NJS /NDL /L
注意: RoboCopy 以 GMT+0 形式返回文件的时间戳!它不会根据用户的时区设置返回时间戳。要确定您所在的时区,请使用tzutil /g
.
请参阅RoboCopy /?
(Vista+ 或 XP 资源工具包)
forfiles /M *.avi /C "cmd /c echo @ftime"
见ForFile /?
(Vista+)
编辑:
我更新了代码以将最后写入的小时和分钟包含在文件名中。所有需要做的就是rename
在循环中添加命令。要从文件中获取时间戳的秒数,必须使用robocopy
or命令。forfiles
编辑 2:
添加了有关 RoboCopy 和 GMT+0 文件时间戳的注释,并更新了代码以处理此限制。添加了rd
andmkdir
以确保我们有一个空文件夹,添加了文件时间戳的for
解析,并添加了变量。这现在应该可以正常工作了,如果以后有时间,我会再清理一下。robocopy
xDateGMT
编辑3:
重新格式化答案以使其更清洁。请参阅上面的更新部分。