写代码无心间生成了一些以英文点号(.)结尾的文件,使用普通方法删不掉,最后使用下面的批处理进行了删除,转载在此备忘。html
原帖地址:安全
[技巧] 告诉你们一个无敌删除命令,任意没法删除的文件都能删除
网络
原文内容:spa
新建 文本文档 写入下列命令:
.net
DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1
另存为"通通删除.bat"
而后,要把要删除的文件或者目录拖放到这个bat文件的图标上就能够删除了。
命令行
一、如下是原始的force_delete.bat内容:orm
force_detele.bathtm
@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就是表明这一串字符的变量
因此实际执行的状况是:
-----------------------------------
>@echo off [!enter!]
>@DEL /F /A /Q \\?\"d:\test.txt" [!enter!]
>@RD /S /Q \\?\"d:\test.txt" [!enter!]
系统找不到指定的文件
----------------------------------
固然,这时候del已经干掉了文件,rd固然找不到,两个命令都用就是为了适应各类状况。
四、不过为何不直接用全路径而是用"\\?\"+全路径呢?
这是一个特别协议的应用,这个特别协议就是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