You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 18:48:41