当前位置: 首页 > 文档资料 > Dism++ 帮助文档 >

自定义规则

优质
小牛编辑
143浏览
2023-12-01

授人以鱼,不如授人以渔。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>