公司的电脑使用cobian backup 11 备份资料, 但不幸的是, 备份的资料需要包含主机的资料夹权限, 在win7/win10 会发生部份权限的怪异事件, 也就是某些资料夹竟然无法由 cobian backup 自动删除 (拒绝存取), 只知道确实是权限安全性造成的, 也找不出原因. 如果是用档案总管删除, 是正常可删除. 所以才想到要做一个批次档来把 log 记录中有"无法删除资料夹" 的资料路径截取出来, 再用指令去删除资料夹的构想.
cobain backup的错误讯息範例:ERR 2020-06-29 18:58 无法删除资料夹『E:\04_资料查询区\402_ISO 程序书、SOP(品保)\ISO 9001 品质手册 & 程序书\品保-程序书\程序书』:存取被拒。
很久没用进阶的指令了, 一开始吃了些苦头, 也上网找了很多範例, 大多是在讲语法, 不然就是有人建议用 powersshell, 我也知道 vbs 有更大的弹性, 但在公司也没太多时间去研究, 于是花了两个工作天, 做出我要的结果, 其中最烧脑的部份, 就是要在一串不固定长度字串中截取我要的字串, 幸好log还有规则, 方便我作业, 不然就只好真真实实的写程式了
要在一串不固定长度字串中截取我要的字串ERR 2020-06-29 18:58 无法删除资料夹『E:\04_资料查询区\402_ISO 程序书、SOP(品保)\ISO 9001 品质手册 & 程序书\品保-程序书\程序书』:存取被拒。变成E:\04_资料查询区\402_ISO 程序书、SOP(品保)\ISO 9001 品质手册 & 程序书\品保-程序书\程序书
好不容易想通了 for delims 的用途 (年纪大思绪反应果然有差)
幸好log字串还有规则for /F "tokens=1,2,3 delims=『』"
在初期测试时一直失败, 批次档完全无法正常运作, 花了一些时间找出几个怪异点,
1.cobian backup 的 log 档编码居然是 UTF-16LE, 批次档无法处理, 难怪系统读不到资料
解决方式: 使用 ConvertZ 转成 UTF-8
2.FINDSTR 无法读取 UTF-8
解决方式: 改用 FIND, 若档案格式是 ANSI, FINSTR /C:"中文字串.*"
我的工作环境o.s: win10pro x64 /1909
完整的批次档, 有需要的人可以参考修改
最后还是要感谢 iT邦帮忙技术问答 提供了我很多参考资料
@echo offclsrem ****************************************************************************rem * 日期: 2020.06.30 rem * 版本: 1.0 rem * 设计: goodnight rem * rem * rem * 注意事项rem * findstr 无法存取 utf-8 编码的档案rem * findstr 中文搜寻方式 findstr /c:"字串.*"rem 显示UTF-8 CODEchcp 65001setlocalset logfname=rem log filenameset CBLog=D:\CBLogrem 要处理的 log 档资料夹路径set runmode=2rem runmode=2 直接读取 D:\CBLog 档案, 不从C:\Program Files (x86)\Cobian Backup 11\Logs複製档案rem if %runmode%==2 goto start2rem 先把 log 複製到另一个资料夹, 再转码 (utf-16 le -> utf-8)del /q %CBLog%robocopy /np /unilog:CBcopy.txt "C:\Program Files (x86)\Cobian Backup 11\Logs" %CBlog%I:\ConvertZ\ConvertZ /i:ule /o:utf8 "%CBLog%\*.txt"rem ConvertZ 是外部程式, 要自行下载rem ConvertZ 直接複写原档 rem ConvertZ 指令参数参考: [http://fw-william.blogspot.com/2013/12/convertz-command-line.html](http://fw-william.blogspot.com/2013/12/convertz-command-line.html) :Start2 echo.echo.echo (1/4)==== D:\DirList.txt 产生档案清单 ====del /q D:\DirList.txtdel /q D:\DelList.txtdir "%CBLog%\*.txt" /b /on > D:\DirList.txtecho.echo.echo (2/4)==== D:\DelList.txt 无法删除资料夹清单档产生中 ====rem 利用 find.exe(com) 找出有"无法删除资料夹"的档案, 一次产生完, 避免使用太多巢状迴圈, 程序也比较易读 for /F "usebackq tokens=* delims=," %%i in (D:\DirList.txt) do (for /F "usebackq" %%J in ("%CBLog%\%%i") do (find "无法删除资料夹" "%CBLog%\%%i" >> D:\DelList.txt))rem for "tokens=* delims=," : 把一列字串视为一个区段, 分隔符号用 ', ' (这是我的 log 档规则, 其他 log 必须自行研读设定, 只要内容没有 ',' , 也可以用 ',' 做分隔符号echo.echo.echo (3/4)========只取出路径文字========del /q RDdir.batfor /F "usebackq skip=2 tokens=1,2,3 delims=『』" %%i in (D:\DelList.txt) do (if %%j == "" loopif %%j == "----------" loopecho rd /s /q "%%j" >> D:\RDdir.bat )rem "tokens=1,2,3 delims=『』" : 我所需要的资料格式, 刚好是由 『』包夹, 所以分隔符号用『』, 刚好可以分成三个区块资料 1=%%i , 2=%%j , 3=%%k, 我只需要『』中间区块资料, 所以是 %%jecho.echo.echo (4/4)========开始移除资料夹========Call D:\RDdir.batrem 为了安全, 执行完成后删除, 反正都会自行产生 DEL /q D:\RDdir.batrem 显示 BIG-5chcp 950:endendlocal