Board logo

标题: 怎样用聪明的小DOS命令解决烦人问题?!(DOS高手小考题) [打印本页]

作者: GOTOmsdos     时间: 2004-11-6 00:00    标题: 怎样用聪明的小DOS命令解决烦人问题?!(DOS高手小考题)




你可能遇到过这样的情况:
你无意中把一批文件(假设全是文件,没有子目录)解压到了错误的目录(假设为C:\)下,后再把它们重新解压到正确的目录(D:\PROGRAM),你就需要删掉前面的那些文件嘛,但太多了,一个个的删太烦了..
那么怎样用一行DOS批处理解决问题呢?

另外,如果增加难度的话,这样:
假设你忘了原先把文件解压到了什么地方(错误的目录),(只知道是在C盘里),那该怎么写?
(这里要特别注意:要确定其他地方没有重要的同文件名的文件,或者为安全起见,把目录范围缩小到一个无用的文件夹内测试。。。比如,在C盘中建一个目录AB,再在AB中建CD目录,再把D:\PROGRAM中的文件复制进去,就以C:\AB\CD为测试范围...)
还有,如果被解压的文件中也有子目录怎么办?(一行肯定不行了)



[此贴子已经被作者于2004-11-15 20:00:09编辑过]



作者: doslr     时间: 2004-11-6 00:00
win2000及以上的系统for /r %a in  (*.*) do @echo %a >>err.txtfor /f %b in (err.txt) do @del %b
作者: GOTOmsdos     时间: 2004-11-7 00:00
老兄啊! 你这样的话就删除全部文件了啊!不就等于 @del *.* /s 吗? (删除当前目录的全部文件)我狂晕!!..8u73yr7398231u
作者: 死性不改     时间: 2004-11-7 00:00
@echo offset /p drive=for /f %%i in ('dir *.* /b') do del %drive%:\%%i /q /s
作者: GOTOmsdos     时间: 2004-11-7 00:00
set /p drive=   好象是设DRIVE为当前目录,这个用处不大呀,你把当前目录改到你要的目录不就行了

[此贴子已经被作者于2004-11-7 12:39:21编辑过]



作者: 死性不改     时间: 2004-11-7 00:00
drive的值需要你输入,例如你错误解压到F盘的某个目录中,那么就输入F,回车。以下方法可能较好:@echo offset /p filename=set /p drive=for /f "usebackq" %%i in ('dir %drive%:\%filename% /b /s') do echo rd /s /q %%i>clean.cmdchange /i clean.cmd /from "\%filename%" /to nullcall clean.cmddel clean.cmd依次输入解压出来的其中一个文件的文件名(包括后缀)和错误解压目录所在分区,例如hehe.txt回车,F回车,那么批处理将会在F盘查找hehe.txt,如果hehe.txt在F:\haha\hehe目录,那么clean.cmd中将会产生命令:rd /s /q "F:\haha\hehe"
作者: 死性不改     时间: 2004-11-7 00:00
注意:98系统不能使用set /p来手动输入变量值。
chang.exe是第三方程序。
同时,必须存在因解压才产生的目录,如果解压时只释放出文件,没有产生新目录,请不要使用6楼的批处理。

[此贴子已经被作者于2004-11-7 12:18:21编辑过]



作者: GOTOmsdos     时间: 2004-11-7 00:00
题目的要求是1 不允许手动输入文件名(文件太多,太麻烦啊,烦人的事就是要批处理去做呀!)2 只要一行语句另外,好象DOS中没有CHANGE命令吧..
作者: 死性不改     时间: 2004-11-7 00:00
只需要输入其中一个文件名,因为只是通过这个文件找到错误解压目录。然后删除这个目录。chang.exe论坛中有。
作者: GOTOmsdos     时间: 2004-11-7 00:00
不合要求呀..嘿嘿..


[此贴子已经被作者于2004-11-7 13:17:22编辑过]



作者: Climbing     时间: 2004-11-8 00:00
如果DOS能够满足你这种要求,DOS就不是DOS了,我想应该是神或者God!
作者: GOTOmsdos     时间: 2004-11-8 00:00
CLIMBING啊, 大丈夫,一言既出,驷马难追哦,你可要为你的话负责哦。。DOS没你说的这么差哦..我说答案哦:(把目录切换到D:\PROGRAM), 这正是我自己遇到的情况.D:\PROGRAM>for %1 in (*) do del c:\%1如果不知道解压到了C盘的什么地方, 可加 /s,如下:\PROGRAM>for %1 in (*) do del c:\%1 /s如果,解压的文件又有文件又有子目录,请再动动脑筋吧..

[此贴子已经被作者于2004-11-10 16:55:26编辑过]



作者: GOTOmsdos     时间: 2004-11-9 00:00
??? 这么到现在还没有人揭榜? (看来这个小题目不容易哦,..)那我说答案吧..(我研究了一个下午才解决哦!)又有子目录的话,就难上加难了,在2000XP,可以解决的,如下:切换到C,C:\for /r /d %1 in (*) do if %~n1==program rd %1 /s /q哈哈! 就这么简单!好了,在这个基础上,再增加一点难度吧,不过上面的问题中的解析目录名和他的路径后,一切就好办了..假设你有很多重复的目录(文件已经在上面的帖子中解决了)在c,d两个盘中,但你又不知道他们在哪里,怎样用一句批处理删掉d盘中的重复目录(假设属性都是可删的)要求:只用一句
作者: Climbing     时间: 2004-11-10 00:00
楼主有老王卖瓜的嫌疑噢。你自己首先就没有把问题交待清楚,让别人如何解决,而且你的解决方案中有很多漏洞,有可能删除完成后你的系统都启动不起来了,岂不晕死?除非你保证你的C盘就没有重要的东西(一般不会存在这种情况吧?)1、你必须保证你压缩文件中的文件在C盘都是唯一的。
2、你必须保证你的压缩文件中的一级目录在C盘也是唯一的。

一旦不满足上面两个条件中的任意一个,你的命令就会删除不该删除的东西,这不是一个严密的用户所应该做的事。所以说,你的命令只能运行于满足上述条件的特定环境下,但你并没有交待清楚这些条件,所以DOS还是只是DOS,并不是神。因此没有必要如此炫耀吧!而且,你所用的for命令都是2000/xp/2003下的for命令,纯dos环境(或者win98环境)下的for命令是不支持这些参数的,这一点儿你也没有交待清楚,连最起码的严密性也没有,让你解决问题的用户该当心了。关于你的第二个问题,如果排除上面的因素的话,在2000/xp/2003环境下可以使用下面的命令:
for /d /r c: %i in (*) do for /d /r d: %j in (*) do if %~nxi==%~nxj rd /s /q %j这个命令会将D:盘中所有与C:盘目录重名的目录删除。
作者: GOTOmsdos     时间: 2004-11-10 00:00
我化了一些时间,解决了一些问题,觉得挺高兴的,就想到也让大家共享这些方法,先不说出答案,让大家动脑筋,如有人会了,就说出答案,如果想不出,我再说出答案.主要当然让大家共同提高啊,这怎么叫"老王卖瓜""如此炫耀"呢?
我的原先第一道题,是可以在98 DOS 实现的,而且情况都讲的较清楚,但我看到你说"DOS要是能达到你这种要求,DOS就不是DOS,就是神了",我觉得可能你早下结论了.
至于后面的题目,我忘记了把危险性的条件交代一下,还有只能在2000XP中实现,这个我澄清一下:要确定两个盘中没有重要的重复的目录才可实验,否则危险很大...,可把盘的范围缩小到可删掉的大目录中测试..
你的最后题目的解决方法能解决问题,但好象那个x好象是多余的,它表示扩展名呀,目录没有扩展名呀

[此贴子已经被作者于2005-2-28 12:45:19编辑过]



作者: Climbing     时间: 2004-11-10 00:00
你试试md a.b这个命令,就知道x不是多余的了,这也是程序严密性的体现。没有跟你争论的意思,只是提醒你要注意严密性,搞技术的一定要注意这一点。
作者: GOTOmsdos     时间: 2004-11-10 00:00
我试过了,对带点的目录名,没有问题,我试了A.B.F这样的目录,都没问题,说明这个x确是管文件的扩展名的,而不是带点的目录名.因为我们的批处理的/d已经确定它是目录了..这个X就不起作用了
作者: Climbing     时间: 2004-11-10 00:00
在我的试验中,如果不带x就不行的,假如C:盘中a目录,如果不带x,就会将D:盘的a.1 a.2等目录删除。
作者: Climbing     时间: 2004-11-10 00:00
@echo off
:: testfor.bat 测试for命令及命令扩展
:: 功能:删除2目录下所有与1目录中重名的子目录
rd /s /q 1
rd /s /q 2
md 1\a
md 1\a.1
md 1\b
md 1\c
md 2\a
md 2\a.1
md 2\a.2
md 2\b
md 2\c
md 2\d
md 2\e
echo ================================================================
echo 目录 1 的内容:
echo ================================================================
dir /b 1
echo ================================================================
echo 目录 2 的内容:
echo ================================================================
dir /b 2
echo ================================================================
echo 运行第一个for命令之后(if %%~ni==%%~nj),目录2的内容变为:
for /d /r 1 %%i in (*) do for /d /r 2 %%j in (*) do if %%~ni==%%~nj rd /s /q %%j
echo ================================================================
dir /b 2
echo ================================================================
echo 注意:a.2目录被错误的删除了。
pause
echo.
echo ================================================================
echo 准备运行第二个for命令...
echo ================================================================
rd /s /q 1
rd /s /q 2
md 1\a
md 1\a.1
md 1\b
md 1\c
md 2\a
md 2\a.1
md 2\a.2
md 2\b
md 2\c
md 2\d
md 2\e
echo 目录 1 的内容:
echo ================================================================
dir /b 1
echo ================================================================
echo 目录 2 的内容:
echo ================================================================
dir /b 2
echo ================================================================
echo 运行第二个for命令之后(if %%~nxi==%%~nxj),目录2的内容变为:
for /d /r 1 %%i in (*) do for /d /r 2 %%j in (*) do if %%~nxi==%%~nxj rd /s /q %%j
echo ================================================================
dir /b 2
echo ================================================================
echo 看,a.2目录没有被删除。
echo.
echo ================================================================
echo 测试结果:目录名同样是有扩展名的。

作者: GOTOmsdos     时间: 2004-11-10 00:00
哦,我刚才没明白你的意思,又试了,确实如你所说,现在发现FOR命令 的解释(或者程序)本身有问题,它说是处理扩展名,其实是处理所有带点的(包括目录),我还发现,这个X解析带点的,只以最后一个点为界。有点的话,如果不加X,它就分析最后的点之前的全部,如果加X,就分析全部。所以,如果有多点,并且不加X,比如A.B.C,他也不会认为和A相同.总之,这是一个缺陷,完整的处理是:对目录一律包括点,处理目录应该当作一个整体,只有当分析文件时才分扩展.
作者: Climbing     时间: 2004-11-11 00:00
无论是Windows还是Linux系统,文件和目录的命名规则都是一样的,处理方式也是相同的,所以这不是系统的缺陷,只是你的程序考虑的不够严密罢了。
作者: qzwqzw     时间: 2004-11-11 00:00
Oh, Hit!!! 为了回复这个问题当机三次,想当个高手咋就这么难呢?dos我懂得不多,只记得学过一句,似乎跟这有些关系:    for %%f in (d:\program\*.*) do if exist c:\%%f del c:\%%f不过用在这里好像不太行哦,是我的脑袋太笨,还是楼主的问题有问题?我总觉得,为什么不直接用dir看一下在哪,然后用deltree或者rd /s删除呢?怕删错还可以逐步确认呀。为什么一定要用那么长的for命令,还有那复杂的批处理?难道楼主你会一遍又一遍的把软件装错地方?有简单的不用,用复杂的,是一种罪过哦。所以,我到现在一直是用"查找"找到它,然后选中delete,方便快捷,没有后遗症。
作者: tired_bird     时间: 2004-11-11 00:00
看了这份贴,加深了for 语句的用法及功能的理解。同时从Climbing和GOTOmsdos身上学到很多东西,受益匪浅。不过好像Climbing关于“无论是Windows还是Linux系统,文件和目录的命名规则都是一样的,处理方式也是相同的”的说法我有点不同看法,linux下文件和目录的命名规则可以支持冒号:,而xp 下及cygwin中的bash中文件和目录的命名不支持冒号。
作者: insert     时间: 2004-11-11 00:00
同意22楼的说法,又不是每次都会解错地方,干吗要弄得那么复杂啊!!又没实际作用。 [em04]
作者: GOTOmsdos     时间: 2004-11-11 00:00
to qzwqzw你没看清我的要求,我要求之一是:就因为文件太多了,一个个的看,找,太麻烦啊! 所以用DIR是肯定不行的!for %%f in (d:\program\*.*) do if exist c:\%%f del c:\%%f你的以上方法可以精简成我的帖子中的答案。后面的要求再看后面的内容。。。
作者: GOTOmsdos     时间: 2004-11-11 00:00
TO  insert 当然不是每个DOS技术都是很常用的,但对于学习研究DOS者来说,这就是钻研的任务之一。但一旦你或你的朋友遇到类似情况,就会显示出DOS功底的力量了。。
作者: Climbing     时间: 2004-11-12 00:00


  Quote:
以下是引用tired_bird在2004-11-11 21:00:11的发言:

看了这份贴,加深了for 语句的用法及功能的理解。同时从Climbing和GOTOmsdos身上学到很多东西,受益匪浅。
不过好像Climbing关于“无论是Windows还是Linux系统,文件和目录的命名规则都是一样的,处理方式也是相同的”的说法我有点不同看法,linux下文件和目录的命名规则可以支持冒号:,而xp 下及cygwin中的bash中文件和目录的命名不支持冒号。

我并不是说Windows 和 Linux的文件命名规则是一样的(Windows下当然会有很多限制),但在同一个系统下,文件和目录名的命名规则是一样的。
作者: bush     时间: 2004-11-12 00:00
樓主說的:D:\PROGRAM>for %1 in (*) do del c:\%1 /s 不好。你必须保证你的压缩文件中的一级目录在C盘也是唯一的。壓縮文件中的一級目錄在c盤中必須唯一,且沒有其他同名文件。還是先定位好。
作者: bush     时间: 2004-11-12 00:00
其實,dir/d 按時閒排序,再刪除解壓時節以後的文件即可,雖然多一個步驟但是可靠一些.
作者: GOTOmsdos     时间: 2004-11-12 00:00
to bush
没错,必须确定C盘中其他地方没有同名文件,跟目录没有关系,这句只解决文件呀



我这些考题其实只是从理论上实现达到一种意图,如果真要操作的话,肯定要再加控制其他条件的语句的

[此贴子已经被作者于2004-11-12 17:43:01编辑过]



作者: qzwqzw     时间: 2004-11-15 00:00
GOTOmsdos,你会dir所有的文件吗?只需要dir一个文件或者文件夹就可以了,难道一次解压会错到两个地方吗?再说,用程序总有考虑不到的地方,一下执行,连提示也没有,万一出错了,损失又有谁能负责?
作者: GOTOmsdos     时间: 2004-11-15 00:00
to qzwqzw :你还是没弄懂我题目的情况。。你能不能看清题义和要求,再发表意见??
作者: ultralqxq     时间: 2004-11-15 00:00


  Quote:
以下是引用GOTOmsdos在2004-11-8 12:59:27的发言:

CLIMBING啊, 大丈夫,一言既出,驷马难追哦,你可要为你的话负责哦。。DOS没你说的这么差哦..
我说答案哦:(把目录切换到D:\PROGRAM), 这正是我自己遇到的情况.
D:\PROGRAM>for %1 in (*) do del c:\%1
如果不知道解压到了C盘的什么地方, 可加 /s,如下:
D:\PROGRAM>for %1 in (*) do del c:\%1 /s
如果,解压的文件又有文件又有子目录,请再动动脑筋吧..

有漏洞的啊,假设我原本在f:\program跟c:\下都有一个文件叫1.txt,但内容不同,你这样一执行,我c:\1.txt不就也被你删啦!!!别说没这么巧的事,一定会有相同的情况。特别是你说还扩展到子目录。。。
作者: GOTOmsdos     时间: 2004-11-15 00:00
是这样的,补充一下:要确定其他地方没有重要的同名文件,如果你有很多同名文件,那就没办法了,只好一个个的找出来删,如果你不要同名文件了,就可以用批处理,快活一下嘛。。
作者: ultralqxq     时间: 2004-11-16 00:00
恩,我一路看下来,明白你的意思了。。。你在前面已经解释过了!!
作者: Climbing     时间: 2004-11-16 00:00
呵呵,GOTOmsdos简直在给自己找麻烦,还是在顶楼把问题的前提和条件说清楚吧,否则你不得不一直解释下去。
作者: buddiyar     时间: 2006-7-15 03:05
作个记号 呵呵