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

[注册表类] 【已解决】有没有办法只通过代码来增加bat导出注册表的运行速度?

[复制链接]
发表于 2021-12-1 18:31:03 | 显示全部楼层
变量延迟用!errorlevel!
 楼主| 发表于 2021-12-1 18:46:40 | 显示全部楼层
回复 16# qixiaobin0715
基础不好忘记了,感谢提醒,改过来后就正常了
发表于 2021-12-1 23:32:12 | 显示全部楼层
回复 15# aceamuro


2楼代码的本意是想把你顶楼代码for循环内部的文件写入操作挪到for循环外,通常来说这样可以提升执行速度,参考:
https://mp.weixin.qq.com/s/VZk0TmYUpFdCoWK9ZpgL0Q

不过遗憾的是,你3楼描述的结果未能发现明显效果。

start /b 的问题在于【当出现特定序号的文件时就可以作为导出完毕的验证】这个逻辑在理论上不一定成立,因为:
假设文本总共300行,第300行完成reg export的时候,第299行不一定是否已经执行完成。
 楼主| 发表于 2021-12-2 09:19:31 | 显示全部楼层
本帖最后由 aceamuro 于 2021-12-2 09:21 编辑

回复 18# Batcher
用代码测了一下精确到毫秒的时间
导出.txt总共209条注册项,如果有几十条真实存在于注册表中,2L跟1L代码的用时基本没什么区别,如果209条全部都有的话2L代码的确有500毫秒左右的领先,昨天应该是秒表计时的误差
不过终究还是start/b的速度快得多,209个注册项全部存在的话比2L代码快1500毫秒左右,基本是一半的时间
大佬提示的那个逻辑我的确想得不够深,请问如果大部分用start/b,最后10来条用正常的reg export会不会更保险一些?
  1. setlocal enabledelayedexpansion
  2. for /F %%# in ('type 导出.txt') do (
  3. set /a n+=1
  4. if !n! lss 200 (start/b reg export %%# 导出_!n!.reg) else (reg export %%# 导出_!n!.reg)
  5. )
复制代码
这样是不是也不用管编号是否到209,直接写copy命令就行?
发表于 2021-12-2 09:32:04 | 显示全部楼层
回复 19# aceamuro


    请教一下,你是如何判断最后10来条正常?
 楼主| 发表于 2021-12-2 09:39:29 | 显示全部楼层
本帖最后由 aceamuro 于 2021-12-2 09:47 编辑

回复 20# Batcher
我也不会判断,就是直接写reg export,把前面的start/b去掉而已,大佬的意思是说这样写无法确定是否正常的么?
我的意思是前面199条用start/b分开其他线程写入,最后10条用主线程写入
主线程写10条的时间总够其他线程写1条了吧,所以感觉上好像保险一些?不知道这样好不好使,写法对不对……
发表于 2021-12-2 10:58:36 | 显示全部楼层
本帖最后由 wudi61600963 于 2021-12-2 11:09 编辑

大概率不会出什么问题,但正如之前所说,出现了意外情况(I/O 阻塞、单项注册表过大或是其他原因)则会最终造成不完整合并,因此属于存在隐患的“非可靠设计”。

增加可靠性的方法也有很多,例如当全部执行完成后对文件/文件大小/文件数量进行验证,或者是对文件是否正被使用进行验证(正在写入的文件无法通过验证)、收集导出日志/错误日志来核对等等。

从结构上也可以参考面向对象语言的封装结构进行设计。
使用 || 语法可以判断语句是否执行成功,但使用 start/B 会改变执行判断标准,使其成为是否成功执行了 start/B 语句。因此可以设计一个封装模块,实时报告进度,或是无论成功失败都创建一个信号,那么根据信号就可以掌握执行结果了。

当然并非“非可靠设计”就一定不行,找到执行边界(例如单项注册表最大可以多大、执行环境中最多耗时多久等),优化判断和超时时限令边界情况几乎不可复现也不失为一种选择。
 楼主| 发表于 2021-12-2 12:39:24 | 显示全部楼层
本帖最后由 aceamuro 于 2021-12-2 14:52 编辑

回复 22# wudi61600963
对我来说太深奥了,我代码很菜,这些基本不会写啊……
不过大佬提到文件是否正在被使用的问题,我又想到一个办法,那就是把导出结果移动到另一个文件夹,如果能移动说明导出完成了,不能移动说明文件正在被写入,那就重新移动直到移空,能移空是不是就表示导出全部完成了?
  1. setlocal enabledelayedexpansion
  2. for /F %%# in ('type 导出.txt') do (start/b reg export %%# a\导出_!random!.reg)
  3. :进度验证
  4. move a\*.* b\
  5. dir /a /s /b a | findstr . >nul && goto 进度验证 || copy b\导出_*.reg 备份.reg
复制代码
思路就是这样,不知道上面写得对不对,如果对的话是不是就相当于完整验证,没有隐患了?


补充1:这样写看来不行,偶尔会有漏掉一两个的情况,但奇怪的是漏掉的文件既不在a也b文件夹,就好像没有导出过
但用最保守的方法导出数量却总是一样的

补充2:好像是随机文件名偶尔会造成文件名冲突,把随机改成序号就没再出问题了,每次导出的数量都一样,而且速度也跟直接用start/b差不多
发表于 2021-12-3 16:06:49 | 显示全部楼层
本帖最后由 wudi61600963 于 2021-12-3 16:20 编辑

回复 23# aceamuro

花时间仔细琢磨一下上面写的内容,查资料、对比不同方案、做减法、反复进行耗时测试会很容易找到更高效的解。
因此现阶段单纯改代码意义不大,代码会随着思想成长、方案优化而变化。
当楼主靠自身能力无法继续优化时拿出来大家一同修改会更高效。
发表于 2021-12-3 17:30:07 | 显示全部楼层
说真的,关掉杀毒软件会快很多。
没有关的速度:8.627秒
关掉的速度:1.003秒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 19:12 , Processed in 0.021830 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表