标题: [文件操作] [已解决]如何用rmevents批量过滤RM/RMVB内嵌广告并支持拖入窗口 [打印本页]
作者: aries215 时间: 2010-8-22 17:55 标题: [已解决]如何用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 编辑 ]
作者: TX_kakashi 时间: 2010-8-23 14:41
少个dll用不了,麻烦lz再上传下。- @echo off&setlocal&cls
- :bof
- set/p theFile=[拖动文件到此]
- if not exist %theFile% goto bof
- call :myEdit %theFile%
- goto bof
-
- :myEdit
- for /f "delims=" %%I in ("%~1") do set fPath=%%~dpI&&set type=%%~xI&&set fName=%%~nI
- cd.>events.txt
- rmevents -i "%~1" -e events.txt -o %fPath%OK%fName%.%type%
- del events.txt
- exit/b
复制代码
作者: aries215 时间: 2010-8-24 00:09 标题: 谢谢楼上热心帮助!
真是缺少组件,版本也要对应的,已经补上了,请重新下载!
试了一下你的代码,可用,觉得还可以继续完善:
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 编辑 ]
作者: TX_kakashi 时间: 2010-8-24 22:45
编辑掉
字数补丁.cmd
[ 本帖最后由 TX_kakashi 于 2010-8-26 14:10 编辑 ]
作者: aries215 时间: 2010-8-25 04:57
你能抽空帮忙解决问题,我非常感激!你二楼写的代码已经可以满足日常要求了,上面说的不妥的地方请原谅~
对于体积问题,数学上用 |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 编辑 ]
作者: TX_kakashi 时间: 2010-8-25 21:40
编辑掉,代码都放9楼了
[ 本帖最后由 TX_kakashi 于 2010-8-26 14:11 编辑 ]
作者: aries215 时间: 2010-8-25 22:23 标题: 哈哈!高兴死了~
看完描述,要的就是这个样子!非常感谢!!
复制下来试试~
[ 本帖最后由 aries215 于 2010-8-25 22:26 编辑 ]
作者: aries215 时间: 2010-8-25 22:50 标题: 还比较满意!
路径带空格的话,按回车后窗口立刻消失。
就使用感受而言,可以去掉“Pause”;觉得个别“CLS”也不必要,转换的信息才几行而且值得一看。不知道你认为如何?
[ 本帖最后由 aries215 于 2010-8-25 22:57 编辑 ]
作者: TX_kakashi 时间: 2010-8-25 22:58
这空格真是个问题啊...又做了修改.- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%z in ('dir/b/s/a-d rmevents.exe') do set rmevents="%%z"
- title %date%
- :bof
- set result=Error
- set/p "theFile=[拖动文件到此]:"
- if not exist %theFile% goto bof
- cls&&call :eventEdit %theFile%
- echo.
- title %date%
- if {%result%}=={unknown} goto mainEnd
- if {%result%}=={Error} goto mainEnd
- if {%result%}=={Edited} echo ["%theFile%"]&&echo --^>[已经被修改过.]&&goto mainEnd
- if {%result%}=={Existed} echo ["%theFile%"]&&echo --^>[已经被修改过,且目标文件已存在.]&&goto mainEnd
- :delOptLP
- set/p delOpt=[是否要删除源文件(y/n)?]:
- if {%delOpt%}=={y} del/q %theFile%&&echo 删除文件[%theFile%]&&goto mainEnd
- if {%delOpt%}=={n} goto mainEnd
- goto delOptLP
- :mainEnd
- echo.&echo.
- pause
- cls
- goto bof
- :eventEdit
- for /f "delims=" %%c in ("%~1") do set "fName=%%~nc"&&set "fPath=%%~dpc"&&set "fExt=%%~xc"
- if "%fName:~-3,3%"=="_OK" echo -[Skipd]- ["%fName%%fExt%"]&&set result=Edited&&goto eventDone
- if exist "%fPath%%fName%_OK%fExt%" echo -[Skipd]- ["%fName%%fExt%"]&&set result=Existed&&goto eventDone
- if {%fExt%}=={.rmvb} goto startEdit
- if {%fExt%}=={.rm} goto startEdit
- echo [UNKNOWED FILE EXTENSION.]
- set result=unknown
- goto eventDone
- :startEdit
- title ["%fName%%fExt%"]-^>["%fName%_OK%fExt%"],plz wait.
- cd.>events.txt
- %rmevents% -i "%~1" -e events.txt -o "%fPath%%fName%_OK%fExt%"
- del/q events.txt>nul 2>nul
- call :check "%~1" "%fPath%%fName%_OK%fExt%"
- echo -[%result%]- ["%fName%%fExt%"]
- :eventDone
- exit/b
- :check
- set sizeDiff=0
- for /f "delims=" %%d in ("%~1") do set oldSize=%%~zd
- for /f "delims=" %%e in ("%~2") do set newSize=%%~ze
- if %oldSize% geq %newSize% (
- set /a sizeDiff=%oldSize%-%newSize%
- ) else (
- set /a sizeDiff=%newSize%-%oldSize%
- )
- if %sizeDiff% geq 2000000 (
- del/q "%~2"&&set result=Error
- )else (
- set result=Done
- )
- exit/b
复制代码
[ 本帖最后由 TX_kakashi 于 2010-8-26 14:07 编辑 ]
作者: aries215 时间: 2010-8-25 23:36
不懂,加了冒号还是这样,加引号窗口也会消失掉!
我想看到rmevents反馈信息,保留显示转换了百分几感觉更直观,这是个人喜好,呵呵!
[ 本帖最后由 aries215 于 2010-8-26 00:02 编辑 ]
作者: TX_kakashi 时间: 2010-8-26 09:01
麻烦lz再实验下9楼更新后的代码 =)
作者: aries215 时间: 2010-8-26 11:04
这么早啊,辛苦了!
试了一下,好像还是有问题,文件名带有空格的还是无法转换,一回车窗口就消失了。
楼上试一下这样的文件名 “一寸河山一寸血 42集 大陆禁片.rm”
[ 本帖最后由 aries215 于 2010-8-26 23:18 编辑 ]
作者: TX_kakashi 时间: 2010-8-26 14:14
现在应该对空格免疫了....
作者: aries215 时间: 2010-8-26 22:11 标题: \(^o^)/~
测试过没问题了,而且这次的 cls 处理的比较舒服,很满意!
非常感谢 TX_kakashi !!!
作者: TX_kakashi 时间: 2010-8-26 22:58
终于是解决空格的问题了...终于...
作者: aries215 时间: 2010-8-26 23:20 标题: 回复 15楼 的帖子
辛苦了!你很热心,也很谦虚!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |