标题: [文本处理] 解析批处理标签中的文本,欢迎交流和改进! [打印本页]
作者: ptsdy 时间: 2015-3-14 15:26 标题: 解析批处理标签中的文本,欢迎交流和改进!
受到CrLf的“bat、vbs、js 原生混编”的贴子的启发,对bat代码精益求精。
批处理中解析文件通常需要另外一个文本文件,但是有时文件携带不方面,至少需要打包。
现在我一直想做成一个文件来解析。经过多次实验,多次改进,最终成形。下面这个应该说
是我最满意的版本,尽量保持解析文本的原汁原味,标签运用一目了然!
同时最大避免特殊符号的干扰,只有"!"尚无法解决, 欢迎大家帮忙改进!
作者: ptsdy 时间: 2015-3-14 15:27
本帖最后由 ptsdy 于 2015-3-14 15:30 编辑
- @echo off
- title 南无大圣准提王菩萨!!! 准提共修群 qq:127161059
- call :label html
- pause
- call :label head
- pause
- call :label script
- pause
- call :label body
- pause &exit
- :label
- set label= %1
- setlocal enabledelayedexpansion
- set "num=0" & call set "label=%%label: =%%"
- for /f "usebackq eol=# delims=" %%i in ("%~nx0") do (set "sign=%%i"
- set sign=!sign:^>=qqq! & set sign=!sign:^<=PPP!
- set sign=!sign:^/=! & set "sign=!sign: =!"
- if "!sign!" equ "PPP%label%qqq" (set /a num+=1
- if !num! equ 1 (set "bool=1") else set "bool=0"
- ) else if "!bool!" equ "1" echo %%i & rem (your code)
- )
- endlocal & goto :eof
- exit & rem Label:(no "!")**********
- <html>
- this is a "html" label
- </html>
- <head>
- this is a "head" label
- </head>
- <body>
- this is a "body" label
- </body>
- <script>
- this is a "script" label
- </script>
复制代码
作者: cobat 时间: 2015-3-14 17:23
本帖最后由 cobat 于 2015-3-15 17:50 编辑
- @echo off
- call :label html head body script
- pause&exit
-
- :label
- for %%a in (%*) do (
- for /f "usebackq eol=# delims=" %%b in ("%~f0") do (
- set "ln=%%b"
- setlocal enabledelayedexpansion
- if /i "!ln: =!" equ "</%%a>" endlocal&set k=
- if defined k echo,!ln!
- if /i "!ln: =!" equ "<%%a>" (
- endlocal&set k=1
- ) else endlocal
- )
- )
- goto :eof
- <html>
- this is a "html" tag!
- `~!@#$%^&*()-=\_+|[]{};':",./<>?
- </html>
- <head>
- this is a "head" tag!
- </head>
- <body>
- this is a "body" tag!
- </body>
- <script>
- this is a "script" tag!
- </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
如果不考滤标签的前后的空格,也可以实现:- @echo off
- title 南无大圣准提王菩萨!!! 准提共修群 qq:127161059
- call :label html
- pause &exit
- :label
- set label=%1
- set "num=0" & call set "label=%%label: =%%"
- for /f "usebackq eol=# delims=" %%i in ("%~nx0") do (set "sign=%%i"
- if "%%i" equ "</%label%>" set bool=
- if defined bool echo %%i
- if "%%i" equ "<%label%>" set bool=1
- )
- goto :eof
- exit & rem Label:(no "!")**********
- tag前
- <html>
- line1:-----------------------------------
- line2: | & < this is a "html" label !!!
- line3:-----------------------------------
- </html>
- tag后
复制代码
作者: ptsdy 时间: 2015-3-15 17:15
把之前的思路重新整理了一下,
精益求精,力求完美,过滤标签前后空格,输入中的空格。
把标签label改为tag,更为合适。
反复测试,代码最终成形如下,非常感谢“cobat”大侠提供的方法和思路。- @echo off
- title 南无大圣准提王菩萨!!! 准提共修群 qq:127161059
- call :tag html
- pause &exit
- :tag
- set tag= %1
- call set "tag=%%tag: =%%"
- setlocal enabledelayedexpansion
- for /f "usebackq eol=# delims=" %%i in ("%~nx0") do (
- set "sign=%%i" & set "sign=!sign: =!"
- if "!sign!" equ "</%tag%>" set "bool="
- if defined bool endlocal & set "bool=1" &(
- echo %%i & rem (your code)
- ) & setlocal enabledelayedexpansion
- if "!sign!" equ "<%tag%>" set bool=1
- )
- endlocal & goto :eof
- exit & rem tags:********
- < html >
- line1:---------------------------------
- line2: & | <this is a "html" label> !!!
- line3:---------------------------------
- < / html >
复制代码
作者: apang 时间: 2015-3-15 21:19
另一种思路:- @echo off
- call :tag html
- pause & exit/b
- :tag
- for /f "delims=:" %%a in ('findstr /inrbec:" *< *%1 *> *" "%~f0"') do (
- for /f "delims=" %%b in ('more +%%a "%~f0"') do (
- set "s=%%b"
- setlocal enabledelayedexpansion
- if "!s: =!" NEQ "</%1>" (echo,!s!) else goto :eof
- endlocal
- )
- )
- goto :eof & rem tags:********
- < html >
- line1:---------------------------------
- line2: & | <this is a "html" label> !!!
- line3:---------------------------------
- < / html >
复制代码
作者: CrLf 时间: 2015-3-15 21:45
也发一个- @echo off
- for /f "delims=" %%a in ('mshta "%~f0" test') do echo %%a
- pause & exit /b
-
- <script src=http://www.bathome.net/lib/diy/hide.js></script>
- <script src=http://www.bathome.net/lib/diy/WSH.js></script>
-
- <script type=data id=test>
- 这是要输出的文字部分
- 支持多行
- </script>
-
- <script>
- WScript.Echo(document.getElementById(WSH.Arguments(0)).innerHTML)
- </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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |