写了个清理系统垃圾的批处理,因而学了下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了,就没去弄了!!

 



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