zoukankan      html  css  js  c++  java
  • [批处理]全盘搜索批量文件

    引子

    前两天,应一学长的请求去他宿舍给他看看毕业设计的问题
    结果去了才发现他从网上下载的CRM系统连编译都编译不过,更别谈运行问题了
    看了下主要是这个系统用到了很多开源第三方控件库,而下载的时候都没有,需要自己去找
    他的电脑里有一部分DLL,还缺少一部分,关键是他差的很多,一共缺少将近20个DLL
    而在他电脑里的其中一部分DLL还找不到在哪,找了很久都没找到,所以我说我给你写个从全盘去找吧,
    然后着手去做,发现问题重重,最终也没做成,弄得很没面子,回到宿舍赶快去研究了下重写了个完整的,现在放出来

    简述

    本批处理的特色就是可以在全盘下同时搜索一组文件名
    全盘搜索Windows本身也自带了(Win+F就是全盘搜索),但是只能搜索一个文件,不能同时搜索多个文件
    所以才有个这个批处理的存在性

    使用方法

    先选择搜索模式,不同的搜索模式结果显示的不同,但结果完全一样
    模式1适用于1-3个文件
    模式2适用于3个以上文件

    搜索模式1:



    然后输入要搜索的一组文件名
    例如下面的例子就是我要同时搜索以Rec开头的压缩文件和以HD空格开头的压缩文件
    每个要搜索的文件名之间用/符号分隔开


    可以看到在C盘E盘都没有找到符合这个条件的文件
    在D盘同时看到了符合这两条条件的文件


    搜索模式2:

    刚刚看到了搜索模式1的结果显示
    是把所有符合条件的文件统统列在一起,而没有顺序,之所以上图按照顺序是因为结果文件少
    如果大量符合条件,就没有顺序可言了,所有对于同时搜索多个文件不利于查看结果,所以才有了搜索模式2
    模式2是把每个盘下的每个文件结果都分别列出来,而不是想这个一盘下列出所有文件


    通过这张图可以很好的理解模式2的搜索方式
    会分别列出要搜索的每一个文件的结果

    批处理代码,保存至bat文件运行即可:

    @echo off&title 全盘搜索批量文件       小小沧海2012-3-6
    setlocal EnableDelayedExpansion
    rem 过滤器,要搜索的一组文件,每一个文件用/符号隔开,例:Rec*.rar/HD *.rar
    set filter=
    rem 子过滤器,用于在每个分区下搜索文件的临时过滤器
    set subf=
    set volume=
    
    rem 模式1使用的是在每一分区内把要搜索的文件全部显示在一块,没有顺序
    rem 模式2使用的是在每一分区内分别显示出搜索的每一个文件
    :choose
    echo ********全盘搜索批量文件*******
    echo ┏━━━━━━━━━━━━━━┓
    echo ┃模式[1]:适用于搜索少量文件 ┃
    echo ┃模式[2]:适用于搜索大量文件 ┃
    echo ┗━━━━━━━━━━━━━━┛
    echo 请选择搜索模式:
    set choose=n&set /p choose=
    if not %choose%==1 (if not %choose%==2 cls&goto choose)
    
    :filter
    rem 如果过滤器没有被事先定义则提示由用户手动输入
    if "%filter%"=="" (
      echo ┏━━━━━━━━━━━━━━━━━━━━━━━┓
      echo ┃每个文件之间用/符号分隔开,例如a*b.txt/d?e.*  ┃
      echo ┃支持通配符?和*,不要包含其他特殊符号          ┃
      echo ┗━━━━━━━━━━━━━━━━━━━━━━━┛
      echo 请输入要搜索的批量文件:
      set filter=n&set /p filter=
      if "!filter!"=="n" (set filter=& cls & goto :filter)
      set filter=!filter:"=!
    )
    
    rem 如果使用模式1则需要将过滤器修正为模式1支持的形式
    rem 模式1使用dir命令自带的查找批量文件功能,形式为每个文件加双引号并用空格隔开,例"a*.*" "e?f.doc"
    if %choose%==1 (
      set filter="!filter:"=!"
      set filter=!filter:/=" "!
    )
    for /f "tokens=3" %%i in ('echo list volume ^| diskpart ^| findstr "磁盘分区"') do (
      set volume=%%i
      if %choose%==1 (
        echo.&echoecho ┃正在查找^<!volume!^>盘下的^<!filter!^>文件...
        echo ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━
        cd /d "!volume!:"
        dir !filter! /s /b /a
      ) else if %choose%==2 (
        set subf=!filter!
        if not "!subf!"=="" (call :mode2 "!filter!") else echo -^>开始查找下一分区
      )
    )
    echo.&echo.
    echo ┏━━━━━━━━━┓
    echo ┃搜索完成!!      ┃
    echo ┗━━━━━━━━━┛
    rem 在set filter=后面和&符号之间不能有空格,无空格是把filter变量删除,有空格是赋予一个空格
    echo 按任意键返回
    pause>nul & set filter=& cls & goto choose
    
    :mode2
    rem %0为函数名称自身:mode2,%1为传过来的值,%~1为删除变量中的双引号"
    set subf=%~1
    rem 在此子搜索函数中把过滤器按照/符号分割开,并取得分割后的第一个的值
    rem 再把分割后的剩下的值重赋予过滤器,并调用自身,直到过滤器为空为止,返回
    for /f "tokens=1,* delims=/" %%j in ("%subf%") do (
      echo.&echoecho ┃正在查找^<!volume!^>盘下的^<%%j^>文件...
      echo ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━
      dir "!volume!:""%%j" /s /b /a
      set subf=%%k
    )
    if not "!subf!"=="" (call %0 "!subf!")
    goto :eof
    View Code

     ——原文发表于2012-3-11 08:57

  • 相关阅读:
    FCK常用Js,获取FCK内容,统计FCK字数,向FCK写入指定代码
    asp 点击链接 下载图片文件
    使用微软的 Visual Studio International Pack 1.0 进行网站简体与繁体的互转和得到汉字、拼音、笔画
    mysql alter 语句用法,添加、修改、删除字段等
    C#指定窗口显示位置的方法
    Soukey采集软件源码
    [转](收藏)《博客园精华集》分类索引
    YUI CSS Foundation讲座 博客文库 博客园
    sql group by 和having
    sql 多表查询
  • 原文地址:https://www.cnblogs.com/xxcanghai/p/4584086.html
Copyright © 2011-2022 走看看