利用批次档截取不固定长度字串中的部份字串

最新域名优惠/VPS优惠/免备案CDN活动

公司的电脑使用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

完整的批次档, 有需要的人可以参考修改
最后还是要感谢 一与博客技术问答 提供了我很多参考资料

@echo off
cls

rem ****************************************************************************
rem * 日期: 2020.06.30                                                         
rem * 版本: 1.0                                                                
rem * 设计: goodnight                                                          
rem *                                                                          
rem *                                                                          
rem * 注意事项
rem * findstr 无法存取 utf-8 编码的文件
rem * findstr 中文寻找方式 findstr /c:"字串.*"

rem 显示UTF-8 CODE
chcp 65001

setlocal
set logfname=
rem log filename
set CBLog=D:\CBLog
rem 要处理的 log 档资料夹路径
set runmode=2
rem runmode=2 直接读取 D:\CBLog 文件, 不从C:\Program Files (x86)\Cobian Backup 11\Logs复制文件
rem 

if %runmode%==2 goto start2
rem 先把 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.txt
del /q D:\DelList.txt
dir "%CBLog%\*.txt" /b /on > D:\DirList.txt

echo.
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.bat
for /F "usebackq skip=2 tokens=1,2,3 delims=『』" %%i in (D:\DelList.txt) do (
if %%j == "" loop
if %%j == "----------" loop
echo rd /s /q "%%j" >> D:\RDdir.bat )

rem "tokens=1,2,3 delims=『』" : 我所需要的资料格式, 刚好是由 『』包夹, 所以分隔符号用『』, 刚好可以分成三个区块资料 1=%%i , 2=%%j , 3=%%k, 我只需要『』中间区块资料, 所以是 %%j

echo.
echo.
echo (4/4)========开始移除资料夹========
Call D:\RDdir.bat

rem 为了安全, 执行完成后删除, 反正都会自行产生 
DEL /q D:\RDdir.bat

rem 显示 BIG-5
chcp 950

:end
endlocal
     

推荐:
Hexo配置"伪静态",在文章链接后添加".html"

嗷嗷大佬: 虽然Hexo本身就是纯静态,但是链接并不是.html结尾的形式 Hexo默认生成的静态文件是这个形式 :year/:month/:day/:title/ 例:2020/02/02/沈媛媛我…

有没有大佬能帮申请公众号的"门店小程序"插件

白衣乞丐大佬说: 自己填写一直过不了呢,那个"门店小程序"插件

求助"Cloudraft如何搭建Minecraft"

fnardn大佬: 坛子里有dalao会么,那些大佬写的jio程根本看不懂,,有偿私聊 英梨梨大佬: 拿欧洲鸡建mc?想戒掉这游戏么 yushum大佬: 延迟100ms以上就没法玩了 别折腾了 申明:…

发表评论

电子邮件地址不会被公开。 必填项已用*标注