關於“無敵刪除命令”

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 提供,有修改,感謝~~

以下沒有驗證過,使用也請謹慎。。。。
===========================================
@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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章