[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 aceamuro 于 2021-12-1 09:53 编辑

回复 10# wudi61600963
在后面分别加了
  1. copy 导出_*.reg 备份.reg
复制代码
  1. type 导出_*.reg>>备份.reg
复制代码
速度好像感觉差不多,可能100多个注册项还是体现不出速度差异,不过整体速度的确比原来有提升
实际测试后type和copy都比我想象得要快,感觉提速主要是因为把每一项导出都用start/b另开进程了,如果实机的话提速应该会明显得多(我用虚拟机测试的)

不过我还是觉得你上面提的那个先用变量导出到内存,然后一股脑写入一个文件的办法会更快一些,但现在还没啥头绪……

TOP

本帖最后由 wudi61600963 于 2021-12-1 09:31 编辑

6 楼的代码是为提供思路而准备的范例(解决被覆盖问题),并非为楼主项目而量身定制的现成代码,楼主应该按照自己的实际需求进行修改寻求最优解,不应一点不改拿来用。

此外个人认为应该先了解下批处理语法,多使用搜索功能(关键字:“批处理 合并文件”),楼主现在的情况对基础语法不熟悉(例如 copy 合并文件的用法),很难继续写下去。

TOP

回复 8# wudi61600963
这样虽然能够全部导出,但100多条注册表项都是一堆分散的reg文件(文件名是导出_随机数字),想要整合成一个的话,结果除了type我还是想不到别的
虽然说纯导出的速度的确是有些提高,但算上写入同一个文件的时间感觉上差不多(还没测试)

TOP

回复 7# aceamuro


    我修改了上面的代码,再次尝试。

TOP

本帖最后由 aceamuro 于 2021-11-30 18:52 编辑

回复 6# wudi61600963

还是那个问题,reg export只能导出一行或几行,导出一次后下次导出会把前面的结果覆盖掉。
试了几次,cmd窗口显示至少导出成功100多行,但结果的reg文件却只有三四行,有时候只有一行
先获取注册表项作为变量存储在内存中再统一写入看起来是好办法,但我基础不好写得有点懵……

PS:不是覆盖掉,刚刚把/b去掉看子窗口都是卡在提示“文件重名是否覆盖”,并没有实际写入文件,总之看起来还是reg export只能导出一条注册项到一个文件的问题……

TOP

本帖最后由 wudi61600963 于 2021-12-1 10:45 编辑

个人认为应该先了解下语法(以及执行效率),在语法可实现范围内整理思路找到最优解会比较好。
· 避免被覆盖可以从名称上着手,例如在文件名上加入 %random% 或 %time% ;
· 禁用覆盖提示添加 /y 参数(不用提示就强行覆盖现有文件);
· type 语法会按行读取文本内容,对于复制内容场景效率极低,同类办法有复制(copy)、移动(move)、重命名(rename),当然最高效的方案是不进行任何操作。


实现“多线程”的方法有很多,因为不清楚具体的应用场景和设备性能,以及有多追求速度,所以提供一些思路:
· 以最多线程并发导出(在大规模项目中会造成卡顿甚至宕机)
  1. @echo off
  2. pushd "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /F %%# in ('type 导出.txt') do start/B reg export %%# 导出_!random!.reg>nul
复制代码
· 添加控制降低并发数
  1. @echo off
  2. pushd "%~dp0"
  3. setlocal enabledelayedexpansion
  4. set "control0=start/B"
  5. for /F %%# in ('type 导出.txt') do set/an+=1&%control!n:~-1!% reg export %%# 导出_!random!.reg>nul
复制代码
或是可以先获取注册表项并存储在内存中(通过变量存储),待查询全部结束后将变量一齐写入等
1

评分人数

TOP

回复 4# wudi61600963
1.因为项目太多,而且需要导出的项可能有变化的情况,所以单独有一个列表
2.因为reg export每次只能写入一条,写入下一条还是同名的“导出.reg”,bat会提示是否覆盖造成批处理中止
3.因为reg export只能把1条注册项写入1个文件,而列表中有300多条,所以没办法直接写入备份.reg。

或者有什么能一次导出多条注册表项的写法求告知……

我顶楼说拆成两份其实就是把这300多项注册单拆成两份,然后利用start命令同时运行另一个bat,不知道这个算不算“多线程”,这样拆成两份有效,拆得更碎的话速度反而会降低
我不太了解bat多线程的操作,如果有正规方法也求告知,实在没查到……

TOP

本帖最后由 wudi61600963 于 2021-11-30 13:21 编辑

代码写得有问题看不明白具体需求:

· 为什么要从 导出.txt 中导出注册表到 导出.reg?
· 为什么要用 type 语法将 导出.reg 中内容复制到 备份.reg?
· 之后 导出.reg 要删除的话,为什么不直接导出至 备份.reg?
---------------------------------

想优化就要简化需求,如果是导出某项注册表的话:
  1. reg export 注册表项 备份.reg
复制代码
如果下面还有其他操作暂时用不到 备份.reg 的话可以“多线程”放到后台处理:
  1. start/B reg export 注册表项 备份.reg
复制代码
加速导出单个注册表大项可以考虑拆分并创建多个“多线程”来加速处理:
  1. for %%# in (注册表项1 注册表项2 ...) do start/B reg export %%# 备份_%%#.reg>nul
复制代码

TOP

回复 2# Batcher
基本一样,拆成两份后时间差不多,不拆的话甚至平均慢了半秒,也可能是秒表计时的误差,但大致速度差不多

TOP

回复 1# aceamuro


试试这样需要几秒:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "n=1000"
  4. for /f %%i in (导出.txt) do (
  5.     set /a n+=1
  6.     reg export %%i 导出_!n!.reg
  7. )
  8. type 导出_*.reg >备份.reg
  9. del /f /q 导出_*.reg
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表