找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 11523|回复: 9

[文件操作] 【已解决】求助批处理按同名文本里的内容对MP4重命名

[复制链接]
发表于 2025-1-28 22:32:23 | 显示全部楼层 |阅读模式
具体情况:
      1、在文件夹内许多的MP4,有对应的同名文本文件。
      2、同名文本内只有一行文字。
      
目的:
      1、同名MP4按同名文本内的文字内容进行重命名。
           1.1 文字内容如果含非法字符,无法按其重命名时,该MP4在原名后面加“-重命名失败”以标示。
                 文字内容应该不会超长,所以可以不考虑此情形对重命名的影响。
           1.2 如果目录内已存在同新名的MP4,则该MP4在新名后面加“(1)”等以标示。
      2、如果某MP4没有同名的文本文件,则跳过。
           如果某文本文件没有同名MP4,也跳过(不用理会)。

例如:文件夹内有“123春天.mp4”、“123春天.txt”文件,而“123春天.txt”里的内容为“今天天气非常好”。
         经批处理运行后,“123春天.mp4”重命名为“今天天气非常好.mp4”。
         


请高手帮忙一个!
谢谢!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2025-1-28 22:48:04 | 显示全部楼层
同名文本文件的编码是啥??
 楼主| 发表于 2025-1-28 22:52:26 | 显示全部楼层
回复 2# Five66

记事本打开后,显示是UTF-8
发表于 2025-1-29 00:46:10 | 显示全部楼层
回复 1# annwayili

以下代码须用 utf-8 编码存为 test.bat 运行,假设代码运行前当前目录中还没有名如 *(n).mp4 的文件(n=1,2,3,...)

  1. @echo off &chcp 65001>nul &setlocal
  2. for %%F in (*.mp4) do if exist "%%~nF.txt" (
  3.    set "s=" &set/p s=<"%%~nF.txt" &setlocal enabledelayedexpansion
  4.    if exist "!s!%%~xF" (ren "%%F" "!s!(1)%%~xF") else ren "%%F" "!s!%%~xF"
  5.    if exist "%%F" ren "%%F" "%%~nF-重命名失败%%~xF"
  6.    endlocal) 2>nul
  7. pause&exit/b
复制代码
 楼主| 发表于 2025-1-29 05:41:56 | 显示全部楼层
本帖最后由 annwayili 于 2025-1-29 05:42 编辑

回复 4# aloha20200628


测试了,似乎不怎么完美。
如下图,我一共用7组文件测试,出现了三个不成功的例子。

无论如何,非常感谢出手相助!!

发表于 2025-1-29 08:16:26 | 显示全部楼层
不知行否 , 使用前先测试 ,测试前先备份
保存为ansi编码的bat 放到mp4所在文件夹下运行
同名文本文件需要为无bom的utf-8

  1. @echo off&pause&chcp 936 >nul
  2. set "_@@fail=-重命名失败"
  3. set "_z=("
  4. set "_y=)"

  5. chcp 65001>nul
  6. for /f "eol=/ delims=" %%a in ('dir /b "*.mp4"') do (
  7. set "_@@oldname=%%a"
  8. set "A_ext=%%~xa"
  9. if exist "%%~na.txt" (
  10. for /f "delims="eol^= %%b in ('type "%%~na.txt"') do (
  11. for /f tokens^=1^ delims^="/\<>|:?*" %%i in ("%%b") do (
  12. if "%%i" == "%%b" (
  13. set "_@@new=%%i"
  14. set /a @@=0
  15. call :aaa
  16. ) else (
  17. set "_@@new=%%~na%_@@fail%"
  18. set /a @@=0
  19. call :aaa
  20. )))))
  21. pause&exit/b

  22. :aaa
  23. set /a @@+=1
  24. if exist "%_@@new%%A_ext%" (
  25. set "_@@new=%_@@new%%_z%%@@%%_y%"
  26. goto :aaa
  27. )
  28. rename "%_@@oldname%" "%_@@new%%A_ext%"
  29. goto :eof
复制代码

评分

参与人数 2技术 +2 收起 理由
annwayili + 1 感谢帮助!
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2025-1-29 09:01:59 | 显示全部楼层
本帖最后由 annwayili 于 2025-1-29 09:13 编辑

回复 6# Five66



谢谢帮助!
测试通过!


~~只是双击BAT运行时,一下子被窗口里的提示“请按任意键继续”迷惑了,还以为没效果。
     后来按了一下键盘,才知道此时才开始重命名

如果双击BAT运行就开始重命名,个人以为就更好了~~
发表于 2025-1-29 11:00:48 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-1-29 11:03 编辑

回复 5# annwayili

   大年初一拜完年抽空给楼主回个帖   ...
   根据5楼附图中的红圈结果推断4楼代码中的 set/p ... 读取文本文件首行时撞上了空行,故其返回值为空值... (仍须楼主确认),如属实,删除对应文本文件中的第一个空行就是了
   或改用以下有防空读取对策的代码(须用utf-8编码存盘)再试试

  1. @echo off &chcp 65001>nul &setlocal
  2. for %%F in (*.mp4) do if exist "%%~nF.txt" (
  3.    for /f "tokens=1* delims=:" %%a in ('findstr /v "^$" "%%~nF.txt"^|findstr /n ".*"^|findstr /b "1:" ') do set "s=%%b"
  4.    setlocal enabledelayedexpansion
  5.    if exist "!s!%%~xF" (ren "%%F" "!s!(1)%%~xF") else ren "%%F" "!s!%%~xF"
  6.    if exist "%%F" ren "%%F" "%%~nF-重命名失败%%~xF"
  7.    endlocal) 2>nul
  8. pause&exit/b
复制代码

评分

参与人数 2技术 +2 收起 理由
annwayili + 1 感谢帮助!
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2025-1-29 15:19:50 | 显示全部楼层
回复 8# aloha20200628


    感谢帮助!
   
    原文件在处理后已经删除了,所以这次没法试了。下次有机会再试试。
    不过,应该不会前面有空行。详见我截图右侧的TXT文本,当时特意贴上去的。
发表于 2025-1-29 18:45:57 | 显示全部楼层
回复 7# annwayili


   
加上暂停是为了防手误
将6楼代码第一行那里的&pause去掉就能直接开始了
还有同名文本文件没有处理多行的情况 , 多行时可能重复改名(虽然改不了)
也没有处理开头的英文空格 , 可能改出开头带英文空格的文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:25 , Processed in 0.028806 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表