『楼 主』:
查找文件并操作(查看路径、复制、删除).bat (9.5更新)
*.bat
现在还有一个问题,源自
for /f "tokens=* delims= " %%a in (%dati%_9.txt) do (find %dati%_6.txt /v /i "%%a">>%dati%_5.txt)
这句,我存过滤的那文件有几行生成的查找文件就有几重复,这个怎么弄掉?
现在就想把恢复删除再重新弄下,搞的自动化点
@echo off
:: 8-31 增加记录日志功能
:: 9-1 增加全盘搜索、完全匹配查找功能
:: 9-2 增加多文件搜索,可自定义添加过滤路径
:: 9-3 增加了搜索文件名时检测“路径中含有搜索的文件名字符串而文件名中没有”就删除掉这个路径
增加了搜索文件名时检测“路径中含有搜索的文件名字符串”就删除掉这个路径,这只是个路径
:: 9-4 增加了搜索文件名过滤,不让用户搜索完全匹配的"windows","system32"等,用户可手动添加删除
:: 各临时文件说明
:: %dati%_9.txt 高级搜索中存放要过滤的文件夹的路径的值
:: %dati%_8.txt 高级搜索中存放"检查本地磁盘并判断类型"查到的值
:: %dati%_7.txt 高级搜索中存放所有本地磁盘盘符的值
:: %dati%_4.txt 高级搜索中存放直接dir路径未经过滤的值
:: %dati%_6.txt 高级搜索中存放直接dir路径并find names后 未经过滤的值
::
:: %dati%_temp.txt 为了高级搜索后确认是否再进行文件名完全匹配查找而生成的暂时临时文件
:: %dati%_1.txt 模糊搜索中存放要过滤的文件夹的路径的值(默认只是本程序所在当前文件夹)
:: %dati%_2.txt 模糊搜索中存放直接dir路径未经过滤的值
:: %dati%_3.txt 模糊搜索中存放过滤路径后dir的值,第一行空,第二行显示------*.txt
:: %dati%_10.txt 高级搜索dir路径并find names后要find_nx而长生的临时文件
:: g_names.txt 高级搜索中存放要查找的文件名s
:: 原理:通过dir路径|find符合所要搜索文件名的字符串来搜索
:000000
cls
mode con lines=30
title 查找文件并操作(查看路径\复制\删除),记录日志 by:Ye - *
echo ________________________________________________________________________________
echo 使用说明:
echo 复制文件日志 copy_log.txt 复制文件默认复制到目录 copy\
echo 删除文件日志 del_log.txt 删除文件默认备份目录 del_backup\
echo 批量恢复日志 backup_log.txt 搜索到文件时的搜索文件名日志 fc_name.txt
echo ________________________________________________________________________________
echo 注意事项:
echo 1 建议使用时请把本程序放在一个单独的文件夹下,因为默认是不搜索程序当前所在目
echo 录的,还有工作中要生成好多临时文件在目录下
echo 2 输入要查找的文件名时,为了更准确的找到文件请尽量带上后缀
echo 连在一起的字符搜索就好,不要使用*,如搜索***x.txt,直接填x.txt搜索就好
echo 3 输入搜索路径时,如搜索 c 盘则输入 c:\ ,建议去地址栏中直接复制地址粘贴过来
echo 4 任何位置输入半角状态下的以下11个符号中的任何一个都会引起无法预料的错误
echo 它们分别是\、/、:、*、?、"、<、>、(、)、|
echo 除路径中可以输入冒号(紧跟盘符)和反斜杠符号
echo 5 使用本程序建议系统时间使用24小时制
echo ________________________________________________________________________________
echo 按任意键进入查找......
pause>nul
:start
cls
mode con lines=24
echo ________________________________________________________________________________
echo.
echo 模糊搜索:只支持单文件单目录搜索,不支持过滤目录,不支持文件名完全匹配查找
echo.
echo 高级搜索:支持多文件单目录或全盘同时搜索,支持过滤目录,支持文件名完全匹配查找
echo.
echo m 模糊搜索 ^| g 高级搜索
echo ________________________________________________________________________________
set mg_xz=
set /p mg_xz= 请输入操作代码:
if "%mg_xz%"=="" (echo 无效动作 & pause && goto start)
for %%i in (m g) do if %mg_xz%==%%i goto mg_%%i
echo 无效动作 & pause && goto start
:: --------------------------------------------------------------------------------------------------------------------
:mg_m
cls
title 模糊搜索
echo.
echo.
set name=
set lj=
set /p name= 请输入要查找的文件名:
if "%name%"=="" echo 请输入正确的文件名 &pause& goto mg_m
set /p lj= 请输入搜索路径:
if "%lj%"=="" echo 请输入正确的路径 &pause& goto mg_m
echo 请稍侯......
:: 此处获取当前日期时间变量做文件名是为了防止当用一个固定文件名时程序无故终止而这个固定文件名没有删除,可能导至下次查找错误
:: 还有个好处是恢复删除文件方便多了,再后面就会看出
:: 要是不判断比如说凌晨2点,则%dati%的值就像是 06-08-31 20000,中间多了个空格,后面就会出错,我12小时制
if %time:~0,2% lss 10 (set dati=%date:~2,8%0%time:~1,1%%time:~3,2%%time:~6,2%) else (set dati=%date:~2,8%%time:~0,2%%time:~3,2%%time:~6,2%)
:: 不搜索程序当前所在目录
echo %cd%>>%dati%_1.txt
dir /a /s /b "%lj%" |find "%name%">>%dati%_2.txt
for /f "tokens=* delims=" %%i in (%dati%_1.txt) do (find /i /v %dati%_2.txt "%%i">>%dati%_3.txt)
echo.>>%dati%.txt
for /f "skip=2 tokens=* delims=" %%a in (%dati%_3.txt) do (echo %%a>>%dati%.txt)
:: 如果%dati%.txt文件无内容goto no,有则goto ok
findstr . %dati%.txt>nul && (echo %dati%,搜索文件名,%name%,搜索成功>>fc_name.txt & goto ok)||goto no
:: echo 记录以前所有搜索到文件时的搜索文件名,后面利用文件名恢复时用
:: --------------------------------------------------------------------------------------------------------------------
:mg_g
del /q g_names_temp.txt g_names.txt g_names_guolv.txt g_names_guolv_jiance.txt
cls
title 高级搜索
echo ________________________________________________________________________________
echo.
echo 支持多文件名同时搜索(最多5个)
echo.
echo 输入多文件名时,中间用'半脚状态下的逗号'隔开,格式例如:a.txt,b.txt,c.txt,d.txt
echo ________________________________________________________________________________
set names=
set /p names= 请输入要查找的文件名:
if "%names%"=="" echo 请输入正确的文件名 &pause& goto mg_g
echo %names%>g_names_temp.txt
:: 要过滤的文件名
echo windows>>g_names_guolv.txt
echo system32>>g_names_guolv.txt
:: 此处可继续添加文件名过滤,前提是保证格式正确
cd.>g_names_guolv_jiance.txt
for /f "tokens=1 delims=," %%a in (g_names_guolv.txt) do (>>g_names_guolv_jiance.txt findstr /x /i "%%a"<g_names_temp.txt)
echo.
findstr . g_names_guolv_jiance.txt>nul && goto g_names_guolv_jiance_no||goto g_names_guolv_jiance_ok
:g_names_guolv_jiance_no
echo 你输入的%names%文件名含有被过滤的字符,按任意键重新输入别的文件名 &pause>nul& goto mg_g
:g_names_guolv_jiance_ok
for /f "tokens=1,2,3,4,5 delims=," %%i in (g_names_temp.txt) do (
if not "%%i"=="" echo %%i>>g_names.txt
if not "%%j"=="" echo %%j>>g_names.txt
if not "%%k"=="" echo %%k>>g_names.txt
if not "%%l"=="" echo %%l>>g_names.txt
if not "%%m"=="" echo %%m>>g_names.txt
)
del /q g_names_temp.txt g_names_guolv.txt g_names_guolv_jiance.txt
:mg_g_guolv
:: 获取日期+时间变量
set dati=
if %time:~0,2% lss 10 (set dati=%date:~2,8%0%time:~1,1%%time:~3,2%%time:~6,2%) else (set dati=%date:~2,8%%time:~0,2%%time:~3,2%%time:~6,2%)
cls
echo.
echo.
echo 搜索时排除的目录,目录下及子目录下的所有文件将不会被搜索
echo ________________________________________________________________________________
echo.
:mg_g_guolv_zj
set guolv_wjj_zj=
set /p guolv_wjj_zj= 不需要搜索本程序所在的当前文件夹[y/n]:
if "%guolv_wjj_zj%"=="" (echo 无效动作 & pause && goto mg_g_guolv)
if "%guolv_wjj_zj%"=="y" (echo %cd%>>%dati%_9.txt & goto mg_g_guolv_hsz)
if "%guolv_wjj_zj%"=="n" goto mg_g_guolv_hsz
echo 无效动作 & pause && goto mg_g_guolv
:mg_g_guolv_hsz
echo.
set guolv_wjj_hsz=
set /p guolv_wjj_hsz= 不需要搜索回收站[y/n]:
if "%guolv_wjj_hsz%"=="" (echo 无效动作 & pause && goto mg_g_guolv)
if "%guolv_wjj_hsz%"=="y" (
@call :dir_all & for /f "tokens=* delims= " %%i in (%dati%_7.txt) do (echo %%iRECYCLER>>%dati%_9.txt)
goto mg_g_guolv_mulu
)
if "%guolv_wjj_hsz%"=="n" goto mg_g_guolv_mulu
echo 无效动作 & pause && goto mg_g_guolv
:mg_g_guolv_mulu
echo.
set guolv_wjj_mulu=
set /p guolv_wjj_mulu= 是否还有不需要搜索的目录[y/n]:
if "%guolv_wjj_mulu%"=="" (echo 无效动作 & pause && goto mg_g_guolv)
if %guolv_wjj_mulu%==y goto mg_g_guolv_addmulu
if %guolv_wjj_mulu%==n goto mg_g_guolv_end
echo 无效动作 & pause && goto mg_g_guolv
: mg_g_guolv_addmulu
set guolv_wjj_mulus=
set /p guolv_wjj_mulus= 请输入目录的绝对路径(支持输入多路径,路径之间用'半脚状态下的逗号'隔开,留空表示没有不需要搜索的目录):
if "%guolv_wjj_mulus%"=="" goto mg_g_guolv_end
echo %guolv_wjj_mulus%>%dati%_9_temp.txt
for /f "tokens=1,2,3 delims=," %%i in (%dati%_9_temp.txt) do (
if not "%%i"=="" if exist %%i echo %%i>>%dati%_9.txt
if not "%%j"=="" if exist %%j echo %%j>>%dati%_9.txt
if not "%%k"=="" if exist %%k echo %%k>>%dati%_9.txt
)
:: del /q %dati%_9_temp.txt
:mg_g_guolv_end
echo ________________________________________________________________________________
echo 按任意键继续......
pause>nul
:mg_g_qr
cls
echo ________________________________________________________________________________
echo.
echo 你要查找的文件名是:%names%
echo.
echo 不搜索本程序所在的文件夹[y/n]:%guolv_wjj_zj%
echo.
echo 不搜索回收站[y/n]:%guolv_wjj_hsz%
echo.
echo 不搜索下列目录:%guolv_wjj_mulus%
echo.
echo 0 返回重新输 ^| y 继续下一步
echo ________________________________________________________________________________
set qr_xz=
set /p qr_xz= 请输入操作代码:
if "%qr_xz%"=="" (echo 无效动作 & pause && goto mg_g_qr)
if "%qr_xz%"=="y" goto mg_g_lj
if "%qr_xz%"=="0" del /q %dati%_9.txt & goto mg_g
echo 无效动作 & pause && goto mg_g_qr
:mg_g_lj
cls
echo ________________________________________________________________________________
echo.
echo 只支持单路径搜索,可以全盘搜索(只限xp sp2),全盘搜索输入all,包括光盘和U盘
echo ________________________________________________________________________________
echo.
set lj=
set /p lj= 请输入搜索路径:
if "%lj%"=="" echo 请输入正确的路径 &pause& goto mg_m_lj
if "%lj%"=="all" goto all_find
echo.
echo 请稍侯......
dir /a /s /b "%lj%">>%dati%_4.txt
dir /ad /s /b "%lj%">>%dati%_fcname_mulu_temp.txt
:fc_guolv_lj
:: dir搜索路径(生成%dati%_4.txt)后find 搜索name (生成%dati%_6_temp.txt) 再 call :find_nx 后生成%dati%_6.txt
for /f "tokens=1 delims=*" %%a in (g_names.txt) do (
>>%dati%_6_temp.txt find /i "%%a"<%dati%_4.txt && call :find_nx %%a
>>%dati%_fcname_mulu.txt find /i "%%a"<%dati%_fcname_mulu_temp.txt
)
:: 下面这句的作用是:比如我们搜索的文件名是abc.exe,而c下正好有个目录abc.exe,在经过上面的那一步后,那么目录c:\abc.exe这个
:: 目录还是存在的,而我们要的是文件名,不是目录,我们经过这一步就可以解决这个问题,windows自带的搜索没有解决这问题
for /f "tokens=1 delims=," %%i in (%dati%_fcname_mulu.txt) do (>>%dati%_6.txt findstr /v /i "%%i"<%dati%_6_temp2.txt)
echo.>>%dati%_temp.txt
:: 如果有%dati%_9.txt文件,就是如果有要过滤的路径,显示%dati%_6.txt中除过滤路径所有路径到%dati%_5.txt
:: 如果没有%dati%_9.txt文件,直接复制%dati%_6.txt 为 %dati%_5.txt 就好
if exist %dati%_9.txt (
for /f "tokens=* delims= " %%a in (%dati%_9.txt) do (>>%dati%_temp.txt find /v /i "%%a"<%dati%_6.txt)
)||copy %dati%_6.txt %dati%_temp.txt
goto fc_temp.txt
:all_find
echo.
echo 请稍侯......全盘搜索可能要多等一会
:: 全盘搜索
if not exist %dati%_7.txt @call :dir_all
for /f "tokens=* delims= " %%i in (%dati%_7.txt) do (
dir /a /s /b "%%i">>%dati%_4.txt & dir /ad /s /b "%%i">>%dati%_fcname_mulu_temp.txt
)
goto fc_guolv_lj
:fc_temp.txt
:: 如果%dati%_temp.txt文件无内容goto no,有则goto ok
findstr . %dati%_temp.txt>nul && (echo %dati%,搜索文件名,%names%,搜索成功>>fc_name.txt & goto ok_temp)||goto no
:: --------------------------------------------------------------------------------------------------------------------
:no
echo.
echo 在路径%lj%中没有找到你要搜索的文件%names%,按任意键重新查找 & del /q 06-*************.txt &pause>nul && goto start
:: --------------------------------------------------------------------------------------------------------------------
:ok_temp
cls
title 是否进行文件名完全匹配查找?
echo ________________________________________________________________________________
echo.
echo y 进行文件名完全匹配查找 ^| n 不进行文件名完全匹配查找
echo ________________________________________________________________________________
set fjq=
set /p fjq= 请输入操作代码:
if "%fjq%"=="" (echo 无效动作 & pause && goto ok_temp)
for %%i in (y,n) do if %fjq%==%%i goto fjq_%%i
echo 无效动作 & pause && goto ok_temp
:fjq_y
cd.>%dati%.txt
for /f "tokens=* delims=*" %%a in (g_names.txt) do (
for /f "skip=1 tokens=*" %%i in (%dati%_temp.txt) do (if /i "%%~nxi"=="%%a" echo %%~dpnxi>>%dati%.txt)
)
findstr . %dati%.txt>nul && (echo %dati%,搜索文件名完全匹配,%names%,搜索成功>>fc_name.txt &del /q %dati%_temp.txt&& goto ok)||goto no
:fjq_n
copy %dati%_temp.txt %dati%.txt && goto ok
:: --------------------------------------------------------------------------------------------------------------------
:: --------------------------------------------------------------------------------------------------------------------
:ok
cls
echo ________________________________________________________________________________
echo 在路径%lj%中成功找到你要查找的文件%name%:
echo.
echo 建议先查看路径列表,符合你愿再执行相关操作,如不符合请修改路径列表
echo 现在的路径列表有重复,建议打开删除重复的
echo.
echo a 退出 ^| b 查看\修改路径列表 ^| c 复制 ^| d 删除 ^| e 恢复删除
echo ________________________________________________________________________________
set xz=
set /p xz= 请输入操作代码:
if "%xz%"=="" (echo 无效动作 & pause && goto ok)
for %%i in (a b c d e) do if %xz%==%%i goto ok_%%i
echo 无效动作 & pause && goto ok
:: ---------------------------------------------------------------------------------------------------
:ok_a
goto end
:: ---------------------------------------------------------------------------------------------------
:ok_b
cls
title 查看\修改路径列表
echo ________________________________________________________________________________
echo.
echo 修改路径列表文件注意事项
echo.
echo 手工删除不需要执行操作的行,整行整行删除,修改后保存
echo 例如: 我在c:\查找abc.txt文件生成的%dati%.txt文件内容如下
echo ╭────────────────────────╮
echo │c:\abc\abc.txt │
echo │c:\abc\abc.txt\ccc.txt │
echo │c:\abc\aaabc.txt │
echo │ │
echo ╰────────────────────────╯
echo 而我不想对 c:\abc\abc.txt\ccc.txt 进行操作,那就把文件内容修改为
echo ╭────────────────────────╮
echo │c:\abc\abc.txt │
echo │c:\abc\aaabc.txt │
echo │ │
echo ╰────────────────────────╯
echo 直接删除c:\abc\abc.txt\ccc.txt那一行,中间不要留空行
echo ________________________________________________________________________________
echo 按任意键打开路径列表文件......
pause>nul & start %dati%.txt & goto ok
:: ---------------------------------------------------------------------------------------------------
:ok_c
cls
title 复制查找到的文件
echo ________________________________________________________________________________
echo.
echo 请把要复制到的文件夹拖曳至本窗口并回车执行操作,不支持手工输入路径
echo.
echo 默认复制到当前目录的copy\%dati%下,如没有此文件夹则自动创建(推荐做法)
echo.
echo y 执行默认 ^| 0 返回上级菜单
echo ________________________________________________________________________________
set clj=
set /p clj= 请输入操作代码:
set "clj=%clj:"=%"
:: 上面这句为判断%clj%中是否存在引号,有则剔除,抄自"文件备份器"
if "%clj%"=="" echo 无效动作 & pause && goto ok_c
if %clj%==0 goto ok
if %clj%==y (
:: 复制并记录日志
md copy\%dati%
for /f "skip=1 tokens=* delims=" %%i in (%dati%.txt) do (copy "%%i" copy\%dati%\ )&&(echo %dati%,将源文件,%%i,复制到,copy\%dati%\%%~nxi>>copy_log.txt)
echo ######################################>>copy_log.txt
echo %dati%,搜索文件名,%name%,执行复制 >>fc_name.txt
goto ok
)
if exist "%clj%" (
:: 复制并记录日志
for /f "skip=1 tokens=* delims=" %%i in (%dati%.txt) do (copy "%%i" "%clj%\" )&&(echo %dati%,将源文件,%%i,复制到,copy\%dati%\%%~nxi >>copy_log.txt)
echo ######################################>>copy_log.txt
echo %dati%,搜索文件名,%name%,执行复制 >>fc_name.txt
)|echo 请输入正确的路径 &pause& goto ok_c
goto ok
:: ---------------------------------------------------------------------------------------------------
:ok_d
cls
title 删除查找到的文件
echo ________________________________________________________________________________
echo.
echo 此操作危险性高,请再次确认是否删除?
echo.
echo y 确认删除 ^| 0 返回上级菜单
echo ________________________________________________________________________________
set del_=
set /p del_= 请输入操作代码:
if "%del_%"=="" echo 无效动作 & pause && goto ok_d
if %del_%==0 goto ok
if %del_%==y (
:: 先备份后删除
:: 备份
md del_backup\%dati%
for /f "skip=1 tokens=* delims=" %%i in (%dati%.txt) do (copy "%%i" del_backup\%dati%\ )&&(echo %dati%,备份已删除文件,%%i,到,del_backup\%dati%\%%~nxi>>del_log.txt)
:: 删除并记录日志
for /f "skip=1 tokens=* delims=" %%i in (%dati%.txt) do (del /q /f "%%i")
echo ######################################>>del_log.txt
echo %dati%,搜索文件名,%name%,执行删除 >>fc_name.txt
goto ok
)
echo 无效动作 & pause && goto ok_d
:: ---------------------------------------------------------------------------------------------------
:ok_e
cls
title 恢复已删除的文件
if not exist del_backup\ echo 没有任何可以恢复的文件,按任意键返回上级菜单 &pause>nul&goto ok
echo ________________________________________________________________________________
echo 请根据del_log.txt和备份目录手工写恢复文件列表,执行批量恢复
echo.
echo 列表格式如下: (列表文件名必须为backup.txt)
echo.
echo 逗号左边:要恢复的文件 逗号右边:要恢复到的目录
echo ╭───────────────────────────────╮
echo │del_backup\06-08-31020000\abc.txt,c:\windows\ │
echo │del_backup\06-08-31020000\aaabc.txt,c:\windows\system32\ │
echo │ │
echo │ │
echo ╰───────────────────────────────╯
echo 0 返回上级菜单 ^| a 执行批量恢复
echo ________________________________________________________________________________
set xz_hf=
set /p xz_hf= 请输入操作代码:
if "%xz_hf%"=="" (echo 无效动作 & pause && goto ok_e)
if %xz_hf%==0 goto ok
if %xz_hf%==a goto ok_e_a
echo 无效动作 & pause && goto ok_e
:ok_e_a
if not exist backup.txt echo 没有backup.txt文件,按任意键返回 &pause>nul&goto ok_e
for /f "tokens=1,2 delims=," %%i in (backup.txt) do (copy %%i %%j)&&(echo %dati%,恢复文件,%%i,到目录,%%j>>backup_log.txt)
echo ######################################>>backup_log.txt
echo 完成批量恢复操作 & pause && goto ok
:: ---------------------------------------------------------------------------------------------------
:end
del /q 06-***********.txt
del /q 06-*************.txt
del /q 06-******************.txt
del /q g_names_temp.txt
del /q g_names.txt
del /q
goto start
:: ---------------------------------------------------------------------------------------------------
:: ---------------------------------------------------------------------------------------------------
:: ---------------------------------------------------------------------------------------------------
:: call调用
:dir_all
:: 检查本地磁盘并判断类型,抄自中国dos联盟
:: 如只想搜索本地硬盘则在>>%dati%_8.txt前面加上|find "固定" 既可
setlocal enabledelayedexpansion
for /f "skip=1 tokens=1,2 delims=\" %%a in ('fsutil fsinfo drives^|find /v ""') do (
set aa=%%a
set aa=!aa:~-2!
for %%i in (!aa!) do fsutil fsinfo drivetype %%i >>%dati%_8.txt
)
:: 写出本地磁盘盘符到%dati%_7.txt文件下
for /f "tokens=1 delims= " %%a in (%dati%_8.txt) do (echo %%a\>>%dati%_7.txt)
:find_nx
:: 从[dir搜索路径(生成%dati%_4.txt)后find 搜索name (生成%dati%_6_temp.txt)]中再在每个%dati%_6_temp.txt中的路径的
:: 文件名中find 搜索name 并记录符合的路径到%dati%_6.txt , 这样可防止(比如我们搜索的文件名是windows,如果我们不这样做,
:: 那windows下所有文件都会显示在%dati%_6.txt中,因为它们的路径中有搜索name,而文件名中不一定有搜索name)
if not "%1"=="" (
for /f "tokens=1 delims=*" %%a in (%dati%_6_temp.txt) do (
echo "%%~nxa">>%dati%_10.txt & (find /i %dati%_10.txt "%1" &&echo %%~dpnxa>>%dati%_6_temp2.txt||echo.>nul)
del /q %dati%_10.txt
)
) [ Last edited by he200377 on 2006-9-6 at 02:52 ]
|