寫了個清理系統垃圾的批處理,因而學了下For語句,記下感觸和要點

      前段時間沒事看360doc.com看到別人寫了一個處理系統垃圾的批處理文件,覺得有點意思,Copy下來看看了下。後來沒事時完美了一下加了點自己的東西,因此稍稍學了一下批處理的For語句。

      我是個完美主義者,看到裏面一堆的del /f /s /q C:/*.log之類的東西,C:/改成%systemdrive%,再想到有For語句,看了一下幫助,就寫了一代替的:

for /r %systemdrive% %%1 in (*.tmp,*._mp,*.bak,*.log,*.chk,*.~*) do del /s /f /q %%1

      這樣簡潔多了!(編譯器會產生很多垃圾文件,加一條:改一下目錄名和擴展名的匹配符就行了!)

 

 

      之後又想到XP更新之後會產生大量的反安裝目錄,沒必要保留,自己寫一條:

for /d %%1 in (%windir%/$*$) do rd /q/s %%1

 

      一試只能刪除非隱藏目錄,上網一問http://wenwen.soso.com/z/q245470208.htm,別人給出:

for /f %%i in ('dir /ad /b %windir%/$*$') do rd /s /q "%windir%/%%i"

 

      行,能解決問題!但之後一想如果帶空格的目錄名還是處理不了!自己寫了一句:

for /f "usebackq" %%i in (`dir /ad /b`) do rd /s/q '%%i'

試試不行,查資料:


無usebackq:字符串雙引號;命令單引號

用usebackq:字符串單引號;命令反引號(`鍵盤1左邊)


(一開始覺得難記住,想了下,與引號中的引號情況差不多,只是反引號特殊些,但For/?幫助中有這樣的例子)

 

 

      將rd /s/q 改成@echo測試一下,發現空格後面的字符被截取了usebackq沒起作用,再仔細查查For/?幫助中的/f參數,加delims=表示沒有分隔符:

for /f "usebackq delims=" %%i in (`dir /ad /b`) do rd /s/q "%%i"

      試試,成了。動手時發現用了usebackq 並不影響do之後的語句,將'%%i'中單引號改回去"%%i"!

 

又覺得囉嗦,去掉usebackq,一試也行:

for /f "delims=" %%i in ('dir /ad /b %windir%/$*$') do rd /s/q "%%i"

 

對For語句有點興趣,再看看For/?幫助,看到/r參數,再試試

for /r %windir% %%1 in ($*$) do rd /q /s "%%1"

KO!!最簡潔了!!因此有了上面第一條清理匹配符指定的清理LJ語句。

 

 


這裏,再來看看For的執行流程for /f "usebackq delims=" %%i in (`dir /ad /b`) do rd /s/q "%%i"

dir取得目錄名(/b只取名字),並傳給For分析(/f即用於解析用途),如果沒指定分隔符即以空格默認代替,所以delims是必須的!!分析後傳給%%i參數即是目錄名,最後交由do之後的命令執行。如此循環!!"%%i"雙引號的作用是告訴rd命令目錄名可能有空格!!

 

貼上完整批處理:

@echo off
rem echo 清空IE臨時文件目錄...
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"

rem echo 正在清除系統臨時文件 *.tmp *._tmp *.log *.chk *.old ,請稍等...
for /r %systemdrive% %%i in (*.tmp,*._mp,*.bak,*.chk,*.~*) do del /a-s /s /f /q "%%i"
rem .log大部分有可能有用
rem del /f /s /q %systemdrive%\*.log

del /f /s /q %windir%\installer\*.msi
del /f /s /q %windir%\SoftwareDistribution\Download\*.*
del /f /s /q "%systemdrive%\Program Files\WindowsUpdate\*.*"
del /f /s /q "%systemdrive%\Program Files\InstallShield Installation Information\*.*"

rem echo 清空垃圾箱,備份文件和預緩存腳本...
del /f /s /q %systemdrive%\recycled\*.*
rem del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
rd /s /q %temp% & md %temp%

rem cookies和最近歷史還是保留吧...
rem del /f /q %userprofile%\Cookies\*.*
del /f /q %userprofile%\recent\*.*

rem echo 清理系統盤無用文件...
rem %windir%\system32\sfc.exe /purgecache

rem echo 優化預讀信息...
rem %windir%\system32\defrag.exe %systemdrive% -b

rem for /r %windir% %%i in ($*$) do rd /q /s "%%i"
:: for /f "usebackq delims=" %%i in (`dir /ad /b %windir%\$*$`) do rd /s/q "%%i"

for /f "delims=" %%i in ('dir /ad /b %windir%\$*$') do rd /s/q %windir%\"%%i"

for /f "delims=" %%i in ('dir /ad /b C:\FOUND.???') do rd /s/q C:\"%%i"
for /f "delims=" %%i in ('dir /ad /b D:\FOUND.???') do rd /s/q D:\"%%i"
for /f "delims=" %%i in ('dir /ad /b E:\FOUND.???') do rd /s/q E:\"%%i"

rem for /d 語句不能枚舉隱藏屬性的目錄
rem attrib /s /d -h -s %windir%\$*$
rem for /d %%i in (%windir%\$*$) do rd /q /s "%%i"

rem echo 清除系統完成!

rem echo. & pause



將上面保存爲批處理文件,加入到XP的關機腳本中,這樣就不會佔用啓動時間!

實際使用中只有一個問題:某些程序安裝或刪除時會將啓動/清理文件放在臨時目錄,造成不能安裝或程序清理不乾淨的問題。只要暫時禁用該腳本就OK了!

 

最後說一下,在更復雜的場合下,個人感覺VBS腳本比Dos批處理好,用起來應該更方便點。我只是太久沒用VB了,就沒去弄了!!

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章