3

我正在重命名来自数码相机视频记录的文件。它们以通用增量文件名输出文件,我不需要其中的任何信息。我的文件夹结构是:x:\processing\01020304\VIDEO\0001.avi.

我试图实现的文件名将用于此示例:

01-02-20121227-07h30m00s-03-04.avi

在本例中,01-0201020304文件夹的前 4 个数字。20121227是视频的创建日期,07h30m00s作为视频的结束时间,通常以“最后修改时间”报告。最后03-04是之前使用的文件夹名称的后半部分。

我是编写这样的批处理文件的完全新手,但是找不到任何其他足以让自己开始的示例,因此将不胜感激。

编辑:到目前为止,我有:

    @echo off
setlocal EnableExtensions EnableDelayedExpansion

:: Setup
set "xPath=c:\processing\01010101\VIDEO"
set "xFolder="
set "xDateCreated="

:: 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:W /4') do if exist "%%~fE" (
    set "xDateCreated=%%~A %%~B %%~C"
    echo %xFolder:~0,2%-%xFolder:~2,2%-!xDateCreated:~6,4!!xDateCreated:~0,2!!

xDateCreated:~3,2!-!xDateCreated:~11,2!h-!xDateCreated:~14,2!m-00s-%xFolder:~4,2%-%

xFolder:~6,2%%%~xE
)
popd

endlocal
pause

我们快到了,只是错过了几秒钟,如果可能的话 id 喜欢更改它,所以我不必提供目录,而是从处理文件夹中运行它并检查所有 01010101、02010101 等目录..

4

1 回答 1

3

更新的答案

@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:CT: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命令不提供秒所需的日期分辨率。要获取文件的完整最后修改时间戳,您可以使用forfilesorrobocopy命令。

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在循环中添加命令。要从文件中获取时间戳的秒数,必须使用robocopyor命令。forfiles

编辑 2: 添加了有关 RoboCopy 和 GMT+0 文件时间戳的注释,并更新了代码以处理此限制。添加了rdandmkdir以确保我们有一个空文件夹,添加了文件时间戳的for解析,并添加了变量。这现在应该可以正常工作了,如果以后有时间,我会再清理一下。robocopyxDateGMT

编辑3:

重新格式化答案以使其更清洁。请参阅上面的更新部分。

于 2012-12-27T17:09:55.790 回答