写了个清理系统垃圾的批处理,因而学了下For语句,记下感触和要点

来源:互联网 发布:英文字体设计软件 编辑:程序博客网 时间:2024/05/01 21:42

      前段时间没事看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 offrem 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%\*.logdel /f /s /q %windir%\installer\*.msidel /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%\*.bakdel /f /s /q %windir%\prefetch\*.*rd /s /q %windir%\temp & md %windir%\temprd /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 /purgecacherem echo 优化预读信息...rem %windir%\system32\defrag.exe %systemdrive% -brem 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了,就没去弄了!!

 

	
				
		
原创粉丝点击