中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-02 02:27
48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,250 会员排行
DOS批处理 & 脚本技术(批处理室) » 查找文件并操作(查看路径、复制、删除).bat (9.5更新)
可打印版本  7,839 / 23
第1楼 vkill 发表于 2006-08-31 14:02
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
查找文件并操作(查看路径、复制、删除).bat (9.5更新)
*.bat

现在还有一个问题,源自
for /f "tokens=* delims= " %%a in (%dati%_9.txt) do (find %dati%_6.txt /v /i "%%a">>%dati%_5.txt)
这句,我存过滤的那文件有几行生成的查找文件就有几重复,这个怎么弄掉?


现在就想把恢复删除再重新弄下,搞的自动化点



[ Last edited by he200377 on 2006-9-6 at 02:52 ]
第2楼 namejm 发表于 2006-08-31 14:55
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  不错不错,比较有实用性。

  当然,瑕疵也是有的,并且有些可能会导致很严重的后果:

  1、对于每用set /p设置的变量,在接收用户的输入之前,都应该设置成空值,否则,下次再goto start回来之后,连续按几个回车键,将重复上次的操作,可能会导致用户数据的损失;

  2、一旦要接收用户的输入,就应该有几句输入错误检测语句,对比较严重的输入错误进行检测,以防意外;

  3、要随时注意对含空格字符串的处理;比如:copy %%i,%%i 的值就有可能存在空格,不用引号引起来是会出错的;for "delims=," %%i in (a.txt) 一句中似乎应该加一句 tokens=* 、del %%i 中用引号把 %%i 括起来……类似的地方还有好几处,请注意修改;

  4、执行过程中,可能等待的时间较长,应该在屏幕上有所提示,无关的信息应该cls掉;

  楼主如果能再完善一下的话,这个脚本就更好用了。

[ Last edited by namejm on 2006-8-31 at 15:00 ]
第3楼 vkill 发表于 2006-08-31 15:13
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
谢谢楼上的指导

第1条 我确实没有想到,这个应该注意
第2条 我想应该还要屏蔽 , | & 和 空格,因为我试了只要在输入状态下只要输入这几个字符就强制退出了,这个是懒没有加上过滤,哎

第3条 恩,这样改好点
第4条 我认为执行很快的,就2s左右,就没有写上提示

楼上帮我改该~呵呵,先谢谢了,我看看具体哪些地方我没有注意到

[ Last edited by he200377 on 2006-8-31 at 15:15 ]
第4楼 namejm 发表于 2006-08-31 17:14
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Originally posted by he200377 at 2006-8-31 15:13:

  第2条 我想应该还要屏蔽 , | & 和 空格,因为我试了只要在输入状态下只要输入这几个字符就强制退出了,这个是懒没有加上过滤,哎
  ——|、&等字符属于CMD的敏感字符,你是没法过滤掉的,只有空格还行

  第4条 我认为执行很快的,就2s左右,就没有写上提示
  ——如果用户指定了多个路径,或者某个路径下的子文件夹及文件很多的话,搜索的时间就不会只有区区两秒钟了,看来你的测试条件没有上足


  其实还有几个地方要修改的:比如第二句的 cmd /c 就显得多余了;若要吹毛求疵的话,还是可以找到一些的。
第5楼 namejm 发表于 2006-08-31 17:22
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  来一个修改版本,只修改了前面提到的大部分问题,并把容易引起误解的提示语句稍作修改,输入错误检测那一段要考虑的情况比较多,暂时没时间去完善;查询的时候添加什么提示信息,楼主可以自行决定,我就不去添加了;楼主可以对比一下前后的代码,在需要完善的地方继续修改:

@echo off
:start
cls
title 查找文件并操作(查看路径\复制\删除)
set name=
set /p name=请输入要查找的文件名(最好带后缀名):
set lj=
set /p lj=请输入搜索路径(如搜索c盘请输入c:\):


dir /a /s /b "%lj%" |find "%name%" >a.txt
if errorlevel 1 goto no
if errorlevel 0 goto ok

:no
echo 没有你找的文件 & pause && goto end

:ok
cls
echo ________________________________________________________________
echo 找到文件:
echo.
echo a 查看路径 ^| b 退出 ^| c 复制 ^| d 删除
echo ________________________________________________________________
set xz=
set /p xz= 请输入操作代码:
if not "%xz%"=="" (goto ok_%xz%) else (echo 无效动作 & pause && goto ok)
echo 无效动作 & pause && goto ok

:ok_a
cls
title 查看查找到的文件路径
type a.txt &pause& goto ok
:ok_b
goto end
:ok_c
cls
title 复制查找到的文件
echo ________________________________________________________________
echo.
echo 默认复制到当前目录的temp文件夹下,如没有temp文件夹则自动创建
echo.
echo y 执行默认 ^| 0 返回上级菜单
echo ________________________________________________________________
set clj=
set /p clj= 请输入要复制到的位置:
if %clj%==0 goto ok
if %clj%==y md temp & for /f "tokens=* delims=" %%i in (a.txt) do copy "%%i" temp\
for /f "tokens=* delims=" %%i in (a.txt) do copy "%%i" "%clj%\"
goto end
:ok_d
cls
title 删除查找到的文件
echo ________________________________________________________________
echo.
echo 此操作危险性高,请再次确认要删除?
echo.
echo y 确认 ^| 0 返回上级菜单
echo ________________________________________________________________
set del_=
set /p del_= 请选择:
if "%del_%"=="" echo 无效动作 & pause && goto ok
if %del_%==0 goto ok
if %del_%==y for /f "tokens=* delims=" %%i in (a.txt) do del /q /f "%%i"
echo 无效动作 & pause && goto ok

:end
del /q a.txt
goto start


[ Last edited by namejm on 2006-8-31 at 17:27 ]
第6楼 vkill 发表于 2006-08-31 18:11
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
谢谢,我回去再看看
第7楼 vkill 发表于 2006-09-01 13:23
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
做个记号

是因为用到了 call :标号 参数

附件
做恢复删除的时候想到的.rar (871 bytes)
第8楼 namejm 发表于 2006-09-01 17:17
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Re he200377顶楼:

  你现在的代码存在一个致命的错误:dir /a /s /b "%lj%" |find "%name%" >%dati%.txt,这条语句是无法实现查询的,所以我把相关的语句修改了一下,实现了你想要的完全匹配查找的意图:


  至于不搜索脚本文件所在的目录,暂时还没想到高效的办法,变通的做法是从查找到的结果中把脚本文件所在目录的记录删除。

  其他的小问题还是存在的:比如,每次查询之前,都要把日志内容清空,免得和上一次的结果混在一起。
第9楼 namejm 发表于 2006-09-01 17:18
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Originally posted by he200377 at 2006-9-1 13:23:
做个记号

是因为用到了 call :标号 参数

没明白你发这个帖子的意图,请说明一下好吗?
第10楼 vkill 发表于 2006-09-01 17:29
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
比如,每次查询之前,都要把日志内容清空,免得和上一次的结果混在一起

每次生成的文件是已日期+时间(精确到到s)来命名的,所以就算中间中断也没有关系的,原理上说是不会生成一个同名文件的

[ Last edited by he200377 on 2006-9-1 at 17:39 ]
第11楼 vkill 发表于 2006-09-01 17:31
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
Originally posted by namejm at 2006-9-1 17:18:

没明白你发这个帖子的意图,请说明一下好吗?

只是在测试的时候想到了用就试着用了下
第12楼 vkill 发表于 2006-09-01 17:39
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
不明白这个? "%%~nxi" 那到是文件名,查了下以前的帖子 ~dp是路径,我想这个就是文件名了

//试了下明白了

[ Last edited by he200377 on 2006-9-1 at 17:48 ]
第13楼 namejm 发表于 2006-09-01 22:09
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Originally posted by he200377 at 2006-9-1 17:29:
比如,每次查询之前,都要把日志内容清空,免得和上一次的结果混在一起

每次生成的文件是已日期+时间(精确到到s)来命名的,所以就算中间丠...


  你还是漏掉了一个非常重要的文件:fc_name.txt。这个文件你漏掉的话,麻烦就大了——如果你分几次查询不同的文件,然后直接就选了删除,嘿嘿,你就等着哭鼻子吧:P
第14楼 namejm 发表于 2006-09-01 22:13
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  全盘查找指定文件的功能,我头两天弄了一个,发出来给你借鉴一下吧。


[ Last edited by namejm on 2006-9-1 at 23:08 ]
第15楼 vkill 发表于 2006-09-03 01:37
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
Originally posted by namejm at 2006-9-1 22:13:
  全盘查找指定文件的功能,我头两天弄了一个,发出来给你借鉴一下吧。
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023