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

规则结构参考

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

本文内容用于详细说明Dism++规则的组成,不感兴趣的同学可以无视本文内容。

清理规则结构参考

很多朋友可能还是有疑问,Dism++的规则形式到底是怎么样的。本文将详细说明清理规则完整语法。清理规则有V1版跟V2版,这是由于历史原因导致的。Dism++同时支持二个版本,可以根据自己的需要选择。

清理规则结构体V1

V1版结构体会简洁很多

<!--V1版结构体-->
<element name="Item">
  <!--规则的名称-->
  <attribute name="Name" type="字符串" use="必选"/>
  <!--规则安全等级,0~3的整形,数字越大表示越安全。他们分别表示 存在风险、建议保留、可以删除、建议删除4个等级
  存在风险级别的项目,在新手模式不显示,在专家模式中以橙色底色突出项目。
  建议保留、可以删除 是属于同一个级别,Dism++默认不清理。这是历史原因,请大家不要纠结为什么有二个等级是一样的作用。
  建议删除 的项目Dism++将默认清理。使用此等级一定要确保规则的安全性,一般不推荐使用。-->
  <attribute name="Level" type="整形" use="可选" default="2"/>

  <!--规则的描述-->
  <element name="Description" type="字符串" use="可选"/>

  <element name="Scan">
    <complexType>
      <!--任务的进度比重,一个大于 0 的整形。在计算进度时有用-->
      <attribute name="Work" type="整形" use="可选" default="1"/>

      <!--警告文字,用户启用此规则时的弹窗说明。-->
      <element name="Warning" type="字符串" use="可选"/>
      <!--分组名称,如果不存在此节点,则统一归类到 “其他” 类别-->
      <element name="Group" type="字符串" use="可选" default="其他"/>
      <!--适应性检测规则,比如某规则仅在8.1以上平台显示,可以使用适应性检测规则-->
      <element name="Applicable" type="XML" use="可选" default="<True/>"/>

      <element name="Activate">
        <complexType>
          <!--执行清理或者扫描时,是否重新检测适应性规则。适应性及时性要求较高项目可以使用。-->
          <attribute name="Rescan" type="逻辑值" use="可选"/>
          <!--10.1.25.2开始支持,执行动作时,重启相关软件。值目前仅能输入Explorer-->
          <attribute name="Restart" type="字符串" use="可选"/>
          <sequence>
            <!--在此处填写动作执行引擎支持的规则-->
          </sequence>
        </complexType>
      </element>
    </complexType>
  </element>
</element>

清理规则结构体V2

V2版结构体引入了ScanCollection,支持多个Scan节点。

<!--V2版结构体-->
<element name="Item">
  <!--规则的名称-->
  <attribute name="Name" type="字符串" use="必选"/>
  <!--规则安全等级,0~3的整形,数字越大表示越安全。他们分别表示 存在风险、建议保留、可以删除、建议删除4个等级
  存在风险级别的项目,在新手模式不显示,在专家模式中以橙色底色突出项目。
  建议保留、可以删除 是属于同一个级别,Dism++默认不清理。这是历史原因,请大家不要纠结为什么有二个等级是一样的作用。
  建议删除 的项目Dism++将默认清理。使用此等级一定要确保规则的安全性,一般不推荐使用。-->
  <attribute name="Level" type="整形" use="可选" default="2"/>

  <!--规则的描述-->
  <element name="Description" type="字符串" use="可选"/>
  <element name="ScanCollection">
    <sequence>
      <element name="Scan">
        <complexType>
          <!--任务的进度比重,一个大于 0 的整形。在计算进度时有用-->
          <attribute name="Work" type="整形" use="可选" default="1"/>

          <!--规则的名称,作用跟Item节点的Name属性相同,优先使用Scan中的Name-->
          <element name="Name" type="字符串" use="可选"/>
          <!--规则的描述,作用跟Item属性中的Description相同,只是优先级更高-->
          <element name="Description" type="字符串" use="可选"/>
          <!--警告文字,用户启用此规则时的弹窗说明。-->
          <element name="Warning" type="字符串" use="可选"/>
          <!--分组名称,如果不存在此节点,则统一归类到 “其他” 类别-->
          <element name="Group" type="字符串" use="可选" default="其他"/>
          <!--适应性检测规则,比如某规则仅在8.1以上平台显示,可以使用适应性检测规则-->
          <element name="Applicable" type="XML" use="可选" default="<True/>"/>

          <element name="Activate">
            <complexType>
              <!--执行清理或者扫描时,是否重新检测适应性规则。适应性及时性要求较高项目可以使用。-->
              <attribute name="Rescan" type="逻辑值" use="可选"/>
              <!--10.1.25.2开始支持,执行动作时,重启相关软件。值目前仅能输入Explorer-->
              <attribute name="Restart" type="字符串" use="可选"/>
              <sequence>
                <!--在此处填写动作执行引擎支持的规则-->
              </sequence>
            </complexType>
          </element>
        </complexType>
      </element>
    </sequence>
  </element>
</element>

系统优化规则结构参考

执行引擎

RegWrite

执行注册表写入

<!--
1:创建注册表HKEY_LOCAL_MACHINE\SOFTWARE\Test 并这个键中创建一个名字叫123的REG_DOWRD类型,值为1的值。
      <RegWrite Key=”HKEY_LOCAL_MACHINE\SOFTWARE\Test” Type=”REG_DWORD” Value=”123” Data=”1”/>

2:创建注册表HKEY_LOCAL_MACHINE\SOFTWARE\Test 并在子健中创建名字叫123,类型为REG_BINARY,值为  0xCC 0x10
      <RegWrite Key=”HKEY_LOCAL_MACHINE\SOFTWARE\Test” Type=” REG_BINARY” Value=”123” Data=”CC10”/>
-->
<element name="RegWrite">
  <complexType>
    <!--注册表路径,比如 "HKEY_LOCAL_MACHINE\SOFTWARE\Test"-->
    <attribute name="Key" type="字符串" use="必选"/>
    <!--注册表类型,可以是 REG_SZ、REG_DWORD、REG_QWORD、REG_BINARY、REG_EXPAND_SZ-->
    <attribute name="Type" type="字符串" use="可选"/>
    <!--值的名称-->
    <attribute name="Value" type="字符串" use="可选"/>
    <!--值的数据-->
    <attribute name="Data" type="字符串" use="可选"/>
    <!--操作类型,可以是 =、|、&以及^-->
    <attribute name="Operator" type="字符串" use="可选" default="="/>
    <!--默认值。存在Operator(|、&、^)时必须填写默认值。-->
    <attribute name="Default" type="字符串" use="可选"/>
    <!--True或者False,指示是否开启Wow64重定向,32位系统自动忽略-->
    <attribute name="Wow64" type="字符串" use="可选" default="False"/>
  </complexType>
</element>

RegDelete

执行注册表删除

<element name="RegDelete">
  <complexType>
    <!--注册表路径,比如 "HKEY_LOCAL_MACHINE\SOFTWARE\Test"-->
    <attribute name="Key" type="字符串" use="必选"/>
    <!--值的名称。如果不存在此属性那么删除整个注册表树,如果存在,那么仅删这个值。-->
    <attribute name="Value" type="字符串" use="可选"/>
    <!--True或者False,指示是否开启Wow64重定向,32位系统自动忽略-->
    <attribute name="Wow64" type="字符串" use="可选" default="False"/>
  </complexType>
</element>
<!--
1:删除整个HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip
  < RegDelete Key=” HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip”/>

2:删除HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip中的Path值
  <RegDelete Key=”HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip” Value=”Path”/>
-->

RegMove

移动注册表信息。

<element name="RegMove">
  <complexType>
    <!--源Key,信息将从这里读取,比如 "HKEY_LOCAL_MACHINE\SOFTWARE\Test"-->
    <attribute name="Key" type="字符串" use="必选"/>
    <!--目的Key,信息将被移动到这里,比如 "HKEY_LOCAL_MACHINE\SOFTWARE\NewTest"-->
    <attribute name="NewKey" type="字符串" use="必选"/>
    <!--如果存在此值,那么仅从源移动值信息-->
    <attribute name="Value" type="字符串" use="可选"/>
    <!--新的值名称。如果不存在此属性那么名称保持不变。-->
    <attribute name="NewValue" type="字符串" use="可选"/>
    <!--True或者False,指示是否开启Wow64重定向,32位系统自动忽略-->
    <attribute name="Wow64" type="字符串" use="可选" default="False"/>
  </complexType>
</element>
<!--
1:移动7-zip注册表
<RegMove Key=” HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip”  NewKey=” HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip2”/>
2:移动7-zip注册表的Path值为OldPath
<RegMove Key=” HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip”  NewKey=” HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip2” Value=”Path” NewValue=“OldPath”/>
-->

FileMove

用于移动文件路径。其路径支持环境变量。

<element name="FileMove">
  <complexType>
    <!--源文件目录-->
    <attribute name="Src" type="字符串" use="必选"/>
    <!--目标文件目录-->
    <attribute name="Dst" type="字符串" use="必选"/>
  </complexType>
</element>
<!--
1:将系统盘的test.xml移动到test.bak
<FileMove Src="%SystemDrive%\test.xml" Dst="%SystemDrive%\test.bak"/>
-->

FileCreateByZIP

从现有的zip文件中解压一个文件释放到指定目录。

<element name="FileCreateByZIP">
  <complexType>
    <!--需要释放的目录-->
    <attribute name="Path" type="字符串" use="必选"/>
    <!--zip文件目录以及子目录-->
    <attribute name="ZIPFile" type="字符串" use="必选"/>
  </complexType>
</element>
<!--
释放 Config\default.ui.zip 中的Data\Blank.ico文件到%systemroot%\Blank.ico
<FileCreateByZIP Path="%systemroot%\Blank.ico" ZIPFile="Config\default.ui.zip/Data/Blank.ico"/>
-->

SetServiceStart

调整服务状态

<element name="SetServiceStart">
  <complexType>
    <!--服务的名称-->
    <attribute name="Name" type="字符串" use="必选"/>
    <!--服务启动类型,必须是以下值:
    0:驱动启动项
    1:系统启动
    2:自动
    3:手动
    4:禁用
    5:自动延迟
  -->
    <attribute name="Type" type="整形" use="必选"/>
  </complexType>
</element>
<!--
将aaa服务调整为禁用
<SetServiceStart  Name=”aaa”  Type="4"/>
-->

ExplorerNotify

通知系统设置更改。

<element name="ExplorerNotify">
  <complexType>
    <!--通知类型。只可能是AssocChanged(刷新文件关联)、Cmd(执行Cmd命令)、Custom(自定义)-->
    <attribute name="Type" type="字符串" use="必选"/>
    <!--表示动作是否异步进行,True或者False-->
    <attribute name="Async" type="逻辑值" use="可选" default="False"/>

    <!--需要执行的cmd命令,如果Type为Cmd,那么还允许以下属性。-->
    <!--需要执行的Cmd命令-->
    <attribute name="Cmd" type="字符串" use="必选"/>

    <!--如果Type是Custom,那么还允许以下属性-->
    <!--消息类型-->
    <attribute name="msg" type="整形(16进制)" use="必选"/>
    <!--WPARAM参数,#开头表示16进制
    #FF 一个16进制数
    TraySettings 字符串,TraySettings
  -->
    <attribute name="wParam" type="字符串/整形(16进制)" use="可选" default="NULL"/>
    <!--LPARAM参数,#开头表示16进制
    #FF 一个16进制数
    TraySettings 字符串,TraySettings
  -->
    <attribute name="lParam" type="字符串/整形(16进制)" use="可选" default="NULL"/>
    <!--是否仅通知Explorer-->
    <attribute name="Explorer" type="逻辑值" use="可选" default="False"/>
  </complexType>
</element>
<!--
1:隐藏Win10 6个文件夹后 我们需要刷新Explorer配置,可以这样
<ExplorerNotify Type="Custom" msg="111" wParam="#A220" Explorer="true"/>

2:隐藏小盾牌后,刷新文件关联以显示新的图标。
<ExplorerNotify Type="AssocChanged"/>

3:关闭netprofm服务
<ExplorerNotify Type="Cmd" Cmd=”net stop netprofm”/>

4:刷新Explorer设置
<ExplorerNotify Type="Custom" msg="1A" lParam="TraySettings"/>
-->

General

用于删除指定特征的文件,在垃圾清理常用。

<element name="General">
  <complexType>
    <!--路径名称,支持增强函数,以及环境变量-->
    <attribute name="RootPath" type="字符串" use="必选"/>
    <!--匹配类型Directory或者File。-->
    <attribute name="Flags" type="字符串" use="可选" default="Directory|File"/>

    <sequence>
      <!--要匹配的子路径,如果没有此节点,那么表示匹配所有文件-->
      <element name="Query" use="可选" default="*"/>
    </sequence>
    <sequence>
      <!--需要排除的字路径。如果没有此节点,那么表示没有排除列表。-->
      <element name="Excluded" use="可选"/>
    </sequence>
  </complexType>
</element>
<!--
将C:\123目录清空(保留123这个文件夹)
<General RootPath= C:\123"/>

将C:\123目录删除(不保留123这个文件夹)
<General RootPath= C:\">
   < Query>123</Query >
</General>

将C:\Temp里面的所有*.txt文件删除,但是保留里面的123.txt以及456.txt
<General RootPath= C:\ Temp" Flags=”File”>
    < Query >*.txt</ Query >
    < Excluded>123.txt</Excluded>
    < Excluded>456.txt</Excluded>
</General>
-->

CScript

使用C脚本进行垃圾清理,具体语法规则,请参考C编程语言C99规范。(目前仅Beta版可用)

<element name="CScript">
  <complexType>
    <!--执行脚本函数名称,其原型必须是
HRESULT WINAPI MyCleanup(DismSession Session, DWORD Flags, UINT64 *CleanUpSpace, DismCallBack CallBack, LPVOID UserData);
-->
    <attribute name="ProcName" type="字符串" use="必选"/>
  </complexType>
</element>
<!--
< CScript ProcName =” MyCleanup”/>

然后在XML的Data/ CScript中添加函数代码
<Data>
  <CScript>
    <![CDATA[
    #include <Dism++.h>
    HRESULT WINAPI MyCleanup(DismSession Session, DWORD Flags, UINT64 *CleanUpSpace, DismCallBack CallBack, LPVOID UserData)
    {
    If(CleanUpSpace)
    {
        //仅检查可用清理项目
        //…
        //检查完成后,返回可以清理的条目,单位Byte
        * CleanUpSpace=1024;
    }
    else
    {
        //进行垃圾清理 开始清理垃圾
    }
    //返回0 表示操作成功,其他任意值均表示操作失败
        return 0;
    }
    ]]>
  </CScript>
<Data>
-->

Custom

自定义清理动作,General无法满足条件时可以使用。需要自己编写dll。

<element name="Custom">
  <complexType>
    <!--
    需要调用函数的名称
    其原型必须是
    HRESULT (WINAPI*)(DismSession Session, DWORD Flags, UINT64 *CleanUpSpace, DismCallBack CallBack, LPVOID UserData);
  -->
    <attribute name="ProcName" type="字符串" use="必选"/>

    <!--10.1.2000.12以上版本可用-->
    <attribute name="Flags" type="十六进制整形" use="可选" default="#0"/>

  </complexType>
</element>

回调函数参数说明:
DismSession Session:Image会话,可以使用此会话获取Image各种信息。
DWORD Flags:保留,Dism++现在不使用此参数,请忽略。
UINT64 *CleanUpSpace:如果CleanUpSpace为空,那么函数这执行清理动作。如果不为空,说明仅预估可清理的空间。最后将预估大小用此变量返回。
DismCallBack CallBack:Dism++清理回掉函数,用于展示进度,文件路径等信息。如果此参数为NULL,则表示没有回调。
回调函数支持以下消息:
DISM_MSG_PROGRESS – 用于反馈处理进度,进度信息wParam为当前完成百分比,lParam暂不使用,设置为0即可。
DISM_MSG_PROCESS – 用于在状态栏中展示正在处理的文件路径,wParam = (PWSTR) pszFullPath,lParam设置0即可。
DISM_MGS_RemoveInfo – 报告UI需要删除的文件,此消息仅扫描时可用,清理时将无视此消息。wParam设置为0,lParam=(LPCWSTR)FilePath 表示需要删除的路径。Dism++收到此消息后,会将文件路径展示在详细信息中。

LPVOID UserData:回调函数的UserData部分,请务必传入CallBack中。

回调函数返回值:
如果函数执行成功,请返回 S_OK,其他任何值都表示错误。