1、以下是原始的force_delete.bat內容:
force_detele.bat
-----------------------------
@ECHO OFF ;這個命令可以省略,用來隱藏屏幕輸出
@DEL /F /A /Q \\?\%1
@RD /S /Q \\?\%1
-----------------------------
然后會什么都不顯示就把文件或者文件夾樹刪掉。。。
2、為什么呢?
DEL 刪除文件命令 /F 是強制刪除只讀屬性文件 /A 不帶屬性參數(shù)(/A:xx)時可以無視除了只讀屬性外的其他屬性(如系統(tǒng)屬性) /Q 是自動跳過確認
RD 刪除文件夾及文件夾樹命令 /S 是說明刪除文件夾樹(如果文件夾有文件或子文件夾沒加這個參數(shù)會提示文件夾非空而不能刪除。。) /Q 也是自動跳過確認
3、重點來了,后邊的"\\?\%1"是什么意思呢?
當我們把文件(eg. test.txt 全路徑:"d:\test.txt")拖到bat文件圖標上松手時發(fā)生了什么呢?
其實這時候等效于執(zhí)行了(假設bat文件路徑為d:\gd.bat):
"d:\gd.bat "d:\test.txt""
此時"d:\test.txt"作為gd.bat 的第一個執(zhí)行命令行參數(shù),而%1就是代表這一串字符的變量
所以實際執(zhí)行的情況是:
-----------------------------------
>@echo off [!enter!]
>@DEL /F /A /Q \\?\"d:\test.txt" [!enter!]
>@RD /S /Q \\?\"d:\test.txt" [!enter!]
系統(tǒng)找不到指定的文件
----------------------------------
當然,這時候del已經(jīng)干掉了文件,rd當然找不到,兩個命令都用就是為了適應各種情況。
4、不過為什么不直接用全路徑而是用"\\?\"+全路徑呢?
這是一個特別協(xié)議的應用,這個特別協(xié)議就是UNC -- Universal Naming Convention) ,中文是“通用命名規(guī)則”,具體可以查百度百科。。。
簡單說就是\\hostname\resouce_or_path這樣的路徑,在winnt及之后基于其技術的系統(tǒng)中可以理解為資源的完整名稱。另外,完整的UNC格式要把"file:"前綴加上,不過在不同環(huán)境下有時候可以省掉有時候又必須省掉。。
5、本例中的"\\?\"+完整磁盤路徑名是UNC的特殊本地化實例,其實因為在UNC中?是代表1個或0個字符的通配符,所以其實際執(zhí)行的命令并不是?而是.(太小了。。英文的句號)
這個又是什么呢?簡單說就是一個對本地的引用,本地計算機根(又點根目錄的感覺)。。。但是是不是localhost或者回送地址127.0.0.1呢?
答案:不是! 簡單的說,它們是網(wǎng)絡根(請允許我如此粗淺的自造詞。。。),所以把?替換成localhost或者127.0.0.1會發(fā)現(xiàn)命令無效。
繼續(xù)上邊的,本地計算機根。。這個相當于在“我的電腦”一層,然后后邊跟著的是包括盤符的路徑。
------------------------------------------------------------------------------------
6、好吧,UNC絕對路徑,然后又怎么樣?
這里提一個UNC絕對路徑的特別屬性,貌似從WINNT時代延續(xù)至今。。
即:采取UNC絕對路徑定位文件或者文件夾得時候,系統(tǒng)會無視其中的系統(tǒng)保留字或者設備名、帶有特殊字符保護的文件系統(tǒng)控制文件名稱。
所以,用這樣的技巧可以刪除一些原先無法刪除的文件或者文件夾(除開正在運行、引用的、沒有相應的刪除/更改權限的[這個尚不明原因,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:下的所有的文件和文件夾將全部不復存在。。。
這正是特殊字符"&"(另:"^&"也有類似效果)的作用了(執(zhí)行的時候變成了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
======================================
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。