Board logo

标题: 批处理“无敌删除命令” [打印本页]

作者: lxzzr    时间: 2009-10-6 11:24     标题: 批处理“无敌删除命令”

原贴:http://bbs.kafan.cn/thread-544402-1-1.html



1、以下是原始的force_delete.bat内容:
force_detele.bat
-----------------------------
@ECHO OFF        ;这个命令可以省略,用来隐藏屏幕输出
@DEL /F /A /Q \\?\%1  
@RD /S /Q \\?\%1
-----------------------------
然后会什么都不显示就把文件或者文件夹树删掉。。。

2、为什么呢?

DEL 删除文件命令 /F 是强制删除只读属性文件 /A 不带属性参数(/A:xx)时可以无视除了只读属性外的其他属性(如系统属性) /Q 是自动跳过确认
RD 删除文件夹及文件夹树命令 /S 是说明删除文件夹树(如果文件夹有文件或子文件夹没加这个参数会提示文件夹非空而不能删除。。) /Q 也是自动跳过确认

3、重点来了,后边的"\\?\%1"是什么意思呢?
当我们把文件(eg. test.txt 全路径:"d:\test.txt")拖到bat文件图标上松手时发生了什么呢?

其实这时候等效于执行了(假设bat文件路径为d:\gd.bat):

"d:\gd.bat "d:\test.txt""

此时"d:\test.txt"作为gd.bat 的第一个执行命令行参数,而%1就是代表这一串字符的变量

所以实际执行的情况是:
-----------------------------------
>@echo off [!enter!]

>@DEL /F /A /Q \\?\"d:\test.txt" [!enter!]

>@RD /S /Q \\?\"d:\test.txt" [!enter!]
系统找不到指定的文件
----------------------------------

当然,这时候del已经干掉了文件,rd当然找不到,两个命令都用就是为了适应各种情况。

4、不过为什么不直接用全路径而是用"\\?\"+全路径呢?

这是一个特别协议的应用,这个特别协议就是UNC -- Universal Naming Convention) ,中文是“通用命名规则”,具体可以查百度百科。。。

简单说就是\\hostname\resouce_or_path这样的路径,在winnt及之后基于其技术的系统中可以理解为资源的完整名称。另外,完整的UNC格式要把"file:"前缀加上,不过在不同环境下有时候可以省掉有时候又必须省掉。。

5、本例中的"\\?\"+完整磁盘路径名是UNC的特殊本地化实例,其实因为在UNC中?是代表1个或0个字符的通配符,所以其实际执行的命令并不是?而是.(太小了。。英文的句号)

这个又是什么呢?简单说就是一个对本地的引用,本地计算机根(又点根目录的感觉)。。。但是是不是localhost或者回送地址127.0.0.1呢?
答案:不是! 简单的说,它们是网络根(请允许我如此粗浅的自造词。。。),所以把?替换成localhost或者127.0.0.1会发现命令无效。

继续上边的,本地计算机根。。这个相当于在“我的电脑”一层,然后后边跟着的是包括盘符的路径。
------------------------------------------------------------------------------------
6、好吧,UNC绝对路径,然后又怎么样?

这里提一个UNC绝对路径的特别属性,貌似从WINNT时代延续至今。。

即:采取UNC绝对路径定位文件或者文件夹得时候,系统会无视其中的系统保留字或者设备名、带有特殊字符保护的文件系统控制文件名称。
所以,用这样的技巧可以删除一些原先无法删除的文件或者文件夹(除开正在运行、引用的、没有相应的删除/更改权限的[这个尚不明原因,NTFS太厉害了?]、专门技术保护的)

7、最后。。。恩,做个WARNING或者CAUTION吧,呵呵。。。
就是。。谨慎使用
(这里要感谢purplelichen和版主HAT @ www.cn-dos.net forum 提供的例子)

在文件名包含某些特殊字符时有误删除的潜在危险!
设h:是一个u盘,下面有一个fdel.bat:

DEL /F /A /Q \\?\%1
RD /S /Q \\?\%1

同时h:下还有一个名为 &1.txt  的文本文件,此时
你想用 fdel.bat 删除 &1.txt,当你把 &1.txt 拖到
fdel.bat 上后,h:下的所有的文件和文件夹将全部不复存在。。。

这正是特殊字符"&"(另:"^&"也有类似效果)的作用了(执行的时候变成了rd /s /q \\?\"h:\&1.txt",&的前后会并列,于是h:\被清空,然后才是定位1.txt以便删除。。。

8、于是综上:该bat很强大很简洁,但是一定不要用于删除文件名中(尤其是文件名首字符为&或^&)的文件或文件夹,否则可能造成误删除。

9、附:
相对安全的代码,具体就不详解了,主要是加入了文件名的判定:(ZJHJ @ www.cn-dos.net forum 提供,有修改,感谢~~

以下没有验证过,使用也请谨慎。。。。
  1. @echo off
  2. if not "%~n1"=="" if not exist "%~f1" goto CHK
  3. if not "%~n1"=="" if exist "%~f1" goto CHK
  4. color 7c
  5. cls
  6. @echo
  7. @echo 顽固文件垃圾桶
  8. @echo
  9. @echo 可删除任意顽固文件或目录,将目标文件或目录拖放到本bat图标上即可.
  10. @echo
  11. @echo 为了用户文件安全,已对带有"&"、"^&"组合字符文件名的危险删除进行阻止
  12. @echo
  13. @echo 原作者QQ: 251485609
  14. @pause>nul 2>nul
  15. echo on
  16. goto eof
  17. :CHK
  18. set rt="%~n1"
  19. if "%rt:~1,1%"=="&" goto FINE
  20. if "%rt:~1,2%"=="^&" goto FINE
  21. del /f /a /q \\?\%1 >nul 2>nul
  22. rd /s /q \\?\%1 >nul 2>nul
  23. echo on
  24. goto eof
  25. :FINE
  26. @echo
  27. @echo 为了安全,不支持此类危险删除!
  28. echo on
  29. pause>nul 2>nul
复制代码

作者: zqz0012005    时间: 2009-10-6 11:43

lxzzr兄总是从一些很奇怪的地方转帖呢。超级网虫,什么论坛都去?

这个方法和原理我们论坛其实早已有了。
作者: Batcher    时间: 2009-10-6 11:44

卡饭,呵呵,我又翻出自己的ID过去灌了一贴。
作者: lxzzr    时间: 2009-10-6 11:50     标题: 回复 2楼 的帖子

在卡饭转的时候,看到这贴还不错就转了,呵呵...
作者: plp626    时间: 2009-10-6 13:33

不方便使用,那种del \\?\ ... 能删掉的 用unlocker 也能删掉,并且比del方便

unlocker删不掉的,比如那种..不可见不确定深度的目录,unlocker也没办法,冰刃等也不行,目前除了自行编写bat文件判断..目录的短名绝对路径然后逐一删除,我还没见到有其他工具能删掉这种目录的,别忘了,ntfs格式下仍然有这种..不可见目录,而且有着和fat32格式下不同的特性。。。

此种目录删除我有个xdel.bat 工具,需要者到我网盘下载。。。

http://e.ys168.com/?plp626
作者: canyuexiaolang    时间: 2009-10-6 14:24

管理员~~~~~
这个好像是违规标题吧....
关于XXXXX
呃.........
作者: tangweichao    时间: 2009-10-18 14:49

学习下,还是看得懂了
作者: loveyuto    时间: 2009-10-23 20:26

DEL /F /A /Q \\?\%*      RD /S /Q \\?\%*
作者: LS115115    时间: 2009-10-28 20:25

留个位子明天再看..........
作者: pk999998    时间: 2010-3-7 11:50

是彻底删除的那种么?
作者: pumahxh    时间: 2010-3-31 23:34

我用了,还是提示拒绝访问,文件名以中文开关,很常规的名字哦,“无敌”怎么不敌了
作者: lxzzr    时间: 2010-4-1 08:06     标题: 回复 11楼 的帖子

我转载这篇文章的原意思是:“为什么不直接用全路径而是用"\\?\"+全路径呢?”

对于你所说的拒绝访问,你可以查下具体文件的权限、有没有第三方安全软件等
作者: yjhqqkg    时间: 2010-5-12 15:12

没有什么是无敌的
作者: ZJHJ    时间: 2010-5-12 17:54

这个不是什么都无敌。我也遇到过,有些时候下载的程序打包有‘赖皮’,会使你头痛。用这个也不行的。建议你用影子系统。这个命令单用时有很危险的一面,如果有些文件名具有"&",和"^&"时,很有可能你就要倒霉了。所以在以下命令中加有‘安全’判断,拒绝删除有"&",和"^&"的文件名文件。
  1. @echo off
  2. if not "%~n1"=="" if not exist "%~f1" goto AAS
  3. if not "%~n1"=="" if exist "%~f1" goto AAS
  4. color 7c
  5. cls
  6. @echo.
  7. @echo                               文件垃圾桶
  8. @echo.
  9. @echo          可删除任意文件或畸形目录,可将目标文件或目录拖放垃圾桶中.
  10. @echo.
  11. @echo       为了用户文件安全,对带有"^&"组合字符文件名的危险删除进行避免.
  12. @echo.
  13. @echo                                                 制作: QQ: 251485609
  14. @echo.
  15. pause>nul 2>nul
  16. echo  
  17. goto eof
  18. :AAS
  19. set rt="%~n1"
  20. if "%rt:~1,1%"=="&" goto BS
  21. if "%rt:~1,2%"=="^&" goto BS
  22. del /f /a /q \\?\%1 >nul 2>nul
  23. rd /s /q \\?\%1 >nul 2>nul
  24. echo  
  25. goto eof
  26. :BS
  27. @echo.
  28. @echo          为了安全,不支持此类危险删除。
  29. echo  
  30. pause>nul 2>nul
复制代码

作者: rivch    时间: 2010-7-12 13:58

谢谢兰州,疑惑解决了!!
作者: 大蜘蛛    时间: 2013-3-23 20:40

学习了,不过为什么  echo y|cacls \\?\%* /t /c /e /g Everyone:f  这句不能执行???我只是想实现拖动同时获取多个文件的完全访问权限,而不是当前目录下的所有文件……
作者: CrLf    时间: 2013-3-24 22:31

回复 16# 大蜘蛛


    cacls 支持通配,但不支持同时在参数中指定多个文件名
作者: 大蜘蛛    时间: 2013-3-25 13:30

回复 17# CrLf
那如果想实现拖动更改多个文件权限该怎么修改那个语句啊???
作者: CrLf    时间: 2013-3-25 15:12

回复 18# 大蜘蛛


    for %%a in (%*)do echo y|cacls \\?\%%a /t /c /e /g Everyone:f
作者: 大蜘蛛    时间: 2013-3-25 16:13

回复 19# CrLf
强大,学习了,好灵活啊,感觉像初中时解几何题……太灵活了……
作者: 狱渊    时间: 2013-4-20 12:43

请问删除后对系统有影响吗?
作者: sunboy520    时间: 2016-1-5 20:49

谢谢分享!!!!!!
作者: Alt32    时间: 2017-8-15 18:44

\\?\%1
直接用%1不就可以了吗??
作者: Batcher    时间: 2017-8-15 19:01

回复 23# Alt32


    不一样。那是UNC
作者: Alt32    时间: 2017-8-16 19:26

回复 24# Batcher


    知道了。谢谢指教




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2