如何使用Powershell遍历站点下所有项目获取Project自定义字段值
解决方案
可用Snapin说明
你需要的对应Snapin为 Microsoft.Office.Project.Server.PowerShell,专门用于Project Server相关的Powershell操作,搭配SharePoint自带的Microsoft.SharePoint.PowerShell即可实现获取Project自定义字段值的需求。
原代码问题说明
你当前的代码存在两处问题:
- 拼写错误:
$web.Fileds应为$web.Fields - 逻辑错误:
$web.Fields存储的是SharePoint站点级的字段定义,并不存储Project Server项目实体的自定义字段值,也不能直接读取字段对应的业务数据,字段值需要从对应的业务实体(项目/列表项)上获取。
完整实现代码
场景1:获取Project Server项目实体的自定义字段值
需在Project Server应用服务器,或已安装Project Server客户端组件的环境下运行:
# 加载必要Snapin Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue Add-PSSnapin Microsoft.Office.Project.Server.PowerShell -ErrorAction SilentlyContinue # 配置参数 $pwaUrl = "<mysite>/sites/pwa" $targetCustomFieldName = "替换为你要获取的自定义字段名称" # 初始化PWA上下文 $pwaSite = Get-SPSite $pwaUrl $pwaContext = New-Object Microsoft.ProjectServer.Client.ProjectContext($pwaUrl) $pwaContext.Credentials = [System.Net.CredentialCache]::DefaultCredentials # 加载项目集合和自定义字段集合 $allProjects = $pwaContext.Projects $allCustomFields = $pwaContext.CustomFields $pwaContext.Load($allProjects) $pwaContext.Load($allCustomFields) $pwaContext.ExecuteQuery() # 匹配目标自定义字段 $targetCf = $allCustomFields | Where-Object { $_.Name -eq $targetCustomFieldName } if($targetCf){ # 遍历所有项目读取自定义字段值 foreach($proj in $allProjects){ $pwaContext.Load($proj) $pwaContext.ExecuteQuery() $cfValue = $proj[$targetCf.InternalName] Write-Host "项目名称:$($proj.Name),自定义字段值:$cfValue" } }else{ Write-Host "未找到名称为 $targetCustomFieldName 的Project自定义字段" } # 释放站点资源 $pwaSite.Dispose()
场景2:获取SharePoint站点下所有列表项的自定义字段值
如果你要获取的是SharePoint列表级的自定义字段,而非Project项目实体的字段,可以用以下修正后的代码:
$site = Get-SPSite "<mysite>/sites/pwa" foreach($web in $site.AllWebs) { foreach($list in $web.Lists){ foreach($item in $list.Items){ Write-Host "站点:$($web.Title),列表:$($list.Title),字段值:$($item['customfieldname'])" } } $web.Dispose() } $site.Dispose()
注意事项
- 运行账号需要有PWA项目访问权限、SharePoint站点管理权限
- 若不在Project Server应用服务器运行,需提前安装Project Server客户端SDK组件
内容的提问来源于stack exchange,提问作者Konrad L
相关产品推荐
相关产品推荐

