【问题标题】:Need help batch renaming video files in a specific format需要帮助以特定格式批量重命名视频文件
【发布时间】:2012-12-27 15:54:55
【问题描述】:

我正在重命名来自数码相机视频记录的文件。 它们以通用增量文件名输出文件,我不需要其中的任何信息。我的文件夹结构是: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 等目录。 .

【问题讨论】:

  • 感谢 oldskool 的格式化,现在读起来肯定好多了。

标签: batch-file batch-processing file-rename


【解决方案1】:

更新答案

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

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 命令。要从文件中获取时间戳的秒数,必须使用 robocopyforfiles 命令。

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

编辑 3:

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

【讨论】:

  • forfiles 或 robocopy 似乎都不适合我,我在 XP 上。我也不需要文件的实际长度,只需要它的创建日期。
  • @user1932480 我想我应该添加免责声明,但 RoboCopy 和 ForFiles 仅在 Windows Vista 和更新版本的 Windows 上分发。 RoboCopy 可以通过这个 Windows 资源包添加到 XP:microsoft.com/en-us/download/details.aspx?id=17657
  • 经过更多搜索后,我看到 robocopy 报告了 GMT+0 时区的时间戳...所以我不知道它是否会在此处输出正确的值。
  • @Shiken 我已经用文件夹递归脚本更新了我的答案。
  • @Shiken 很高兴我能帮上忙。我也会为你分解它。 1.隐藏命令。 2. 隔离变量范围并启用能力。 3. 为 RoboCopy 创建一个空文件夹,这样它就不会溢出。 4. 循环遍历路径中每个文件夹调用Process 函数的文件夹。 5.Process函数有1个参数,即文件夹路径。 6. 验证它有一个视频文件夹。 7. 循环播放视频文件夹中的每个 .avi 文件。 8. 检索日期 9. 重命名为新文件名。 10. goto :eof 退出函数返回给调用者。 /? 和 Technet 是 batch 最好的朋友!
猜你喜欢
  • 2020-08-30
  • 2014-02-06
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多