[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

具体情况:
      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”。
         


请高手帮忙一个!
谢谢!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

同名文本文件的编码是啥??

TOP

回复 2# Five66

记事本打开后,显示是UTF-8

TOP

回复 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
复制代码

TOP

本帖最后由 annwayili 于 2025-1-29 05:42 编辑

回复 4# aloha20200628


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

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

TOP

不知行否 , 使用前先测试 ,测试前先备份
保存为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

评分人数

TOP

本帖最后由 annwayili 于 2025-1-29 09:13 编辑

回复 6# Five66



谢谢帮助!
测试通过!


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

如果双击BAT运行就开始重命名,个人以为就更好了~~

TOP

本帖最后由 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

评分人数

TOP

回复 8# aloha20200628


    感谢帮助!
   
    原文件在处理后已经删除了,所以这次没法试了。下次有机会再试试。
    不过,应该不会前面有空行。详见我截图右侧的TXT文本,当时特意贴上去的。

TOP

回复 7# annwayili


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

TOP

返回列表