123
返回列表 发新帖
楼主: 沙之手痕
收起左侧

[技巧] 告诉大家一个无敌删除命令,任意无法删除的文件都能删除

[复制链接]
wo1234
发表于 2009-8-22 23:20:27 | 显示全部楼层

回复 16楼 qepwqy 的帖子

DEL /F /A /Q \\?\%1  
RD /S /Q \\?\%1
就是两个dos命令
del是用来删除文件用的 /F /A /Q 都是命令参数 后边的那个%1是变量
RD是用来删除文件夹的命令 其余解释同上
赵丽
发表于 2009-8-23 09:55:35 | 显示全部楼层
会去试一下
jiang790
发表于 2009-8-23 11:56:11 | 显示全部楼层
学习了!!!
imule
发表于 2009-8-23 17:03:01 | 显示全部楼层
原本是这样的:
force_detele.bat
-----------------------------
@ECHO OFF        ;这个命令可以省略,用来隐藏屏幕输出
@DEL /F /A /Q \\?\%1  
@RD /S /Q \\?\%1
-----------------------------
然后会绝对什么都不显示就把文件或者文件夹树删掉。。。
为什么呢?
DEL 删除文件命令 /F 是强制删除只读属性文件 /A 不带属性参数(/A:xx)时可以无视除了只读属性外的其他属性(如系统属性) /Q 是自动跳过确认
RD 删除文件夹及文件夹树命令 /S 是说明删除文件夹树(如果文件夹有文件或子文件夹没加这个参数会提示文件夹非空而不能删除。。) /Q 也是自动跳过确认

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

其实这时候等效于执行了(假设bat文件路径为d:\gd.bat):"d:\gd.bat "d:\test.txt""
此时"d:\test.txt"作为gd.bat 的执行命令行参数"1",而%1就是代表这一串字符的变量

综上,实际执行的情况是:
-----------------------------------
>@echo off [!enter!]

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

>@RD /S /Q \\?\"d:\test.txt" [!enter!]
系统找不到指定的文件
----------------------------------
当然,这时候del已经干掉了文件,rd当然找不到,两个命令都用就是为了适应各种情况。

不过为什么不直接用全路径而是用"\\?\"+全路径呢?
这是一个特别的协议应用。。
(未完持续)

[ 本帖最后由 imule 于 2009-8-23 19:08 编辑 ]
imule
发表于 2009-8-23 18:28:05 | 显示全部楼层
恩恩。。吃饱了继续。。。。
刚才说到的特别协议呢,指的就是UNC -- Universal Naming Convention) ,中文是通用命名规则,具体的可以查百度百科。。。
简单说就是\\hostname\resouce_or_path这样的路径,在winnt及之后基于其技术的系统中可以理解为资源的完整名称。另外,完整的UNC格式要把"file:"前缀加上,不过在不同环境下有时候可以省掉有时候又必须省掉。。
本例中的"\\?\"+完整磁盘路径名是UNC的特殊本地化实例,其实因为在UNC中?是代表1个或0个字符的通配符,所以其实际执行的命令并不是?而是.(太小了。。英文的句号)。
这个又是什么呢?简单说就是一个对本地的引用,本地计算机根(又点根目录的感觉)。。。但是是不是localhost或者回送地址127.0.0.1呢?
答案:不是! 简单的说,它们是网络根(请允许我如此粗浅的自造词。。。),所以把?替换成localhost或者127.0.0.1会发现命令无效。
继续上边的,本地计算机根。。这个相当于在“我的电脑”一层,然后后边跟着的是包括盘符的路径。
------------------------------------------------------------------------------------
好吧,UNC绝对路径,然后又怎么样?
这里提一个UNC绝对路径的特别属性,貌似从WINNT时代延续至今。。
即:采取UNC绝对路径定位文件或者文件夹得时候,系统会无视其中的系统保留字或者设备名、带有特殊字符保护的文件系统控制文件名称。
所以,用这样的技巧可以删除一些原先无法删除的文件或者文件夹(除开正在运行、引用的、没有相应的删除/更改权限的[这个尚不明原因,NTFS太厉害了?]、专门技术保护的)

最后。。。恩,做个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以便删除。。。

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

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

以下没有验证过,也请谨慎。。。。
===========================================
@echo off
if not "%~n1"=="" if not exist "%~f1" goto CHK
if not "%~n1"=="" if exist "%~f1" goto CHK
color 7c
cls
@echo
@echo                                         顽固文件垃圾桶
@echo
@echo      可删除任意顽固文件或目录,将目标文件或目录拖放到本bat图标上即可.
@echo
@echo       为了用户文件安全,已对带有"&"、"^&"组合字符文件名的危险删除进行阻止
@echo
@echo       原作者Q#: 251485609
@pause>nul 2>nul
echo  on
goto eof

:CHK
set rt="%~n1"
if "%rt:~1,1%"=="&" goto FINE
if "%rt:~1,2%"=="^&" goto FINE
del /f /a /q \\?\%1 >nul 2>nul
rd /s /q \\?\%1 >nul 2>nul
echo  on
goto eof

:FINE
@echo
@echo          为了安全,不支持此类危险删除!
echo  on
pause>nul 2>nul
======================================

[ 本帖最后由 imule 于 2009-8-23 19:12 编辑 ]
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-11 22:57 , Processed in 0.090775 second(s), 13 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表