使用批处理按照分辨率重命名我的视频文件

时间:2013-06-23 07:09:12

标签: windows video batch-file cmd mediainfo

我想根据它们所处的分辨率重命名我的视频文件,例如1080p中的视频'bla bla.mp4',我想将其重命名为'bla bla [H.264 1080p] 。该脚本应该能够自动检测视频的分辨率,如果文件已经重命名,它也不应该重命名。我无法找到检查分辨率的方法,所以我试着用它对于1080p文件:

    FOR /r %%a in (*.mp4) DO (IF EXIST *[H.264*.mp4 (
    ECHO Already done) 
    ELSE (
    REN "%%~a" "%%~na [H.264 1080p].mp4"))

但它的作用是一次又一次地检查同一个文件,这个文件已经被重命名,因此回复总是“已经完成”。

3 个答案:

答案 0 :(得分:3)

这个问题超出了SO问题的范围。不过我会回答它,因为今天是星期天。

  • 下载并安装命令行版本
  • mediainfo二进制文件的路径添加到您的系统或用户PATH环境变量
  • 复制重命名脚本,替换视频文件夹的路径,echo命令前有安全rename,如果输出看起来不错,请将其删除
  • 脚本测试已存在的已处理的文件(Peter Wright建议)

重命名脚本:

@echo off & setlocal
cd X:\video\path
for /f "delims=" %%i in ('dir /b /a-d *.mp4') do (
    set "fnameo=%%~ni"
    set "fnamee=%%~xi"
    set "Height="
    for /f "delims=" %%j in ('mediainfo "--Inform=Video;%%Height%%" "%%~i"') do set "Height=%%j" 
    setlocal enabledelayedexpansion
    call set "selftest=%%fnameo:[H.264 !Height!p]=%%"
    if "!selftest!" equ "!fnameo!" if not exist "!fnameo! [H.264 !Height!p]!fnamee!" (
        echo rename "!fnameo!!fnamee!" "!fnameo! [H.264 !Height!p]!fnamee!"
    )
    endlocal
)

输出示例:

rename "Handbrake.0.9.8.mp4" "Handbrake.0.9.8 [H.264 800p].mp4"
rename "Hybrid.2012.10.21.1.mp4" "Hybrid.2012.10.21.1 [H.264 800p].mp4"
rename "Womble.mp4" "Womble [H.264 1080p].mp4"

答案 1 :(得分:1)

这里有一个非常相似的问题: Windows batch file renames filename unexplainably in FOR loop

Peter Wright发布了一个解释非常好的解决方案:

  

尝试

     

for / f“delims =”%% a in('dir / b / a-d * .mp3')do(问题是   你的原始语法找到下一个文件名 - 找到你的   重命名文件,因为新文件名(带前缀)是逻辑上的   “大于”旧的。

     

使用dir构建文件名列表,并在列表处理后再处理   已完全构建 - 因此列表不会随文件而变化   重命名。

     

“delims =”子句确保文件名的默认解析   是无效的 - 否则,文件名将被解释为a   一系列[空格分隔]代币。

     

回答6月20日4:28 Peter Wright的回答

答案 2 :(得分:0)

IF EXIST条件将始终在重命名第一个文件后传递,因为写入时它将检查目录中是否存在任何文件,其中包含文件名中的“[H.264”,而不仅仅是%% a

咨询Batch file: Find if substring is in string (not in a file)以了解如何在%% a中找到“[H.264”,这会导致预期结果。