中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 排除删除和对比删除 欢迎测试和完善
« [1] [2] »
作者:
标题: 排除删除和对比删除 欢迎测试和完善 上一主题 | 下一主题
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『楼 主』:  排除删除和对比删除 欢迎测试和完善

排除删除
@echo off
::如果有多个路径,或者排除多个文件夹:::
::或者排除多个文件,请手工进行设置:::::
::findstr 后面可以跟多个/c:""参数::::::
::如:/c:"game" /c:"qq" /c:"net"  ::::::
::中间使用空格间隔:::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::
:: code by zzlike 2006-12-11 CMD@XP::::
::******配置文件开始*****************::
::::::::指定搜索路径::例 e:\ ::::::::::
set "dd=e:\"
::::::::排除文件夹:::::::::::::::::::::
set "dn=game"
::::::::排除文件:::::::::::::::::::::::
set "fn=排除删除文件夹.bat"
::******配置文件结束*****************::
::::::::删除文件夹:::::::::::::::::::::
for /f "delims=" %%i in ('dir /b /ad "%dd%" ^|findstr /i /v /b /e /c:"%dn%"') do attrib -s -h -r -a /s /d "%%i" && rd /s /q "%%i" && echo 已删除目录"%%~fi"
::::::::删除文件:::::::::::::::::::::::
for /f "delims=" %%i in ('dir /b /a-d "%dd%" ^|findstr /i /v /b /e /c:"%fn%"') do del /a /f /q "%%i" && echo 已删除文件"%%~fnxi"
对比删除
@echo off && setlocal enabledelayedexpansion
::主要用于全盘远程对比更新:::::::::::::
::如果本地测试请自行修改:::::::::::::::
::本地对比更新已通过测试:::::::::::::::
::远程对比更新未测试:::::::::::::::::::
::此代码效率不高,只为演示:::::::::::::
:: code by zzlike 2006-12-11 CMD@XP::::
:::::::::::::::::::::::::::::::::::::::
::******配置文件开始*****************::
::::::::源目录:::::::::::::::::::::::::
set sd=\\192.168.0.14\d\
::::::::目标盘:::::::::::::::::::::::::
set dd=d:\
::******配置文件结束*****************::
::::::::映射网络路径:::::::::::::::::::
net use x: %sd%
::::::::生成文件列表:::::::::::::::::::
echo. > sd.txt
echo. > dd.txt
for /r "x:\" %%i in (*) do echo %%~pnxi >> sd.txt
for /r "%dd%" %%i in (*) do echo %%~pnxi >> dd.txt
::::::::对比文件列表并删除多余文件:::::
for /f "tokens=*" %%i in (dd.txt) do (
    find "%%i" sd.txt || del /a /f /q "%dd%%%i"
)
::::::::删除空文件夹:::::::::::::::::::
set num=0
for /f "delims=" %%i in ('dir /ad /b /s "%dd%"') do (
    for /f %%j in ('dir /a "%%i"') do set /a num+=1
    if !num! lss 8 attrib -s -h -r -a  "%%i" && rd /s /q "%%i"
    set num=0
)
::::::::更新文件:::::::::::::::::::::::
xcopy /d /e /i /y /c /q /h /r /k "x:\*" "%dd%*"
::::::::清理临时文件并断开网络路径:::::
net use x: /delete  /y
del /a /f /q sd.txt
del /a /f /q dd.txt
[ Last edited by a9319751 on 2006-12-13 at 08:23 AM ]



bat c c++
2006-12-10 01:24
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  


  显得好乱……


2006-12-10 01:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 3 楼』:  

恩,能不能简化下啊,老兄



bat c c++
2006-12-10 01:52
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  


@echo off&&for /f "delims=" %%i in ('dir /b/a-d ^|FINDSTR /i /v "\<不删除的文件\>"') do attrib -s -h -r -a "%%i" && del /q/f "%%i"
pause


   此帖被 +2 点积分      点击查看详情   
评分人:【 a9319751 分数: +2  时间:2006-12-10 02:31


2006-12-10 02:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by lxmxn at 2006-12-10 02:05:

[code]
@echo off&&for /f "delims=" %%i in ('dir /b/a-d ^|FINDSTR /i /v "\<不删除的文件\>"') do attrib -s -h -r -a "%%i" && ...

请教下兄 ^一般什么时间才用啊?


另外你的脚本我测试了,
如果排除文件有空格不能完成删除



bat c c++
2006-12-10 02:14
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 6 楼』:  

修改了下
for /f "usebackq delims=" %%i in (`dir/b/ad e: ^|FINDSTR/i /V "\^<game\^>"^|FINDSTR/i /V "\^<QQ对战平台\^>"^|FINDSTR/i /V "\^<ghost\^>"`) do  attrib -s -h -r -a /s /d "%%i" && rd /s /q "%%i"

for /f "usebackq delims=" %%i in (`dir/b/a-d e: ^|FINDSTR/i /V "\^<排除删除文件夹.bat\^>"`) do   attrib -s -h -r -a "%%i" && del /q "%%i"
pause
<>|前面^别的还有吗?



bat c c++
2006-12-10 02:51
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 7 楼』:  

  删除文件前不必先去文件属性,直接用 del /a /f 强制删除任意属性的文件就可以了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-10 03:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by namejm at 2006-12-10 03:05:
  删除文件前不必先去文件属性,直接用 del /a /f 强制删除任意属性的文件就可以了。


for /f "usebackq delims=" %%i in (`dir/b/ad e: ^|FINDSTR/i /V "\^<game\^>"^|FINDSTR/i /V "\^<QQ对战平台\^>"^|FINDSTR/i /V "\^<ghost\^>"`) do  attrib -s -h -r -a /s /d "%%i" && rd /s /q "%%i"

for /f "usebackq delims=" %%i in (`dir/b/a-d e: ^|FINDSTR/i /V "\^<排除删除文件夹.bat\^>"`) do   del /a /f /q "%%i"
pause




bat c c++
2006-12-10 03:10
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 9 楼』:  



  Quote:
请教下兄 ^一般什么时间才用啊?

另外你的脚本我测试了,
如果排除文件有空格不能完成删除

  对于何时需要使用^符号:
    这个"^"符号可以说是批处理的转义字符,可以将一些批处理里面的特殊的字符转换成其字符本身,有点类似c语言里面的转义符"\"。比如要在命令回显&^|等特殊字符时,必须在前面加上^符号,用来将其后的字符转义为本身。在带有/f参数的 for命令里面,括号里面的命令如果用到了管道字符,比如 | > << >> 等字符时,比如在这些符号前面加上转义符号^来转义。

  对于不能删除带有空格的文件,可以将空格用.(西文的句号)来代替。我刚做了一个实验,在一个文件夹下建立了如下一些文件:

  Quote:
2006-12-09  19:08    <DIR>          .
2006-12-09  19:08    <DIR>          ..
2006-12-09  19:08                22 1 # 1.txt
2006-12-09  19:08                22 11 # 11.txt
2006-12-09  19:08                22 13 # 13.txt
2006-12-09  19:08                22 15 # 15.txt
2006-12-09  19:08                22 17 # 17.txt
2006-12-09  19:08                22 19 # 19.txt
2006-12-09  19:08                22 3 # 3.txt
2006-12-09  19:08                22 5 # 5.txt
2006-12-09  19:08                22 7 # 7.txt
2006-12-09  19:08                22 9 # 9.txt

  比如我想保留"9 # 9.txt"和"19 # 19.txt",而将其它的文件都删除,那么可以使用下面的代码:
@echo off
for /f "delims=" %%i in ('dir /b/a-d ^|findstr /i /V "\<19.#.19.txt\> \<9.#.9.txt\>"') do del "%%i"
pause
  值得注意的是:执行任务的批处理文件最好不要放在当前目录,可能会被删除。另外,findstr后面的两个文件中间有一个空格,如果没有,可能会将目录里面的所有文件删除。


   此帖被 +3 点积分       点击查看详情   
评分人:【 a9319751 分数: +3  时间:2006-12-11 06:16


2006-12-10 08:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 10 楼』:  

不错,谢谢了,比我写的好看多了


for /f "delims=" %%i in ('dir /b/ad e:\ ^|findstr /i /V "\<19.#.19.txt\> \<9.#.9.txt\>"') do  attrib -s -h -r -a /s /d "%%i" && rd /s /q "%%i"
for /f "delims=" %%i in ('dir /b/a-d e:\ ^|findstr /i /V "\<新建.文本文档.bat\> \<9.#.9.txt\>"') do  del /a /f /q "%%i"
pause


打算些个生成这个文件的P

[ Last edited by a9319751 on 2006-12-11 at 03:31 AM ]



bat c c++
2006-12-11 02:55
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 11 楼』:  

to lxmxn

9楼的代码 和10楼的代码都不能完美处理

新建 文本文档.txt
新建1文本文档.txt
新建2文本文档.txt
(1)新建 文本文档.txt
新建 文本文档.txt
新建 文本文档 (2).txt
等等问题
我又重写了代码,顶楼已更新,欢迎指导
顶楼的已可以正确判断这些

[ Last edited by a9319751 on 2006-12-13 at 08:08 AM ]



bat c c++
2006-12-12 05:44
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 12 楼』:  

有帮忙测试的没



bat c c++
2006-12-13 07:17
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 13 楼』:  


  哪里来的19,20楼?

  你不要把以前的内容删除了啊,这样就不要分析了。

  等会儿帮你测试。


2006-12-13 07:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
a9319751
中级用户





积分 439
发帖 170
注册 2006-1-9
状态 离线
『第 14 楼』:  

不好意思,是我写错了,是9和10楼,嘿嘿
我不是版主杂会删贴呢
不好意思

[ Last edited by a9319751 on 2006-12-13 at 08:19 AM ]



bat c c++
2006-12-13 08:09
查看资料  发送邮件  发短消息 网志  OICQ (5040366)  编辑帖子  回复  引用回复
lrbf810
新手上路





积分 10
发帖 5
注册 2006-12-31
状态 离线
『第 15 楼』:  

COPY了,等下研究了再回来请教.

2007-1-11 10:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: