中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]帮助分析以下删除指定文件的错误再哪?
« [1] [2] »
作者:
标题: [求助]帮助分析以下删除指定文件的错误再哪? 上一主题 | 下一主题
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『楼 主』:  [求助]帮助分析以下删除指定文件的错误再哪?

我想删除指定的磁盘中某个文件,以下是代码:
:delfile
echo.
echo.
set /p  delfile=请输入你要删除的磁盘文件
for   %%a in (C: D: E: F: G: H: I: )  do (
    for /f "delims="  %%b in ('dir /s /b /ah %%a\%filename%') do (
    del /F /S /Q  %%b
    )
)
goto finddel

但是我连系统文件都删除了,搞摊了系统,这是为什么啊!我只是输入了一个普通的文本文件,而以下的代码确没有就没有,为什么呢,请大家帮我查出我的问题在哪啊:

@echo off
set/p f=请输入这个文件的名称:
set/p t=删除文件请按d:
for %%a in (c d e ) do call :%t% %%a
:d
rem  我的理解是for把c d e作为参数传给了%%a ,而%%a又作为call的第一个参数
for /r %1:\ %%i in ("%f%") do del/f/q/a/s "%%i
rem  for先后遍历指定磁盘下的文件再把路径传给%%i,在del
可是我上面的代码也是这个思路啊!怎么就连系统的文件都给删了呢?我的问题出在那呢?

2008-10-26 13:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
8657
初级用户





积分 20
发帖 17
注册 2008-8-8
状态 离线
『第 2 楼』:  

\%filename%在哪???  在加个 2^<nul

2008-10-26 14:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『第 3 楼』:  

现在不是不删,而是连系统文件都删,太可怕了!

2008-10-26 15:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

定义变量的时候用delfile
删除文件的时候却用filename
故意的?还是笔误?



2008-10-26 15:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
8657
初级用户





积分 20
发帖 17
注册 2008-8-8
状态 离线
『第 5 楼』:  

难道没看明白我的意思么  你的 filename没被定义

2008-10-26 15:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『第 6 楼』:  

不好意思,被它弄晕了,把%filename%换成%delname%,也无法删除指定的文件.

另外,再问一个古灵精怪的问题,还是那段我找的代码:
:delfile
echo.
echo.
set/p f=请输入这个文件的名称:
set/p t=删除文件请按d:
for %%a in (c d e f) do call :%t% %%a
:d
rem  我的理解是for把c d e作为参数传给了%%a ,而%%a又作为call的第一个参数
for /r %1:\ %%i in ("%f%") do del/f/q/a/s "%%i
rem  for先后遍历指定磁盘下的文件再把路径传给%%i,在del

把以上代码单独写一个批处理文件,它是可以删除文件的,但如果把他作为一个标号:delfile,却不执行了,也不出现任何错误提示,你说怪不怪,我快被这个问题蛰么死了!
快帮帮我啊!头快要炸了!

2008-10-26 15:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 7 楼』:  Re 6楼

那为何现在还不修改顶楼的内容呢?
想再弄晕几个近来帮你回答问题的?
^_^



2008-10-26 16:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 8 楼』:  

"%%i
最后面的“那里去了



简单!简单!再简单!
2008-10-26 17:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 9 楼』:  

第一段:

1:
set /p  delfile=请输入你要删除的磁盘文件

delfile 要改成 %filename% 吧。

2:
for /f "delims=" %%b in ('dir /s /b /ah %%a\%filename%') do (
  del /F /S /Q %%b
)


①你确定删除隐藏文件吗?是的话改成这样:
for /f "delims=" %%b in ('dir /s /b /a:-dh %%a\%filename%') do (
  del /F /a:h "%%b"
)

del 的参数 /S /Q 在这里是多余的:
/S 是包括删除子文件夹中文件。例如 del /s d:\test.txt 将删除 d 盘下所有的 test.txt。
/Q 是通配符删除时不需要确认。例如 del d:\test*。

②还是...你是想删除隐藏文件?是的话改成这样:
for /f "delims=" %%b in ('dir /s /b /a:-d %%a\%filename%') do (
  del /F "%%b" 2>nul || del /F /a:h "%%b"
)


第二段:

for /r %1:\ %%i in ("%f%") do del/f/q/a/s "%%i

首先,你可以在 cmd 窗口中测试一下这条命令:
for /r c:\ %a in (reg.exe) do @echo %a
结果会是:

c:\reg.exe
c:\FOUND.000\reg.exe
c:\FOUND.001\reg.exe
c:\FOUND.002\reg.exe
c:\FOUND.003\reg.exe
c:\WINDOWS\reg.exe
c:\WINDOWS\PCHealth\reg.exe
... ...

只列出存在的文件,需要用 if exist 来判断:
for /r c:\ %a in (reg.exe) do @if exist "%a" echo %a
或者用通配符:
for /r c:\ %a in (reg.exe?) do @echo %a
但是好像如果文件名含空格的话,用 for /r 行不通。

[ Last edited by tireless on 2008-10-27 at 00:41 ]

2008-10-26 22:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 10 楼』:  Re 9楼

如果文件名含空格的话,这样行吗?
for /r C:\test %a in (*.txt) do @if "%~nxa" equ "a b.txt" echo %a


   此帖被 +1 点积分    点击查看详情   
评分人:【 tireless 分数: +1  时间:2008-10-26 23:23




2008-10-26 22:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 11 楼』:  Re 10 楼

可行。很慢就是,不过用 for /r 搜索含空格的文件只有这个方法了。

2008-10-26 23:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『第 12 楼』:  

还是忙然!
1.如果我想删除任指定文件而不管它是否隐藏,那代码应该是

@echo off
set /p filename=请输要删出的文件名
for  %%a  in (c: d:) do (
      for /f "delims=" %%b in ('dir /s /b /a:-d %%a\%filename%') do (
      del /F "%%b" 2>nul || del /F /a:h "%%b"
     )
)
但是我现在的执行它,不仅批处理本身被删,而切windows文件保护又来了,估计我又要恢复系统了,还好我有GHO!
2.请问 del /a:-dh中的d什么意?
del /?中没有d?

2008-10-27 10:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 13 楼』:  Re 12楼

额..你先用 echo,看被删除的文件对不对。

@echo off
set /p filename=请输要删出的文件名:
for  %%a  in (c: d:) do (
      for /f "delims=" %%b in ('dir /s /b /a:-d %%a\%filename% 2^>nul') do (
      echo del /F "%%b" 2>nul
      echo del /F /a:h "%%b" 2>nul
     )
)
pause


我测试了下,没什么问题啊:

  Quote:
请输要删出的文件名:notepad.exe
del /F "c:\WINDOWS\notepad.exe"
del /F "c:\WINDOWS\system32\notepad.exe"
请按任意键继续. . .

2.dir /a:d 是列出目录,dir /a:-d 就是列出非目录,即文件。

  Quote:
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              指定要列出的驱动器、目录和/或文件。

  /A          显示具有指定属性的文件。
  attributes   D  目录                R  只读文件
               H  隐藏文件            A  准备存档的文件
               S  系统文件            -  表示“否”的前缀

[ Last edited by tireless on 2008-10-27 at 11:48 ]

2008-10-27 11:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『第 14 楼』:  

谢谢,已解决,但不知为什么先前的出了问题,我也是拷贝的代码啊!

另外,还得请教个问题:
echo del /F "%%b" 2>nul中的2>nul是前面的命令出了错误要屏蔽出错信息吧!
那for /f "delims=" %%b in ('dir /s /b /a:-d %%a\%filename% 2^>nul')中为什么用2^>nul而不是2>nul呢?它们的作用不一样吗?还是有什么特殊要求?

2008-10-27 14:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 15 楼』:  Re 14 楼

2^>nul 中的 ^ 是“转义字符”。
例如要显示 | 等特殊符号,执行 echo | 是显示不出来的,要用 echo ^|

[ Last edited by tireless on 2008-10-27 at 14:55 ]

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


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



论坛跳转: