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

[文本处理] [已解决]请教批处理如何提取文件中某段文字并生成新文件?

有一个注册表文件,我想把它其中的某段提取出来,并生成一个新的注册表,我的思路是先利用循环读取到这一段行号,然后再使用一个循环依次读取该行号以下的每行内容并写入新的注册表文件,遇到第一个空行则跳出循环。但是现在碰到问题,就是如何判断空行,我是这样写的%%b==""&&goto :end,文件是生成成功了,但是CMD窗口老是报错,请教各位大侠如何解决,另请大侠帮我看看代码是否繁琐,是否有更好的写法,万分感谢

以下是注册表样式
[HKEY_LOCAL_MACHINE\SOFTWARE\dzh\SuperStk\Market\IX]
"BaseInfoPath"=""
"StkDataPath"=""
"name"="全球指数"
"shortname"="全球"
"labellen"=dword:00000000
"namelen"=dword:00000000
"timezone"=dword:00000008
"opentime1"=dword:00000258
"closetime1"=dword:00000b54
"py"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\dzh\SUPERSTK\Market\HK]
"BaseInfoPath"=""
"StkDataPath"=""
"name"="香港联合交易所"
"shortname"="港"
"labellen"=dword:00000000
"namelen"=dword:00000008
"timezone"=dword:00000008
"opentime1"=dword:000003e8
"opentime2"=dword:00000596
"closetime1"=dword:000004ce
"closetime2"=dword:00000640
"py"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\dzh\SuperStk\Market\HS]
"BaseInfoPath"=""
"StkDataPath"=""
"name"="AH股"
"shortname"="AH"
"labellen"=dword:00000000
"namelen"=dword:00000008
"timezone"=dword:00000008
"opentime1"=dword:000003e8
"opentime2"=dword:00000596
"closetime1"=dword:000004ce
"closetime2"=dword:00000640
"py"=dword:00000001
"mainindex"="HSI"
"Version"=dword:00000064
"TypeMask"="***** 0"
"LargeRepData"=dword:00000001
"LastDynaReq"=dword:00000000
"VarTradeTime"=dword:00000001
"SubType"="AH股 3 1 1"

………



以下是我写的代码
  1. @echo off
  2. set Regf=\[HKEY_LOCAL_MACHINE\SOFTWARE\dzh\SuperStk\Market\HK\]
  3. for /f "tokens=1* delims=:" %%i in ('type aaa.reg^|findstr /in "%Regf%"') do set /a Regnum=%%i-1
  4. for /f "skip=%Regnum% tokens=1* delims=:" %%a in ('type aaa.reg^|findstr /in .*') do (
  5. echo.%%b >>555.reg
  6. %%b==""&&goto :end)
  7. :end
  8. PAUSE&exit
复制代码

[ 本帖最后由 wjmcool 于 2011-1-23 20:47 编辑 ]
1

评分人数

    • hanyeguxing: 感谢给帖子标题标注[已解决]字样PB + 2

经过测试,问题已完美解决,十分欣赏寒夜孤星和tmplinshi的优质代码,只用一个循环就实现了目标,效率大幅提高,不愧高手。对你们的帮助再次表示感谢!

TOP

回复 4楼 的帖子

忘记在if 里加 /i 了,已修改
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. @echo off
  2. set Regf=[HKEY_LOCAL_MACHINE\SOFTWARE\dzh\SuperStk\Market\HK]
  3. (for /f "delims=" %%a in ('type aaa.reg') do (
  4.     if defined ~echo (
  5.         if %%~a==%%a goto :end
  6.         echo %%a
  7.     ) else (
  8.         if /i "%%a"=="%Regf%" (
  9.             set ~echo=.
  10.             echo %Regf%
  11.         )
  12.     )
  13. )) >555.reg
  14. :end
  15. PAUSE&exit
复制代码

[ 本帖最后由 tmplinshi 于 2011-1-23 18:08 编辑 ]

TOP

感谢楼上两位版主的热心帮助,根据tmplinshi版主的代码已经调试成功,原来需要加上双引号,呵呵。寒夜孤星
大侠的代码非常简洁,但是运行好像有点问题,CMD窗口一闪而过,而且生成的注册表文件也是空的,不过你的代码非常严谨,也给了我启发,我再测试一下。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in ('type 1.reg') do if defined n (
  3.         set "a=%%a"
  4.         if "!a:~0,1!!a:~-1!"=="[]" goto:eof
  5.         echo !a!
  6.         ) else if /i "%%a"=="[HKEY_LOCAL_MACHINE\SOFTWARE\dzh\SuperStk\Market\HK]" set n==&echo %%a
  7. )>1-.reg
复制代码
或:
  1. @echo off
  2. (for /f "delims=" %%a in ('type 1.reg') do if defined n (
  3.         set "a=%%a"
  4.         setlocal enabledelayedexpansion
  5.         if "!a:~0,1!!a:~-1!"=="[]" goto:eof
  6.         echo !a!
  7.         endlocal
  8.         ) else if /i "%%a"=="[HKEY_LOCAL_MACHINE\SOFTWARE\dzh\SuperStk\Market\HK]" set n==&echo %%a
  9. )>1-.reg
复制代码

[ 本帖最后由 hanyeguxing 于 2011-1-23 16:40 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. if "%%b"=="" goto :end
复制代码

TOP

返回列表