返回列表 发帖

[文本处理] 批处理文本检索

本帖最后由 cjiabing 于 2013-5-14 22:34 编辑

名称:批处理文本检索 Batch Text Retrieval V1.1.3
描述:这是一个批处理程序,用于检索文本信息,办公利器。假如你有一大堆文档数据,你想从这些数据中检索一些数据,则本工具可以帮你的大忙,比如搜索法律条文、查询英语单词、检索论文资料等等。
优点:程序简单,实用,快速,详细。搜索结果丰富,可导出搜索结果。速度方便比许多文本搜索类要快,搜索内容可操作性方面比系统自带的好。
缺点
1、仅部分支持doc、pdf等常用文档类型,最好转换成txt文件。
2、搜索大量文件耗时增加,为了方便二次搜索增加了一个临时文件。
3、搜索结果如果能直接定位到行,则程序就更加完美了。
4、使用findstr命令,不支持长行,搜索部分内容容易出错。
2013.05.13 更新:
1、优化搜索结果,简化代码,提高效率。
2、改善了文件搜索和定位等管理功能。
3、想使用gawk,结果发现gawk遇到文件夹就会发生错误,也不支持doc。

@echo off&setlocal enabledelayedexpansion
:Start
title 批处理文本检索 Batch Text Retrieval V1.1.4
cls&echo;&echo;
echo;        【使用说明】                                    
echo; ———————————————————————————————————————
echo;         将文档资料转换为ANSI编码的TXT文件,并置于本程序所在目录下。
echo;         使用关键词搜索,多个关键词用空格分开,如“美女 野兽 恋爱”。
echo;         可用命令[Cmd、Dir、Find、Findstr]自定义搜索,如:findstr  /?
echo;         
echo;             [1]高级选项;        [2]文件管理;
echo;             [B  Words]百度搜索。
echo;         
echo; ———————————————————————————————————————
echo;&echo;&echo;
set input=
set /p "input=        请输入:"
if "%input%"=="" goto Start
set/a input1=input2=input3=#
for /f "tokens=1,2*" %%a in ("%input%") do set "input1=%%a"&set "input2=%%b"&set "input3=%%c"
if /i "%input1%"=="cmd" cmd /c %input%&goto Start
if /i "%input1%"=="dir" cmd /c %input%&pause&goto Start
if /i "%input1%"=="find" cmd /c %input%&pause&goto Start
if /i "%input1%"=="findstr" cmd /c %input%&pause&goto Start
if /i "%input1%"=="B" start "" IEXPLORE.EXE "http://www.baidu.com/s?wd=%input2%+%input3%"&goto Start
if /i "%input%"=="1" call :Advanced&goto Start
if /i "%input%"=="2"  (
    :find
    cls&echo;&echo;
    echo         [1]列出所有文件名
    echo         [2]导出所有文件名
    echo         [3]建立目录树
    echo         [4]建立文件树
    echo         [5]导出目录树和文件树
    echo         搜索指定文件[^<FileName^>]
    echo         定位指定文件[^<FilePath^>]
    echo         返回[^<Enter^>]
    echo;         
    set inputs=
    set /p "inputs=        搜索文件:"
    if "!inputs!"=="" goto Start
    if /i "!inputs!"=="3" echo;&echo [目录树]&tree&echo;&pause&goto find
    if /i "!inputs!"=="4" echo;&echo [文件树]&tree /f&echo;&pause&goto find
    if /i "!inputs!"=="5" cd.>文件目录.txt&tree>>文件目录.txt&tree /f>>文件目录.txt&start "" 文件目录.txt&goto find
    if /i "!inputs!"=="1" (
        :list
        echo [文件列表]
        dir /b /a /s|findstr /n  .*
        echo;
        for /f "tokens=1 delims=:" %%a in ('dir /a /s ^|findstr /n "所列文件总数:"') do dir /a /s |more +%%a
        call :FileSearch "dir /b /a /s"
    )
    if /i "!inputs!"=="2" (for /f "tokens=1 delims=:" %%a in ('dir /a /s ^|findstr  /n "所列文件总数:"') do dir /a /s |more +%%a>所有文件.txt
        echo [所有文件]&dir /a /b /s>>所有文件.txt&start "" 所有文件.txt
    )
    if exist "!inputs!" start explorer /select,"!inputs!"&goto find
    echo;
    dir /a /b /s "*!inputs!*"|findstr /n .*
    echo;
    call :FileSearch "dir /a /b /s "*!inputs!*""
    goto find
)
set "F=findstr /spina:1c "%input%" "%~dp0\*.*""
for /f "tokens=1,2*" %%a in ("%input%") do call :TextSearch "%input%" %%a %%b %%c
goto Start
:TextSearch
set "F=!F:\\=\!
title 搜索 %1 . . .
echo;&echo         正在搜索 %1 ,请稍候  . . .&echo         目录文件越多,需要的时间越长,请耐心等待 . . .&echo;
set num=0
echo ^<meta http-equiv="Content-Type" content="text/html; charset=GBK" /^>^<title^>批处理文本检索 - 批处理之家^</title^>>查询结果.htm
echo ^<h1^> %1 的查询结果:^</h1^>^<small^>[快速查看]复制关键词,点击链接进入文本页面,按快捷键 Ctrl+F 调出查找对话框,粘贴关键词即可查找具体内容。建议使用 Internet Explorer 8 以上浏览器。^</small^>^<hr /^>>>查询结果.htm
for /f "tokens=1-3* delims=:" %%a in ('!F!') do (
    set "#S=%%d"
    set "#S=!#S:%~2=<span style="BACKGROUND-COLOR: CC0000">%2</span>!"
    if "%~3" neq "" set "#S=!#S:%~3=<span style="BACKGROUND-COLOR: FFFF00">%3</span>!"
    if "%~4" neq "" set "#S=!#S:%~4=<span style="BACKGROUND-COLOR: 33FF00">%4</span>!"
    if "%~5" neq "" set "#S=!#S:%~5=<span style="BACKGROUND-COLOR: 1E90FF">%5</span>!"
    if "%~6" neq "" set "#S=!#S:%~6=<span style="BACKGROUND-COLOR: 708090">%6</span>!"
    if "%%~nxb" neq "查询结果.htm" (set /a num+=1
        echo ^<p^>^&nbsp;^&nbsp;^&nbsp;^&nbsp;^<strong^>!num!.^</strong^>!#S!  ——^<small^>^<a href="%%a:%%b"^>%%a:%%b^</a^> 第%%c行.^</small^>^</p^>
    )
)>>查询结果.htm
echo ^<hr /^>^<p align="center"^>^<small^>^<a href="http://hi.baidu.com/cjiabing"^>甲兵时代 ^
http://hi.baidu.com/cjiabing^</a^>^<br /^>^<a href="http://www.bathome.net"^>批处理之家 ^
http://www.bathome.net^</a^>^<br /^>%date% %time%^</small^>^</p^>>>查询结果.htm
start 查询结果.htm
echo;&echo         搜索完成!请使用 Internet Explorer 8 以上浏览器浏览查询结果!&echo;
:TextSearchs
set inputs=
set /p "inputs=        返回[<Enter>]二次搜索[Words]:"
if "%inputs%"=="" goto :eof
echo;&echo;[查询结果]:&echo;
::%F%|findstr /i "%inputs%"|findstr /ibvna:1c "查询结果.htm"
for /f "tokens=* delims=<>" %%a in ('findstr /i "%inputs%" 查询结果.htm^|findstr /ibnv "查询结果.htm"') do (
set "var=%%a"
set "var=!var:<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong>=!"
set "var=!var:</strong>=!"
set "var=!var:<span style=!"
set "var=!var:"BACKGROUND-COLOR: CC0000">=!"
set "var=!var:"BACKGROUND-COLOR: FFFF00">=!"
set "var=!var:"BACKGROUND-COLOR: 33FF00">=!"
set "var=!var:"BACKGROUND-COLOR: 1E90FF">=!"
set "var=!var:"BACKGROUND-COLOR: 708090">=!"
set "var=!var:</span>=!"
set "var=!var:<small><a href=!"
set "var=!var:</small></p>=!"
set "var=!var:</a>=!"
echo !var!&echo;&echo;
)
echo;&goto TextSearchs
goto :eof
::修正二次搜索,避免重复执行%F%。处理"查询结果.htm"是必须考虑的办法。
打开[Num]
if "%inputs%" neq " " (for /f "tokens=1,2 delims=:" %%a in (查询结果.htm) do (
    if "%%b"=="%inputs%" start "" "%~dp0%%~a"&echo;&echo;        文件已经打开!在IE或TXT中“查找”[Ctrl+F]在TXT中“转到”[Ctrl+G]&echo;&pause>nul&goto TextSearchs
)
:Advanced
cls&echo;&echo;
echo;        【高级搜索】                                    
echo; ———————————————————————————————————————
echo;        1.模糊搜索可以获得更多的信息,具体搜索可以获得更准确的信息。
echo;        2.多个关键词使用空格分开,如“美女 吃饭 衣服”。
echo;        3.使用“二次搜索”以显示同时包含多个关键词的搜索结果
echo;        4.支持文件类型:*.txt *.htm (部分支持其他文档类型)
echo;        5.导出搜索结果:查询结果.htm
echo;        6.快捷键:在IE或TXT中“查找”[Ctrl+F]在TXT中“转到”[Ctrl+G]
echo;        7.跳过[^<Enter^>];返回[0]
echo; ———————————————————————————————————————                              
echo         【搜索关键词】
echo         1.关键词,如:小说 美女 爱情
set input_words=
set input_wordc=
set input_wordv=
set input_types=
set F1=
set /p "input_words=        请输入:"
if "!input_words!"=="" set "input_words=.*"
if /i "!input_words!"=="0" goto Start
echo;&echo         2.排除的、不包含的关键词
set /p "input_wordv=        请输入:"
if "!input_wordv!"=="" (set F1=) else (set "F1=^|findstr /i/v "!input_wordv!"")
if /i "!input_wordv!"=="0" goto Advanced
echo;&echo         3.将字符串作为一个关键词搜索[Y]任意搜索[Enter]
set /p "input_wordc=        请输入:"
if /i "!input_wordc!"=="0" goto Advanced
echo;&echo         【搜索文件类型】
::echo         可自定义,多个使用空格分开;
echo           如:[1]*.txt  [2]*.htm  [3]*.doc  [4]*.vcf
set /p "input_types=        请输入:"
if "!input_types!"=="" set "input_types=*.*"
if "!input_types!"=="1" set "input_types=*.txt"
if "!input_types!"=="2" set "input_types=*.htm"
if "!input_types!"=="3" set "input_types=*.doc"
if "!input_types!"=="4" set "input_types=*.vcf"
if /i "!input_types!"=="0" goto Advanced
set input_paths=
set input_pathv=
echo;&echo         【搜索位置】
echo         1.多个使用空格分开;含有空格的路径使用双引号引住。
echo           如:E:\电子书  "C:\Program Files"
set /p "input_paths=        请输入:"
if "!input_paths!"=="" set "input_paths="%~dp0""
if /i "!input_paths!"=="0" goto Advanced
echo;&echo         2.排除的、不包含的目录;排除当前目录[Y]
set /p "input_pathv=        请输入:"
if "!input_pathv!"=="" set "input_pathv=."
if /i "!input_pathv!"=="Y" set "input_pathv="%~dp0""
if /i "!input_pathv!"=="0" goto Advanced
echo;&echo;
echo         你准备搜索关键词 "!input_words!" ,但排除 "!input_wordv!"
echo         将字符串作为一个关键词搜索 "!input_wordc!" ,或任意搜索 [Enter] ;
echo         你准备搜索文件类型 "!input_types!",但排除 "!input_typev!"
echo         你准备在位置 "!input_paths!" 进行搜索,但排除位置 "!input_pathv!"
echo;&echo;
for %%x in (!input_paths!) do for %%i in (!input_pathv!) do if /i "%%~x" neq "%%~i" (
    if /i "!input_wordc!"=="Y" (
        set "F=findstr /spina:1c /c:"!input_words!" "%%~x\!input_types!" !F1!"
        for /f "tokens=1,2*" %%a in ("!input_words!") do call :TextSearch "!input_words!" %%a %%b %%c
    ) else (
        set "F=findstr /spina:1c    "!input_words!" "%%~x\!input_types!" !F1!"
        for /f "tokens=1,2*" %%a in ("!input_words!") do call :TextSearch "!input_words!" %%a %%b %%c
    )
) else (
        set "F=findstr /spina:1c    "!input_words!" "%~dp0\*.*""
        for /f "tokens=1,2*" %%a in ("!input_words!") do call :TextSearch "!input_words!" %%a %%b %%c
)
goto :eof
:FileSearch
echo;        打开[1 Num]定位[2 Num]搜索指定文件内容[Num Words]
echo;        Num 指搜索结果前的数字,即行数。返回[^<Enter^>]
set input=
set /p "input=        请输入:"
if "!input!"=="" goto find
set/a input1=input2=.
for /f "tokens=1*" %%a in ("!input!") do set "input1=%%a"&set "input2=%%b"
for /f "tokens=1* delims=:" %%a in ('%~1^|findstr /n  .*') do (
    if  "!input1!"=="1" if !input2!==%%a echo;打开文件:%%b&start "" "%%~b"&pause&goto find
    if  "!input1!"=="2" if !input2!==%%a echo;定位文件:%%b&if exist "%%~b" start explorer /select,"%%~b"&pause&goto find
    if  !input1! gtr 2 if  !input1!==%%a (
        set "F=findstr /spina:1c "!input2!" "%%~b""
        for /f "tokens=1,2*" %%i in ("!input2!") do call :TextSearch "!input2!" %%i %%j %%k
        goto find
    )
)
goto :eof
COPY


有关doc、pdf等三方:
本工具能搜索到部分doc、pdf文档,但有部分不支持。
第三方命令行工具可以将文档转换为txt文件,但经试验,也有许多是失败的。

[文件操作][/url] xdoc2txt - 转换 doc/xls/pdf/html... 为 txt  http://www.bathome.net/thread-22123-1-3.html
[文件操作][/url] DOC2TXT - doc 转 txt/html/rtf/dot...  http://www.bathome.net/thread-20046-1-5.html
[文件操作][/url] Word、Excel文件转文本文件:doctotext_0.12.0  http://www.bathome.net/thread-10929-1-5.html
[文件操作][/url] pdftk----命令行下操作PDF的利器  http://www.bathome.net/thread-16578-1-9.html
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

很好  谢谢斑竹

TOP

改编一个UTF8转ANSI的VBS(参考Batcher 的UTF82ANSI.vbs)
@echo off &echo 将目录下所有 TXT 文件由 UTF8 编码转换为 ANSI 编码。&pause&md 转换结果
if not exist UTF82ANSI.vbs more +5 %0>>UTF82ANSI.vbs
for /f "tokens=*" %%a in ('dir /b *.txt') do UTF82ANSI.vbs "%%~a"  "转换结果\%%~a"
exit
'UTF82ANSI
aCode = "UTF-8"
bCode = "GB2312"
Set objArgs = WScript.Arguments
FileUrlSrc = objArgs(0)
FileUrlDst = objArgs(1)
Call WriteToFile(FileUrlDst, ReadFile(FileUrlSrc, aCode), bCode)
Function ReadFile(FileUrlSrc, CharSet)
    Dim Str
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.loadfromfile FileUrlSrc
    Str = stm.readtext
    stm.Close
    Set stm = Nothing
    ReadFile = Str
End Function
Function WriteToFile (FileUrlDst, Str, CharSet)
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.WriteText Str
    stm.SaveToFile FileUrlDst, 2
    stm.flush
    stm.Close
    Set stm = Nothing
End FunctionCOPY
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

牛  

TOP

返回列表