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

如何用PowerShell检测SharePoint 2010站点集是否使用托管元数据

检测SharePoint 2010站点集的Managed Metadata使用情况

没问题,这个需求完全可以用PowerShell实现,我帮你整理了一套可行的脚本和操作步骤,刚好匹配你要的输出格式:

核心思路

SharePoint 2010中,Managed Metadata是通过TaxonomyField类型的字段来使用的,这些字段可能存在于站点栏、列表自定义字段或内容类型中。我们的脚本会遍历所有站点集,检查这些字段,标记是否使用托管元数据,并提取关联的TermSet信息。

具体操作步骤

1. 准备环境

打开SharePoint 2010 Management Shell(确保你的账号有Farm管理员权限或足够的站点读取权限),如果用普通PowerShell窗口,先加载SharePoint Snapin:

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

2. 执行检测脚本

直接运行以下脚本,它会自动遍历所有站点集,输出你需要的格式:

# 加载SharePoint PowerShell Snapin(如果未自动加载)
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

# 输出表头(和你要求的格式对应)
Write-Host "Url: Managed MetaData"

# 遍历所有站点集
foreach ($site in Get-SPSite -Limit All) {
    try {
        $usesMM = $false
        $termSetList = @()

        # 遍历站点集下的所有子站点
        foreach ($web in $site.AllWebs) {
            try {
                # 检查站点级托管元数据字段
                foreach ($field in $web.Fields) {
                    if ($field -is [Microsoft.SharePoint.Taxonomy.TaxonomyField]) {
                        $usesMM = $true
                        # 获取TermSet和TermStore信息
                        $termStore = $field.SiteCollectionTermStore
                        $termSet = $termStore.GetTermSet($field.TermSetId)
                        $termSetList += "$($termSet.Name) (TermStore: $($termStore.Name))"
                    }
                }

                # 检查列表级自定义托管元数据字段
                foreach ($list in $web.Lists) {
                    foreach ($field in $list.Fields) {
                        if ($field -is [Microsoft.SharePoint.Taxonomy.TaxonomyField]) {
                            $termStore = $field.SiteCollectionTermStore
                            $termSet = $termStore.GetTermSet($field.TermSetId)
                            $termSetEntry = "$($termSet.Name) (TermStore: $($termStore.Name))"
                            # 避免重复添加相同的TermSet
                            if (!$termSetList.Contains($termSetEntry)) {
                                $usesMM = $true
                                $termSetList += $termSetEntry
                            }
                        }
                    }
                }
            }
            finally {
                # 手动释放Web对象,防止内存泄漏
                $web.Dispose()
            }
        }

        # 输出结果:匹配你要的格式
        $termSetInfo = if ($termSetList.Count -gt 0) { $termSetList | Select-Object -Unique -join ', ' } else { "" }
        if ($usesMM) {
            Write-Host "$($site.Url) Yes $termSetInfo"
        } else {
            Write-Host "$($site.Url) No"
        }
    }
    finally {
        # 释放Site对象
        $site.Dispose()
    }
}

脚本说明

  • 遍历范围:脚本会检查站点集下的所有子站点、站点栏和列表字段,确保不会遗漏任何使用Managed Metadata的场景。
  • 去重处理:同一个TermSet可能被多个字段引用,脚本会自动去重,避免重复输出。
  • 内存管理:每个SPWeb和SPSite对象都用Dispose()手动释放,防止大量站点集导致的内存溢出。
  • 输出格式:完全匹配你给出的示例,Yes会附带TermSet名称和对应的TermStore,No则仅标记状态。

注意事项

  • 390个站点集的检测可能需要较长时间,建议在业务低峰期执行。
  • 如果只需要检测特定Web应用的站点集,可以把Get-SPSite -Limit All替换为:Get-SPWebApplication "http://your-web-app-url" | Get-SPSite -Limit All。
  • 确保运行脚本的账号对所有目标站点集有读取权限,否则会跳过无权限的站点。

内容的提问来源于stack exchange,提问作者Gatewarden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:16:44