规则结构参考
优质
小牛编辑
141浏览
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,其他任何值都表示错误。