本帖最后由 普大喜奔 于 2014-9-19 13:18 编辑
朋友经常写汇报材料,一些数据和词汇经常使用,需要快速从以往写的材料中找出来相关的句子。我写的这个脚本用批处理做用户界面和文件搜索的工作,用vbs读取word文件内的文本,将文本按句号分割后全部按行存储在一个文件中,相当于建立一个数据库方便以后检索;本人是新手,脚本有很多不完善的地方,尤其是用户界面很不友好,关键词如果带有“\”等特殊字符会发生异常等。发上来跟大家共同交流,希望给点改进建议哈
第一次发帖不知如何发附件,只好把代码贴上来了。一共2个批处理,3个vbs,代码:
1.main.cmd
___________________________________________________________
@echo off
setlocal enabledelayedexpansion
color f9
if not exist backup mkdir backup
warn.vbs 2 0
dir /s /b /o:n *.doc 1>nul 2>nul
if !errorlevel!==0 goto start
warn.vbs 1 0
exit
:start
if not exist DATA cd. >DATA
set num=0 ::记录写入文件的数目
::x值为0表示bak文件存在,y初值为0表示doc与bak无相同文件,y值为1表示有文件相同
dir /b /o:n "%cd%\backup\*.bak" 1>nul 2>nul
set x=!errorlevel!
for /f "delims=" %%a in ('dir /s /b /o:n *.doc') do (
set y=0
if %x%==0 (
call :fileCompare
if !y!==0 (
cscript //nologo main.vbs "%%a"
copy "%%a" "%cd%\backup\!date!-!time:~0,2!-!time:~3,2!-!time:~6,5!.bak" 1>nul 2>nul
set /a num+=1
echo 已写入 !num! 个文件
)
) else (
cscript //nologo main.vbs "%%a"
copy "%%a" "%cd%\backup\!date!-!time:~0,2!-!time:~3,2!-!time:~6,5!.bak" 1>nul 2>nul
set /a num+=1
echo 已写入 !num! 个文件
)
)
quit.vbs
warn.vbs 3 !num!
exit
::直接在内循环用goto跳转会跳出所有循环,所以通过call间接调用内循环
:fileCompare
for /f "delims=" %%b in ('dir /s /b /o:n "%cd%"\backup\*.bak') do (
fc /u "%%a" "%%b" 1>nul 2>nul
if !errorlevel!==0 (
set y=1
echo %%a :文件库已存在该文件
goto end
)
)
:end
_____________________________________________________________
2.search.cmd
_____________________________________________________________
@echo off
setlocal enabledelayedexpansion
color f9
if exist DATA goto start
warn.vbs 0 0
exit
:start
set str=""
set /p str=检索关键词:
if !str!=="" echo 输入无效! && goto start
echo !str!>TEMP
::屏蔽纯空格输入
find /i "echo 处于关闭状态。" TEMP>nul && echo 输入无效!&& goto start
::必须用/c参数,否则检索带空格的词会失效
findstr /r /c:"!str!" DATA>TEMP
warn 4 0
del 检索结果.txt 1>nul 2>nul
ren TEMP 检索结果.txt
cls
goto start
____________________________________________________________
3.main.vbs
____________________________________________________________
set args=wscript.arguments
arg=args(0)
On Error Resume Next
'寻找已有word进程,避免反复开关进程造成运行缓慢
set objWord = getObject(,"word.application")
'无word进程则创建新进程
if objWord="" then
set objWord=createobject("word.application")
end if
objWord.Visible=False
set docfile=objWord.Documents.Open(arg)
str=docfile.Content
docfile.Close
'防止写入txt时丢失换行:把所有换行替换成句号,再由句号替换成回车换行写入
str = Replace(str,chr(13), "。")
str = Replace(str, "。",chr(13)+chr(10))
set objFSO = CreateObject("Scripting.FileSystemObject")
set txtFile = objFSO.OpenTextFile("data", 8)
txtFile.Write str
txtFile.Close
__________________________________________________________
4.warn.vbs
___________________________________________________________
set args=wscript.arguments
arg=args(0)
num=args(1)
if arg=0 then
msgbox "word文件库未建立无法检索!",16
else
if arg=1 then
msgbox "当前目录未找到word文件!",16
else
if arg=2 then
msgbox "关闭已打开的word文件,点确定开始",0
else
if arg=3 then
msgbox "文件库写入了 " & num & " 个文件",0
else
set objFSO = CreateObject("Scripting.FileSystemObject")
set txtFile = objFSO.OpenTextFile("temp", 1)
if txtFile.atendofstream then
msgbox "未检索到关键词!",16
else
str=txtFile.readAll
msgbox str
msgbox "全部结果保存在“检索结果.txt”"
end if
txtfile.close
end if
end if
end if
end if
__________________________________________________________
5.quit.vbs:
__________________________________________________________
On Error Resume Next
set oword = getObject( ,"word.Application" )
oword.quit
__________________________________________________________
6.说明
__________________________________________________________
1.脚本会搜索当前目录及子目录内所有后缀为.doc的文件并写入文件库
2.运行main.cmd创建文件库
3.运行search.cmd进行检索
4.文件库生成DATA数据文件和.bak备份文件
5.要在文件库中加入新的word文件,执行步骤 2;如果与.bak备份存在相同文件则会跳过
6.脚本在磁盘根目录下无法正常运行 |