tmdtmdtmdqq 发表于 2023-2-18 23:14:12

【工具】删除ass字幕中Aegisub-Motion插件(Mocha配套工具)生成的标签({=1}之类的标签)

之前遇到有人说字幕中Aegisub-Motion插件(Mocha配套工具)生成的{=1}、之类的标签会导致播放时候报错
所以写了个脚本去处理掉这种类标签


直接把字幕拖进脚本图标即可,支持多个文件一起拖入
也可以双击打开,输入路径(双击打开只支持单个文件的路径输入)
带字幕备份功能。不需要备份功能的话,就把第7行的 set "backupFlag=1" 改为 set "backupFlag=0" 即可

文件名字如果有特殊符号可能会报错,暂时没遇到
只在简中的Win10测试过,理论支持Win7及以上系统(需要powershell的命令,Win7及以上系统默认自带)

如果其他语言的操作系统显示乱码不能执行的,估计是脚本文件的编码问题
可以新建一个文本文件,用高级文档软件打开脚本,把脚本代码贴进去刚才新建的文本文件保存,改.txt后缀为.bat




菜姬 发表于 2023-2-19 14:36:08

可以考虑用 lua 写,然后集成到 Aegisub 里(

BTTL 发表于 2023-2-19 14:55:09

楼上说的有理,写成插件放到 include 文件夹要方便点
不过还是辛苦楼主了

Yukarubih 发表于 2023-2-19 23:06:39

本帖最后由 Yukarubih 于 2023-2-19 23:19 编辑

大佬,你的 call 命令太帅了!
看了代码之后,我有几个关于命令的疑问想要请教:

批处理:
call :processing
if !ERRORLEVEL! EQU 0
goto end
exit /b 1
exit /b 0

powershell:
powershell -Command


首先是 call,因为看了批处理之家的某帖子,之后在「一日一教学」中导致我跳过了这个命令。
 call :processing
 if !ERRORLEVEL! EQU 0 (
这里,call 之后为什么使用 %errorlevel% 检查返回码?难道 call 执行后也有返回码吗?还是在检查 call 调用的内部函数是否执行成功的返回码?

 goto end
我对他的了解也只有“跳转的印象”,借此机会想彻底摸清他的使用方法&注意点。

 exit /b
「一日一教学」中说 exit /b 是用来退出子函数的,但没有提及这样的用法“exit /b 1/exit /b 0”。
-------------------------

我所使用的命令大多是简单的 for,但是在看完大佬的代码之后,发现 call 更加简洁方便。
完全可以提前设置一堆函数丢到脚本底部,然后根据需要 call→call→call→call→call。
直接看前面的几行 call 命令就可以了解大体的处理流程。
所以才想走捷径,请教大佬您长期累积下来的使用经验&心得。
(call 和 for 一起使用的注意点)

-------------------------

因为我完全不会写脚本代码,能够写脚本都是基于我把查到的命令全部注释化并制作成示例脚本,
累积下来,需要什么功能就提取哪个示例的代码,所以离开注释后就完全无法调用代码了。





示例 (添加拒绝写入权限):
icacls "C:\Program Files (x86)\Tencent\TGuard" /deny Everyone:W /T
rem icacls:权限操作。/deny Everyone:W:添加拒绝写入的权限;/deny 拒绝,Everyone 所有用户,W 写入权限,/T 此文件夹、子文件夹、文件。

这里上传一个 ImageMagick 图片转换的脚本,让大佬了解一下小白注释风格的脚本。
(注释来源于当时的主观感受和网络资料,不一定准确)
(当时找不到完美的 avif 转换工具,发现 ImageMagick 之后就研究命令行参数制作了这个脚本)


———————————————————————

最后是 powershell -Command 命令
由于我没有收集 powershell 的实例,所以无法解读命令。
(每个字符都读不懂,就看懂了常用的 -Encoding utf8 “输出文件编码为 utf-8”)

powershell -Command "$t=::Escape(\"!fileFullPath!\"); (gc -Raw $t) -creplace '%removeTagsPattern%', ',' -creplace '(?s)%removeSectionPattern%', '' | Out-File $t -Encoding utf8"
不过这些都不重要,
重要的是不借助第三方工具只用批处理完成「正则替换文件内容」。

目前我是借助 wfr (wide find - replace)、EmEditor 这些第三方工具来替换文件内容。
但是在一些简单的场景也要调用第三方工具很是不方便,放到笔记本上用还需打包程序才能让批处理正常运行。
所以希望大佬解释一下这条命令,尽量每个字符都写上注释。
(感激涕零。因为在批处理里每个符号都有作用,像 "&、|..." )

rem "%EmEditor%" "%PotPlayer%" /fc "\(\r\n|\r|\n)(+=.*(\r\n|\r|\n))+" /x/rw "\\r\n" /bk "%EmEditor备份目录%"   

"%EmEditor%" "%PotPlayer%" /fc "\(\r\n|\r|\n)(+=.*(\r\n|\r|\n))+" /x/rw "\\r\n"   
if %errorlevel% == 0 (echo,返回码:%errorlevel%,匹配成功> nul) else (echo,返回码:%errorlevel%(匹配失败,请排查!)&color 4&echo,&pause&exit)

rem EmEditor:正则替换,虽然程序内匹配多行必须开启"循环"+"搜索正则附加行",但是命令行默认支持匹配多行模式。
(完美解决了 wfr 不支持 Utf-8 特殊字符、韩语字的问题)            
rem /rc:打开文件并执行替换 (显示窗口,不保存)。/fc:在文件中查找 (不显示窗口,直接替换退出),区分大小写。
/x:启用正则表达式。/rw:指定替换的字符串。/bk "BackupFolder":指定一个备份文件夹当在文件中替换时。
/fu "_*;*.bak":忽略 "_*;*.bak" 文件。         
rem /cp 65536:系统默认编码,Unicode编码吗?,(65537:UTF-16LE、65001:UTF-8)。
/cp Encoding:设定一个用来打开的编码,数值组合:131072 检测 Unicode 签名 (BOM)、262144 检测 UTF-8、
524288 检测 HTML/XML 字符集、1048576 检测所有编码。      

rem 程序内的配置文件“eeCommon.ini”      
rem FindFlag=0x0000000000000181:开启循环(匹配多行,其他如"显示匹配数", "仅在选择区匹配"的开关也在这条参数内)         rem LinesSearch=100:多行匹配的行数限制,搜索正则表达式的附加行(L),设置为100,就只能匹配满足正则的100行,值越大需要耗费的时间越长。            

大佬若是不方便也没事,以后我再慢慢查询,慢慢精进。
(遇见大佬不容易,不能放过提问机会)



tmdtmdtmdqq 发表于 2023-2-20 02:37:03

Yukarubih 发表于 2023-2-19 23:06
大佬,你的 call 命令太帅了!
看了代码之后,我有几个关于命令的疑问想要请教:


下面的回答按我理解,不一定对

首先是 call,因为看了批处理之家的某帖子,之后在「一日一教学」中导致我跳过了这个命令。
 call :processing
 if !ERRORLEVEL! EQU 0 (
这里,call 之后为什么使用 %errorlevel% 检查返回码?难道 call 执行后也有返回码吗?还是在检查 call 调用的内部函数是否执行成功的返回码?

脚本运行过程中有出错判断,出错的时候我本意是让整个脚本停止
测试发现,调用call的过程中直接goto到end不行,直接不带参数的exit会导致整个窗口关掉,我输出的报错信息你就看不到了
所以我调了个带参数值的exit,然后后面用!ERRORLEVEL!来判断返回值。for过程要用延迟变量!ERRORLEVEL!,不能用%ERRORLEVEL%

脚本最后调用 pause>nul 也是防止处理完后就立马把整个窗口结束掉(处理过程很快),让人看不到输出的信息



不明白的指令可以直接在命令行中输入 <指令> /? 查看,比如:
exit /?

退出 CMD.EXE 程序(命令解释器)或当前批处理脚本。

EXIT

/B          指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个
            批处理脚本外执行,则会退出 CMD.EXE

exitCode    指定一个数字号码。如果指定了 /B,将 ERRORLEVEL
            设成那个数字。如果退出 CMD.EXE,则用那个数字设置
            过程退出代码。
用for的过程中,一般都要用延迟变量 !xxxxx! ,不然会遇到各种奇怪的问题
脚本前头加一行 setlocal enabledelayedexpansion 开启延迟变量模式




因为我完全不会写脚本代码,能够写脚本都是基于我把查到的命令全部注释化并制作成示例脚本,
累积下来,需要什么功能就提取哪个示例的代码,所以离开注释后就完全无法调用代码了。
能抄就抄吧,有现成的为何不用现成的,还要自己花时间造轮子?{:4_684:}
但是如果你要公开的话,最好说明清楚抄哪的,防止被别人追过来
我的脚本也是套模板改的。起初也是别人的脚本,改着改着就完全不一样了,形成了自己的模板
命令行的用法我也没记住太多,要用时候看一下文档说明,然后测试一下就好了。
收藏几个你觉得好用的文档说明网站就好。





最后是 powershell -Command 命令
由于我没有收集 powershell 的实例,所以无法解读命令。
powershell我也不熟,现学现做的
命令行去处理正则比较麻烦,对正则支持较弱,高级一点的用法都不支持,还有你说的符号转义也十分麻烦。
百度一下用powershell用正则处理文本,发现挺方便,就用powershell了
我简单说一下功能:

$t=::Escape("!fileFullPath!");      -- 特殊符号转义,防止路径有某些特殊符号导致出错
(gc -Raw $t)      -- Get-Content的简写,读取文件按行处理,-Raw使整个文件当一行来输入,因为我后面要用正则匹配多行
-creplace"xxxx", "yyyy"      -- 区分大小写的(Casesensitive)正则替换,不区分的话用-replace,将xxxx替换成yyyy
Out-File $t -Encoding utf8          -- 用utf-8格式输出到文件

在powershell中(命令行输入powershell),
输入help <指令>(例如:help get-content)就能看到简单的帮助,然后去帮助提示的微软页面链接就能看到详细的指令用法。



平时弄字幕时候我一般是在WSL(Windows Sub Linux)上用linux的grep和sed指令去查询和替换多个文件的文本的。
只是做成工具方便其他人使用才会去搞批处理(不用安装,性能能接受,文件细小,也不会有多余的东西)。
能简单地用批处理解决的小问题,我就不去编程写程序来处理了。





Yukarubih 发表于 2023-2-22 04:32:45

tmdtmdtmdqq 发表于 2023-2-20 02:37
下面的回答按我理解,不一定对




原来如此,
好的,之后有时间我再利用大佬的脚本&注释制作几个示例以备后需。(先收藏)

exit /b 0 感觉好深奥
好想玩 call 的命令,我还是第一次看见脚本这样运行

感谢楼主的回复
(居然是在大半夜!!!)
页: [1]
查看完整版本: 【工具】删除ass字幕中Aegisub-Motion插件(Mocha配套工具)生成的标签({=1}之类的标签)