如何通过PowerShell解析CRM工作流XAML提取流操作信息
PowerShell解析CRM工作流XAML提取操作内容实现方案
CRM存储的经典工作流/旧版Power Automate流XAML是标准Windows Workflow Foundation(WF)格式,直接用PowerShell内置的XML解析能力即可提取指定操作信息,不需要依赖第三方工具,具体实现步骤如下:
1. 修正现有遍历逻辑
Get-CrmRecords 返回的结果中,实际工作流记录存储在 CrmRecords 属性下,直接遍历返回对象会取不到字段值,先修正基础查询逻辑:
# 连接CRM组织后执行查询 $myworkflows = Get-CrmRecords -EntityLogicalName workflow -Fields name,workflowid,xaml,statecode # 遍历实际的工作流记录集合 foreach($workflow in $myworkflows.CrmRecords) { # 跳过XAML为空的停用工作流/非经典流 if([string]::IsNullOrWhiteSpace($workflow.values.xaml)){ continue } Write-Host "正在处理工作流:$($workflow.values.name)" $xamlContent = $workflow.values.xaml # 后续解析逻辑写在这里 }
2. 处理XAML命名空间完成XML加载
WF格式的XAML根节点带默认命名空间,直接用XML方法查询节点会匹配失败,需要先注册命名空间前缀再做节点检索:
# 将XAML字符串加载为XML对象 $xamlXml = New-Object System.Xml.XmlDocument $xamlXml.LoadXml($xamlContent) # 注册XAML用到的命名空间,不同CRM版本命名空间可能有细微差异,可根据实际XAML内容调整 $nsMgr = New-Object System.Xml.XmlNamespaceManager($xamlXml.NameTable) $nsMgr.AddNamespace("x", "http://schemas.microsoft.com/netfx/2009/xaml/activities") # WF核心命名空间 $nsMgr.AddNamespace("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006") $nsMgr.AddNamespace("mva", "clr-namespace:Microsoft.Crm.Workflow.Activities;assembly=Microsoft.Crm.Workflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35") # CRM内置活动命名空间
3. 提取指定流操作信息
完成XML加载后,即可通过XPath匹配需要的操作节点,以下是常用场景的实现示例:
- 检索所有发送邮件的操作
# 匹配所有发送邮件活动节点 $sendEmailActions = $xamlXml.SelectNodes("//x:SendEmail", $nsMgr) foreach($action in $sendEmailActions){ Write-Host "找到发送邮件操作,邮件模板ID:$($action.TemplateId)" }
- 检索所有更新实体记录的操作
$updateRecordActions = $xamlXml.SelectNodes("//mva:UpdateEntity", $nsMgr) foreach($action in $updateRecordActions){ Write-Host "找到更新记录操作,目标实体:$($action.EntityName)" }
- 检索所有自定义工作流活动
# 自定义工作流活动节点类型为x:Activity,带TypeName属性标识自定义类 $customActions = $xamlXml.SelectNodes("//x:Activity[@TypeName]", $nsMgr) foreach($action in $customActions){ Write-Host "找到自定义工作流活动,类型:$($action.TypeName)" }
- 快速检索XAML中包含特定关键词的操作
如果不需要精确提取属性,只是要找包含特定内容的流,可以直接做字符串匹配,效率更高:
$keyword = "客户等级字段" if($xamlContent -match $keyword){ Write-Host "工作流 $($workflow.values.name) 包含目标关键词" }
注意事项
- 若节点匹配不到结果,可先输出XAML根节点的
xmlns属性列表,将代码中注册的命名空间替换为当前环境实际使用的版本即可 - 新版云端Power Automate流的定义不会存储在workflow实体的xaml字段中,该方法仅适用于Dynamics CRM经典工作流、旧版UI流、本地WF构建的流程
- 若需要提取操作内的字段赋值逻辑,可继续遍历节点下的子节点,读取对应属性值即可
内容的提问来源于stack exchange,提问作者JuTrust
相关产品推荐
相关产品推荐

