4

我想根据视频文件的分辨率重命名我的视频文件,例如,对于 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"))

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

4

3 回答 3

4

这个问题超出了 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
)

输出示例:

重命名“Handbrake.0.9.8.mp4”“Handbrake.0.9.8 [H.264 800p].mp4”
重命名“Hybrid.2012.10.21.1.mp4”“Hybrid.2012.10.21.1 [H.264 800p].mp4”
重命名“Womble.mp4”“Womble [H.264 1080p].mp4”
于 2013-06-23T08:16:49.560 回答
1

这里有一个非常相似的问题: Windows批处理文件在FOR循环中无法解释地重命名文件名

Peter Wright 发布了一个解决方案,并给出了很好的解释:

尝试

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

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

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

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

于 2013-06-23T08:15:20.623 回答
0

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

查阅批处理文件:查找子字符串是否在字符串中(不在文件中)以了解如何在 %%a 中查找“[H.264”,这将导致预期的结果。

于 2013-06-23T07:43:09.793 回答