寫代碼無心間生成了一些以英文點號(.)結尾的文件,使用普通方法刪不掉,最後使用下面的批處理進行了刪除,轉載在此備忘。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