Board logo

标题: [文件操作] [已解决]批处理如何根据相同文件名的文本文件,重命名文件? [打印本页]

作者: idema    时间: 2011-1-24 13:59     标题: [已解决]批处理如何根据相同文件名的文本文件,重命名文件?

在同一路径下有一对文件名相同,后缀名不同的两个文件,如何根据其中一个可用文本打开的文件的内容,重命名另一文件。

例如在同一路径下有两个文件,其中一个是260407.mpg,另一个文件是260407.ksc
其中260407.ksc的内容如下:
karaoke := CreateKaraokeObject;
karaoke.internalnumber := 00000000;  // 歌曲编号
karaoke.rows := 2;
karaoke := CreateKaraokeObject;
karaoke.clear;

// 歌曲附加信息(便于检索)
karaoke.tag('歌名', '你说他是你想嫁的人');
karaoke.tag('缩写', 'NSTSNX');
karaoke.tag('歌手', '刘德华');
karaoke.tag('字数', '6');
karaoke.tag('语种', '国语');
karaoke.tag('歌类', '男');
karaoke.tag('电影', 'false');
karaoke.tag('风格', '流行');
karaoke.tag('流行', 'true');
karaoke.tag('音量', '130');
karaoke.tag('声道', '1');
karaoke.tag('FMP声道', '32');
karaoke.tag('语音', '0');
karaoke.tag('介质', '10');
karaoke.tag('时间', '2008-9-5');
karaoke.tag('歌星拼音', '');
karaoke.mtvmode :=true;
karaoke.videofilename := '';
karaoke.audiofilename := '*.wav';
karaoke.XSDVideoMode := 4;
karaoke.CommonVideo := '260407.mpg';

现要求根据260407.ksc中的歌手和歌名重命名260407.mpg,即将260407.mpg重命名为“刘德华-你说他是你想嫁的人.mpg”,而后修改260407.ksc中的最后一行,karaoke.CommonVideo := '260407.mpg'; 将其更改为karaoke.CommonVideo := '刘德华-你说他是你想嫁的人.mpg';  最后修改ksc文件,将260407.ksc修改为刘德华-你说他是你想嫁的人.ksc.

描述的比较繁琐,不知用批处理能否实现批量修改,敬请各位高手指教,多谢了

[ 本帖最后由 idema 于 2011-1-25 11:50 编辑 ]
作者: liion631818    时间: 2011-1-24 16:36     标题: 最好自己先备份,在实现下面脚本,避免给你造成损失

  1. @echo off&setlocal enabledelayedexpansion
  2. set countFile=0
  3. for /r %%i in (*.ksc) do (
  4. set curFilename=%%~ni
  5. call :renameFile
  6. set /a countFile+=1
  7. )
  8. goto :end
  9. :renameFile
  10. for /f "tokens=2,4 delims='" %%i in ('type !curFilename!.ksc') do (
  11. if "%%i"=="歌名" set "song=%%j"
  12. if "%%i"=="歌手" set "singer=%%j"
  13. set song=!song: =!
  14. set singer=!singer: =!
  15. )
  16. REM echo !song! !singer!
  17. :rname
  18. set "newname=!singer!-!song!.mpg"
  19. echo !newname!
  20. if exist !curFilename!.mpg rename !curFilename!.mpg !newname!
  21. :modify ksc file
  22. for /f "delims=" %%i in ('type !curFilename!.ksc') do (
  23. set "line=%%i"
  24. set line=!line:%curFilename%=%singer%-%song%!
  25. echo !line!>>!curFilename!_tmp.ksc
  26. )
  27. move /y !curFilename!_tmp.ksc !curFilename!.ksc
  28. goto :eof
  29. :end
  30. echo Modified !countFile! files
  31. pause
复制代码

[ 本帖最后由 liion631818 于 2011-1-24 17:31 编辑 ]
作者: 随风    时间: 2011-1-24 16:37

不知道是不是这个意思
某文件夹下后有很多对文件,(后缀名不同,文件名相同,都是ksc和mpg后缀),根据ksc文件内容改文件名和ksc内容最后一行
以下代码会删除原ksc文件,测试前先做好备份
代码未测试,有问题跟帖......
:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%n in (*.ksc) do (
  3.    set "str="&set "wjm=%%~nn"
  4.    for /f "usebackq delims=" %%i in ("!wjm!") do (
  5.       if defined str (>>tem echo !str!) else cd.>tem
  6.       set str=%%i
  7.       set var=!str:歌手=!
  8.       if not "!str!"=="!var!" (
  9.          for /f "tokens=4 delims='" %%a in ("!str!") do set gs=%%a
  10.        )
  11.       set var=!str:歌名=!
  12.       if not "!str!"=="!var!" (
  13.          for /f "tokens=4 delims='" %%a in ("!str!") do set gm=%%a
  14.        )
  15.     )
  16.     for /f "delims='" %%a in ("%str%") do >>tem echo %%a '%gs%-%gm%';
  17.     move "tem" "%gs%-%gm%.ksc"
  18.     ren "!wjm!.mpg" "%gs%-%gm%.mpg"
  19.     del /q "!wjm!.ksc"
  20. )
  21. pause
复制代码

作者: hanyeguxing    时间: 2011-1-24 16:50

1,批处理放到同目录下
2,.ksc 文件编码为 ANSI
3,未处理敏感字符问题
4,最后一行形如:karaoke.CommonVideo := 'XXXXXX.扩展名';
  1. @echo off&setlocal enabledelayedexpansion
  2. set .bat==&set .cmd==&set .ksc==
  3. for %%a in (*) do if not defined %%~xa if exist "%%~na.ksc" (
  4.         (for /f "tokens=1* delims=:" %%b in ('findstr /n .* "%%~na.ksc"') do (
  5.                 set "c=%%c"
  6.                 if "!c:~13,2!"=="歌手" set m=!c:~19,-3!
  7.                 if "!c:~13,2!"=="歌名" set n=!c:~19,-3!
  8.                 if "!c:~0,14!"=="karaoke.Common" set "c=karaoke.CommonVideo := '!m!-!n!%%~xa';"
  9.                 echo;!c!
  10.         ))>"!m!-!n!.ksc"
  11.         del "%%~na.ksc"
  12.         ren "%%a" "!m!-!n!%%~xa"
  13. )
复制代码

批处理搜索当前目录下所有非.bat、.cmd、.ksc文件,以文件名匹配.ksc文件,如果存在,则解析此ksc文件获取变量,并以变量修改此文件和.ksc文件的文件名

[ 本帖最后由 hanyeguxing 于 2011-1-24 16:58 编辑 ]
作者: tmplinshi    时间: 2011-1-24 21:01

  1. @echo off
  2. for /f "delims=" %%f in ('dir /a:-d /b *.ksc') do (
  3.     findstr /n .* "%%f" >.tmp
  4.     set -DelContent=
  5.     (for /f "delims=" %%a in (.tmp) do (
  6.         set var=%%a
  7.         if not defined -DelContent set -DelContent=. >.tmp
  8.         SetLocal EnableDelayedExpansion
  9.         if "!var:karaoke.tag('歌名=!" neq "!var!" >>.tmp echo 歌名=!var:*, '=!
  10.         if "!var:karaoke.tag('歌手=!" neq "!var!" >>.tmp echo 歌手=!var:*, '=!
  11.         if "!var:karaoke.CommonVideo :=!" neq "!var!" (
  12.             EndLocal
  13.             for /f "delims=" %%a in (.tmp) do set %%a
  14.             SetLocal EnableDelayedExpansion
  15.             >.tmp echo !歌手:~0,-3!-!歌名:~0,-3!
  16.             echo karaoke.CommonVideo := '!歌手:~0,-3!-!歌名:~0,-3!.mpg';
  17.         ) else echo,!var:*:=!
  18.         EndLocal
  19.     )) >"%%f"
  20.     for /f "delims=" %%a in (.tmp) do (
  21.         ren "%%f" "%%a.*"
  22.         ren "%%~dpnf.mpg" "%%a.*"
  23.     )
  24. )
  25. del .tmp
复制代码

[ 本帖最后由 tmplinshi 于 2011-1-24 21:06 编辑 ]
作者: idema    时间: 2011-1-25 10:31

首先十分感谢大家热心的帮忙,现将测试结果给大家汇报如下。

第一个liion631818的脚本,.mpg文件名可以按要求更改,.ksc文件中的文本内容可以更改,但是.ksc的文件名无法更改。CMD屏幕中不停循环如下信息

王菲-执迷不悔.mpg
那英-干脆.mpg
周华健-我试着假装.mpg
张国荣-风继续吹.mpg
张国荣-侬本多情.mpg
李双江-大阪城的姑娘.mpg
陈慧娴-飘.mpg
陈慧娴-傻女.mpg

无法中断
作者: idema    时间: 2011-1-25 10:59

第二个随风超版的脚本,运行报错,报错如下:

系统找不到文件 *.ksc。
请按任意键继续. . .

但是我很确认相同目录下有ksc和mpg文件
作者: idema    时间: 2011-1-25 11:11

第三个hanyeguxing版主的脚本,.mpg的文件名可以正常修改,.ksc里面的内容修改也正常,但是.ksc的文件名重命名不正确,例如:

karaoke.tag('歌名', '倩女幽魂');
karaoke.tag('缩写', 'QNYH');
karaoke.tag('歌手', '张国荣');
karaoke.tag('字数', '4');
karaoke.tag('语种', '粤语');
karaoke.tag('歌类', '男');
karaoke.tag('电影', 'false');
karaoke.tag('风格', '流行');
karaoke.tag('流行', 'true');
karaoke.tag('音量', '130');
karaoke.tag('声道', '2');
karaoke.tag('FMP声道', '32');
karaoke.tag('语音', '0');
karaoke.tag('介质', '10');
karaoke.tag('时间', '2008-9-5');
karaoke.tag('歌星拼音', '');
karaoke.mtvmode :=true;
karaoke.videofilename := '';
karaoke.audiofilename := '*.wav';
karaoke.XSDVideoMode := 4;
karaoke.CommonVideo := '张国荣-倩女幽魂.mpg';

应该命名为张国荣-倩女幽魂.ksc,可是却重命名为张国荣-爱慕.ksc

而张国荣-倩女幽魂.ksc里的内容却是:
karaoke.tag('歌名', '由零开始');
karaoke.tag('缩写', 'YLKS');
karaoke.tag('歌手', '张国荣');
karaoke.tag('字数', '4');
karaoke.tag('语种', '粤语');
karaoke.tag('歌类', '男');
karaoke.tag('电影', 'false');
karaoke.tag('风格', '流行');
karaoke.tag('流行', 'true');
karaoke.tag('音量', '130');
karaoke.tag('声道', '2');
karaoke.tag('FMP声道', '32');
karaoke.tag('语音', '0');
karaoke.tag('介质', '10');
karaoke.tag('时间', '2008-9-5');
karaoke.tag('歌星拼音', '');
karaoke.mtvmode :=true;
karaoke.videofilename := '';
karaoke.audiofilename := '*.wav';
karaoke.XSDVideoMode := 4;
karaoke.CommonVideo := '张国荣-由零开始.mpg';

感觉ksc文件的重命名有自动串行的嫌疑
作者: idema    时间: 2011-1-25 11:25

第四个tmplinshi版主的脚本,测试正常

.mpg和.ksc文件名可以正常修改,而且.ksc的内容也修改正常,测试通过




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2