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

[文件操作] [已解决]如何用rmevents批量过滤RM/RMVB内嵌广告并支持拖入窗口

RealPlayer 专有格式文件 RM/RMVB 常常会被植入恶意网址,危害用户的计算机安全。

rmevents.exe 是 Real 官方制作工具里的一个命令行工具,执行速度非常快,可轻松清除电影文件里的广告信息(实质是剪辑信息,可以在指定时间打开指定的窗口)。
网上那些过滤工具实际上是这个程序的GUI,只是我用了几个都不满意,所以想用批处理或者VBS实现。

rmevents.exe 所支持的命令格式为:
rmevents -i input.rm -e events.txt -o output.rm
rmevents -i input.rmvb -e events.txt -o output.rmvb

注:input.rm*为源文件,output.rm*为输出文件;
events.txt 是空白的文本,写入电影文件里可以覆盖原有的剪辑信息,可达到去广告的目的。

要求:
1、同时支持 *.rm 和 *.rmvb 两种格式,先判断后处理;
2、支持从不同目录拖放到命令行窗口,可连续拖放;
3、新文件名=原文件名_OK,形如“无间道
_OK.rm”,已经处理过的就忽略;
4、自动保存在源文件所在目录(也可以统一放到某个目录);
5、如果新文件体积等于源文件(以MB为单位),算转换成功,就删除原文件。



======
附上 最新11.1版的rmevents.exe
MD5: ee2dbf64e3fc8791ac31b18e7be92da3

多杀毒引擎扫描的结果(0/41):
http://www.virustotal.com/file-s ... 16c4b241-1282420709

[ 本帖最后由 aries215 于 2010-8-26 22:13 编辑 ]

回复 15楼 的帖子

辛苦了!你很热心,也很谦虚!

TOP

终于是解决空格的问题了...终于...

TOP

\(^o^)/~

测试过没问题了,而且这次的 cls 处理的比较舒服,很满意!
非常感谢 TX_kakashi !!!

TOP

现在应该对空格免疫了....

TOP

这么早啊,辛苦了!
试了一下,好像还是有问题,文件名带有空格的还是无法转换,一回车窗口就消失了。
楼上试一下这样的文件名 “一寸河山一寸血 42集 大陆禁片.rm”

[ 本帖最后由 aries215 于 2010-8-26 23:18 编辑 ]

TOP

麻烦lz再实验下9楼更新后的代码 =)

TOP

不懂,加了冒号还是这样,加引号窗口也会消失掉!

我想看到rmevents反馈信息,保留显示转换了百分几感觉更直观,这是个人喜好,呵呵!

[ 本帖最后由 aries215 于 2010-8-26 00:02 编辑 ]

TOP

这空格真是个问题啊...又做了修改.
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%z in ('dir/b/s/a-d rmevents.exe') do set rmevents="%%z"
  3. title %date%
  4. :bof
  5. set result=Error
  6. set/p "theFile=[拖动文件到此]:"
  7. if not exist %theFile% goto bof
  8. cls&&call :eventEdit %theFile%
  9. echo.
  10. title %date%
  11. if {%result%}=={unknown} goto mainEnd
  12. if {%result%}=={Error} goto mainEnd
  13. if {%result%}=={Edited} echo ["%theFile%"]&&echo --^>[已经被修改过.]&&goto mainEnd
  14. if {%result%}=={Existed} echo ["%theFile%"]&&echo --^>[已经被修改过,且目标文件已存在.]&&goto mainEnd
  15. :delOptLP
  16. set/p delOpt=[是否要删除源文件(y/n)?]:
  17. if {%delOpt%}=={y} del/q %theFile%&&echo 删除文件[%theFile%]&&goto mainEnd
  18. if {%delOpt%}=={n} goto mainEnd
  19. goto delOptLP
  20. :mainEnd
  21. echo.&echo.
  22. pause
  23. cls
  24. goto bof
  25. :eventEdit
  26. for /f "delims=" %%c in ("%~1") do set "fName=%%~nc"&&set "fPath=%%~dpc"&&set "fExt=%%~xc"
  27. if "%fName:~-3,3%"=="_OK" echo -[Skipd]- ["%fName%%fExt%"]&&set result=Edited&&goto eventDone
  28. if exist "%fPath%%fName%_OK%fExt%" echo -[Skipd]- ["%fName%%fExt%"]&&set result=Existed&&goto eventDone
  29. if {%fExt%}=={.rmvb} goto startEdit
  30. if {%fExt%}=={.rm} goto startEdit
  31. echo [UNKNOWED FILE EXTENSION.]
  32. set result=unknown
  33. goto eventDone
  34. :startEdit
  35. title ["%fName%%fExt%"]-^>["%fName%_OK%fExt%"],plz wait.
  36. cd.>events.txt
  37. %rmevents% -i "%~1" -e events.txt -o "%fPath%%fName%_OK%fExt%"
  38. del/q events.txt>nul 2>nul
  39. call :check "%~1" "%fPath%%fName%_OK%fExt%"
  40. echo -[%result%]- ["%fName%%fExt%"]
  41. :eventDone
  42. exit/b
  43. :check
  44. set sizeDiff=0
  45. for /f "delims=" %%d in ("%~1") do set oldSize=%%~zd
  46. for /f "delims=" %%e in ("%~2") do set newSize=%%~ze
  47. if %oldSize% geq %newSize% (
  48.   set /a sizeDiff=%oldSize%-%newSize%
  49.    ) else (
  50.   set /a sizeDiff=%newSize%-%oldSize%
  51.    )
  52. if %sizeDiff% geq 2000000 (
  53.   del/q "%~2"&&set result=Error
  54.    )else (
  55.   set result=Done
  56.    )
  57. exit/b
复制代码

[ 本帖最后由 TX_kakashi 于 2010-8-26 14:07 编辑 ]

TOP

还比较满意!

路径带空格的话,按回车后窗口立刻消失。
就使用感受而言,可以去掉“Pause”;觉得个别“CLS”也不必要,转换的信息才几行而且值得一看。不知道你认为如何?

[ 本帖最后由 aries215 于 2010-8-25 22:57 编辑 ]

TOP

哈哈!高兴死了~

看完描述,要的就是这个样子!非常感谢!!
复制下来试试~

[ 本帖最后由 aries215 于 2010-8-25 22:26 编辑 ]

TOP

编辑掉,代码都放9楼了

[ 本帖最后由 TX_kakashi 于 2010-8-26 14:11 编辑 ]

TOP

你能抽空帮忙解决问题,我非常感激!你二楼写的代码已经可以满足日常要求了,上面说的不妥的地方请原谅~

对于体积问题,数学上用 |A-B|<1(KB) 就很简单,但是批处理怎样表达是个问题,可能要用两条等式判断,A-B<1(KB) 或 B-A<1(KB),满足其中一个条件就成立。

实际转换的话,以2MB作为判断标准是不行的,我原先就以为文件体积大于1MB就可以了,之所以提出判断两者体积是否相同的问题,是因为我事实上看到有个电影文件只转换了13%就停止了,生成9MB的新文件,明显小于源文件的69MB,大于2MB就删除可能会误删源文件。有些电影文件是损坏的,随时可能中断,具体多少实在没办法预计。你说导入空白事件之后体积增大,那我觉得比较合理的判断标准应该是新旧文件之间的体积相差小于5KB就是OK的,不管谁大谁小。

我建议不要搜索下级文件夹,就处理拖入目标就行了。

我发现当初那个在文件开头添加“OK”的建议不是很好,应该在文件名的末尾添加才好,这样我们以文件名排序的时候,源文件和新文件就能显示在一起,即使文件很多、名字相似度比较高 也不会搞不清对应关系了!新旧文件可以相邻显示的话,一眼就看出两者体积的差异,对于是否要让批处理判断就显得不那么迫切了。

辛苦了!

[ 本帖最后由 aries215 于 2010-8-25 22:25 编辑 ]

TOP

编辑掉
字数补丁.cmd

[ 本帖最后由 TX_kakashi 于 2010-8-26 14:10 编辑 ]

TOP

谢谢楼上热心帮助!

真是缺少组件,版本也要对应的,已经补上了,请重新下载!

试了一下你的代码,可用,觉得还可以继续完善:
1、没有判断后缀,我把MP3拖进去也能进入转换流程,如果小心一点不会选错文件,但有这功能就更好了;
2、生成文件命令缺少双引号,路径和文件名带空格就会出错。可以去掉那个多余的点号;
3、增加判断已经处理过的(末尾带有n个OK)就忽略;


另外,由于插入的广告信息通常不大于2KB,怎么判断两个文件大小相同时(必须是MB)然后删除源文件?否则占用空间翻一倍。有的电影文件只可转换一部分,新文件体积大于1MB,但是明显小于原文件,所以要求MB数值相同才算转换成功,否则就删除新文件。如果最后再提示那些文件没转换成功就更好了。

我自己也试弄了一份,但是不懂多层嵌套和调用,功能很少,拖进去之后不是只转换目标文件,而是该目录所有RM/RMVB都会转换,同样也没有判断大小的功能:
@ECHO OFF
cd.>>events.txt
:start
echo.
set /p file=拖入:
for %%i in (%file%) do (
        for %%i in (*.rm,*.rmvb) do (
                rmevents -i %%i -e events.txt -o "%%~dpiOK%%~nxi"
                )
)
goto :start


批处理大小比较使用英文字符:
EQU - equal
NEQ - not equal
LSS - less than
LEQ - less than or equal
GTR - greater than
GEQ - greater than or equal

比较公式: if "str1" equ "str2" dosomthing

[ 本帖最后由 aries215 于 2010-8-26 22:16 编辑 ]

TOP

返回列表