Board logo

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

作者: wjmcool    时间: 2011-1-23 15:19     标题: [已解决]请教批处理如何提取文件中某段文字并生成新文件?

有一个注册表文件,我想把它其中的某段提取出来,并生成一个新的注册表,我的思路是先利用循环读取到这一段行号,然后再使用一个循环依次读取该行号以下的每行内容并写入新的注册表文件,遇到第一个空行则跳出循环。但是现在碰到问题,就是如何判断空行,我是这样写的%%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 编辑 ]
作者: tmplinshi    时间: 2011-1-23 15:36

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

作者: hanyeguxing    时间: 2011-1-23 15:38

  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 编辑 ]
作者: wjmcool    时间: 2011-1-23 16:14

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

  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 编辑 ]
作者: hanyeguxing    时间: 2011-1-23 16:41     标题: 回复 4楼 的帖子

忘记在if 里加 /i 了,已修改
作者: wjmcool    时间: 2011-1-23 20:46

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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2