[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]交流贴,vbs和批处理结合的东西

本帖最后由 普大喜奔 于 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.脚本在磁盘根目录下无法正常运行

本帖最后由 Linuxer 于 2014-9-18 23:06 编辑
  1. 建议楼主给代码都加上code标签
复制代码
问题解决后,请在标题前面注明[已解决],并给回答者加分——化繁为简,提高工作效率!

TOP

给点小建议:
1.建议用 %~dp0 而不是 %cd%\,磁盘根目录下不能够运行的问题应该可以解决,而且以其它方式运行(比如:右键以管理员方式运行)时不会因为工作路径变化而出问题。
2.如果每次仅搜索一个关键词,用 find 就行(findstr 对特殊字符需要进行转义)。

TOP

回复 3# apang
谢啦
按你的办法改了下 在根目录下仍然有FC命令比对未生效的问题 比如 在未增加新的word文件的情况下 仍然会把已经备份过的文件再写入DATA并备份一次 想不通是什么问题
用findstr考虑它可以用正则表达式 很奇怪的是 中间带空格的关键词在不用参数/c的时候会搜索不到 各种匪夷所思。。。
!scripting!

TOP

本帖最后由 apang 于 2014-9-19 01:13 编辑

回复 4# 普大喜奔


    fc /u "%%a" "%%b" 1>nul 2>nul 这里应该是%~1吧?
call :fileCompare "%%a" 这里要补上"%%a"

磁盘根目录下%cd%后面本身带一个反斜杠,这样会导致 dir 等命令失败

TOP

回复 5# apang
非常感谢!
的确是%~dp0更好 把%cd%\替换为%~dp0之后问题解决了
!scripting!

TOP

回复 2# Linuxer
不知如何标注已解决
!scripting!

TOP

回复 7# 普大喜奔

你顶楼帖子下方有“编辑”按钮,重新编辑帖子,在帖子标题前边加上[已解决]即可~


给代码加code标签的方法:
问题解决后,请在标题前面注明[已解决],并给回答者加分——化繁为简,提高工作效率!

TOP

返回列表