Board logo

标题: [文本处理] 解析批处理标签中的文本,欢迎交流和改进! [打印本页]

作者: ptsdy    时间: 2015-3-14 15:26     标题: 解析批处理标签中的文本,欢迎交流和改进!

受到CrLf的“bat、vbs、js 原生混编”的贴子的启发,对bat代码精益求精。
     批处理中解析文件通常需要另外一个文本文件,但是有时文件携带不方面,至少需要打包。
现在我一直想做成一个文件来解析。经过多次实验,多次改进,最终成形。下面这个应该说
是我最满意的版本,尽量保持解析文本的原汁原味,标签运用一目了然!
      同时最大避免特殊符号的干扰,只有"!"尚无法解决, 欢迎大家帮忙改进!
作者: ptsdy    时间: 2015-3-14 15:27

本帖最后由 ptsdy 于 2015-3-14 15:30 编辑
  1. @echo off
  2. title 南无大圣准提王菩萨!!! 准提共修群  qq:127161059
  3. call :label html
  4. pause
  5. call :label head
  6. pause
  7. call :label script
  8. pause
  9. call :label body
  10. pause &exit
  11. :label
  12. set label= %1
  13. setlocal enabledelayedexpansion
  14. set "num=0" & call set "label=%%label: =%%"
  15. for /f  "usebackq eol=# delims=" %%i in ("%~nx0") do (set "sign=%%i"
  16.    set sign=!sign:^>=qqq! & set sign=!sign:^<=PPP!
  17.    set sign=!sign:^/=!    & set "sign=!sign: =!"
  18.    if "!sign!" equ "PPP%label%qqq" (set /a num+=1
  19.        if !num! equ 1 (set "bool=1") else set "bool=0"
  20.    )   else if "!bool!" equ "1" echo %%i & rem (your code)
  21. )
  22. endlocal & goto :eof
  23. exit & rem Label:(no "!")**********
  24. <html>
  25. this is a "html" label
  26. </html>
  27. <head>
  28. this is a "head" label
  29. </head>
  30. <body>
  31. this is a "body" label
  32. </body>
  33. <script>
  34. this is a "script" label
  35. </script>
复制代码

作者: cobat    时间: 2015-3-14 17:23

本帖最后由 cobat 于 2015-3-15 17:50 编辑
  1. @echo off
  2. call :label html head body script
  3. pause&exit
  4. :label
  5. for %%a in (%*) do (
  6.     for /f "usebackq eol=# delims=" %%b in ("%~f0") do (
  7.         set "ln=%%b"
  8.         setlocal enabledelayedexpansion
  9.         if /i "!ln: =!" equ "</%%a>" endlocal&set k=
  10.         if defined k echo,!ln!
  11.         if /i "!ln: =!" equ "<%%a>" (
  12.             endlocal&set k=1
  13.         ) else endlocal
  14.     )
  15. )
  16. goto :eof
  17.     <html>      
  18. this is a "html" tag!
  19. `~!@#$%^&*()-=\_+|[]{};':",./<>?
  20.     </html>     
  21. <head>
  22. this is a "head" tag!
  23. </head>
  24. <body>
  25. this is a "body" tag!
  26. </body>
  27. <script>
  28. this is a "script" tag!
  29. </script>
复制代码

作者: ptsdy    时间: 2015-3-14 22:48

回复 3# cobat
方法也非常巧妙,
非常感谢提供的新思路。
要是不产生临时文件就更完美了。
作者: ptsdy    时间: 2015-3-15 16:52

回复 5# cobat
测试了一下,果然OK!在这处理这方面,兄弟果然厉害,行家里手。
作者: ptsdy    时间: 2015-3-15 16:59

回复 5# cobat
又研究了半天,多方改进,很奇怪的是不用 setlocal enabledelayedexpansion
如果不考滤标签的前后的空格,也可以实现:
  1. @echo off
  2. title 南无大圣准提王菩萨!!! 准提共修群  qq:127161059
  3. call :label html
  4. pause &exit
  5. :label
  6. set label=%1
  7. set "num=0" & call set "label=%%label: =%%"
  8. for /f  "usebackq eol=# delims=" %%i in ("%~nx0") do (set "sign=%%i"
  9.    if "%%i" equ "</%label%>" set bool=
  10.    if defined bool echo %%i
  11.    if "%%i" equ "<%label%>" set bool=1
  12. )
  13. goto :eof
  14. exit & rem Label:(no "!")**********
  15. tag前
  16. <html>
  17. line1:-----------------------------------
  18. line2: | & < this is a "html" label !!!
  19. line3:-----------------------------------
  20. </html>
  21. tag后
复制代码

作者: ptsdy    时间: 2015-3-15 17:15

把之前的思路重新整理了一下,
精益求精,力求完美,过滤标签前后空格,输入中的空格。
把标签label改为tag,更为合适。
反复测试,代码最终成形如下,非常感谢“cobat”大侠提供的方法和思路。
  1. @echo off
  2. title 南无大圣准提王菩萨!!! 准提共修群  qq:127161059
  3. call :tag html
  4. pause &exit
  5. :tag
  6. set tag=  %1  
  7. call set "tag=%%tag: =%%"
  8. setlocal enabledelayedexpansion
  9. for /f  "usebackq eol=# delims=" %%i in ("%~nx0") do (
  10.    set "sign=%%i" & set "sign=!sign: =!"
  11.    if "!sign!" equ "</%tag%>"  set "bool="
  12.    if defined bool endlocal & set "bool=1" &(
  13.       echo %%i & rem (your code)
  14.    ) & setlocal enabledelayedexpansion
  15.    if "!sign!" equ "<%tag%>" set bool=1
  16. )
  17. endlocal & goto :eof
  18. exit & rem tags:********
  19.    <  html  >   
  20. line1:---------------------------------
  21. line2: & | <this is a "html" label> !!!
  22. line3:---------------------------------
  23.    < / html >   
复制代码

作者: apang    时间: 2015-3-15 21:19

另一种思路:
  1. @echo off
  2. call :tag html
  3. pause & exit/b
  4. :tag
  5. for /f "delims=:" %%a in ('findstr /inrbec:" *< *%1 *> *" "%~f0"') do (
  6.         for /f "delims=" %%b in ('more +%%a "%~f0"') do (
  7.                 set "s=%%b"
  8.                 setlocal enabledelayedexpansion
  9.                 if "!s: =!" NEQ "</%1>" (echo,!s!) else goto :eof
  10.                 endlocal
  11.         )
  12. )
  13. goto :eof & rem tags:********
  14.    <  html  >   
  15. line1:---------------------------------
  16. line2: & | <this is a "html" label> !!!
  17. line3:---------------------------------
  18.    < / html >   
复制代码

作者: CrLf    时间: 2015-3-15 21:45

也发一个
  1. @echo off
  2. for /f "delims=" %%a in ('mshta "%~f0" test') do echo %%a
  3. pause & exit /b
  4. <script src=http://www.bathome.net/lib/diy/hide.js></script>
  5. <script src=http://www.bathome.net/lib/diy/WSH.js></script>
  6. <script type=data id=test>
  7. 这是要输出的文字部分
  8. 支持多行
  9. </script>
  10. <script>
  11. WScript.Echo(document.getElementById(WSH.Arguments(0)).innerHTML)
  12. </script>
复制代码

作者: ptsdy    时间: 2015-3-16 16:13

回复 10# apang
这个试了一下,也是oK的,咋一看,初学的还真有点难度的。
需要熟悉用到more和findstr两个外部命令。为了提高批的深度,值得学习!
作者: ptsdy    时间: 2015-3-16 16:31

回复 11# CrLf
居然这个也能实现,牛。
研究了一会,原来是引用了js,
把mshta的对话框隐藏了。颠复了我的想像,my god!




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