自定义规则
授人以鱼,不如授人以渔。Dism++的能力是有限的,无法覆盖的所有用户的需求。因此给程序添加了自定义规则功能,方便高级用户打造自己的专属工具。
创建一个空白的自定义规则文件
我们只需要在Config目录新建一个 Custom*.xml 这样形式的xml文件即可(*表示任何字符串,比如Custom1.xml或者Custom我爱我的家.xml,另外文件以UTF8或者Unicode编码保存)。初始文件内容如下:
<Data>
<CleanCollection4>
<!--在此处编写垃圾清理规则-->
</CleanCollection4>
<SystemOptimization>
<!--在此处编写系统优化规则-->
</SystemOptimization>
</Data>
等所有工作完成后,在将这个xml文件压缩成一个zip,比如Custom1.zip或者Custom我爱我的家.zip。
压缩为zip这是为了减少文件体积,避免造成不必要的文件占用。
垃圾清理规则从负五开始
下面我们将循序渐进,让你从入门到放弃。说错了,是入门到精通。当然也欢迎大家提供宝贵的意见。
编写一个最简单的清理规则
我们都知道 C:\Windows\Logs 是系统的日志目录。系统运行时会在此处产生大量日志,而且某些情况还不会自动删除。因此我们需要定期删除此文件。那我们如何通过规则来实现此功能呢?
<Data>
<CleanCollection4>
<!--Name表示清理规则的名称-->
<Item Name="系统Logs目录">
<!--Description节表示清理规则的描述-->
<Description>系统的日志目录,用于存放系统运行日志。</Description>
<!--Group节表示规则的分组,同一个分组保存类似的规则-->
<Group>临时文件</Group>
<Scan>
<Activate>
<!--General规则,清空 C:\Windows\Logs 文件夹下方的所有内容,但是不会删除Logs文件夹本身-->
<General RootPath="C:\Windows\Logs"/>
</Activate>
</Scan>
</Item>
</CleanCollection4>
</Data>
我想,聪明的你一定明白了,大概怎么写规则了。至于 General 的完整用法,可以参考引擎白皮书。
编写带环境变量发清理规则中
之前的规则你一定发现一个严重的问题。就是清理路径是死的。就只能是清空 C:\Windows\Logs
目录。系统盘并不一定是C……,因此这个规则是有瑕疵的。因此我们有了改进版。使用环境变量。
<!--改良版-->
<Data>
<CleanCollection4>
<Item Name="系统Logs目录">
<Description>系统的日志目录,用于存放系统运行日志。</Description>
<Group>临时文件</Group>
<Scan>
<Activate>
<General RootPath="%SystemRoot%\Logs"/>
</Activate>
</Scan>
</Item>
</CleanCollection4>
</Data>
%SystemRoot%就是一个环境变量,表示C:\Windows。具体所支持的环境变量,请参考后续文档——环境变量。现在规则适应性大大提高了。
编写多General清理规则
我们知道系统相关日志不止一个地方。我们可以把他们收录在一个规则里。比如Windows目录还有各种log文件。比如WindowsUpdate.log、setuperr.log、setupact.log等等。General 语法提供了Query功能可以删除他们。
<Data>
<CleanCollection4>
<Item Name="系统Logs目录">
<Description>系统的日志目录,用于存放系统运行日志。</Description>
<Group>临时文件</Group>
<Scan>
<Activate>
<General RootPath="%SystemRoot%\Logs"/>
<!--General枚举语法,枚举%SystemRoot%中的文件,然后删除WindowsUpdate.log、setuperr.log、setupact.log 3个文件-->
<!--Flags是个筛选器,支持的值为File以及Directory,如果没有Flags则同时枚举文件以及文件夹。在此处仅枚举文件-->
<General RootPath="%SystemRoot%" Flags="File">
<Query>WindowsUpdate.log</Query>
<Query>setuperr.log</Query>
<Query>setupact.log</Query>
</General>
</Activate>
</Scan>
</Item>
</CleanCollection4>
</Data>
使用通配改进清理规则
你一定感觉到这个规则太蠢了,如果后来又新增加了log文件怎么办?其实Query是支持简单的通配符的。将 后缀是 .log的文件全部删除即可。因此我们可以使用通配来调整规则。
<Data>
<CleanCollection4>
<Item Name="系统Logs目录">
<Description>系统的日志目录,用于存放系统运行日志。</Description>
<Group>临时文件</Group>
<Scan>
<Activate>
<General RootPath="%SystemRoot%\Logs"/>
<!--General枚举语法,枚举%SystemRoot%中的文件,然后删除所有符合 *.log的文件-->
<General RootPath="%SystemRoot%" Flags="File">
<Query>*.log</Query>
</General>
</Activate>
</Scan>
</Item>
</CleanCollection4>
</Data>
但是通配也会有问题,假如我们不希望Dism++删除%SystemRoot%\WindowsUpdate.log。我们可以使用 Excluded 排除不想删除的内容,当然 Excluded也支持通配。
<Data>
<CleanCollection4>
<Item Name="系统Logs目录">
<Description>系统的日志目录,用于存放系统运行日志。</Description>
<Group>临时文件</Group>
<Scan>
<Activate>
<General RootPath="%SystemRoot%\Logs"/>
<General RootPath="%SystemRoot%" Flags="File">
<Query>*.log</Query>
<!--排除WindowsUpdate.log-->
<Excluded>WindowsUpdate.log</Excluded>
</General>
</Activate>
</Scan>
</Item>
</CleanCollection4>
</Data>