如何正确编写PowerShell IF条件判断SharePoint列表中是否存在指定URL
问题分析与修复方案
原脚本中判断站点URL是否已存在于列表的逻辑失效,原因是直接对列表项集合$ListItems访问FieldValuesAsText.SiteUrl无法正确提取所有已有的SiteUrl值数组,PowerShell无法自动将集合中每个项的属性展开为单一数组。
修复步骤
- 提前提取所有已存在的SiteUrl
在进入循环之前,先从列表项中提取所有已有的SiteUrl并存储到数组中:
# 获取列表后,提取所有已存在的SiteUrl到数组 $ListItems = Get-PnPListItem -List $List $existingSiteUrls = $ListItems | ForEach-Object { $_.FieldValuesAsText.SiteUrl }
- 修改判断条件
将原来失效的判断行替换为:
if ($Site.Url -notin $existingSiteUrls) { Add-PnPListItem -List $List -Values @{"Hub" = $Hub.SiteUrl; "SiteUrl" = $Site.Url} }
完整修复后的脚本
Connect-PnPOnline -Url "https://myCompany-admin.sharepoint.com" -Interactive $Report = @() Write-Host "获取所有中心网站列表..." $HubSites = Get-PnPHubSite Write-Host "获取所有关联了中心网站的站点列表..." $Sites = Get-PnPTenantSite | ? {$_.HubSiteId.Guid -ne "00000000-0000-0000-0000-000000000000"} Write-Host "连接到目标SharePoint站点..." $connection = Connect-PnPOnline -Url "https://myCompany.sharepoint.com/sites/HubSiteMap" -Interactive $List = Get-PnPList "Sites" -Connection $connection $ListItems = Get-PnPListItem -List $List # 提取所有已存在的SiteUrl到数组 $existingSiteUrls = $ListItems | ForEach-Object { $_.FieldValuesAsText.SiteUrl } ForEach($Hub in $HubSites) { # 获取中心网站ID $HubSiteId = $Hub.ID.GUID # 遍历每个站点集合 ForEach($Site in $Sites) { # 获取当前站点关联的中心网站ID $AssociatedHubSiteID = $Site.HubSiteId.Guid If ( ($AssociatedHubSiteID -eq $HubSiteId) -and ($Hub.SiteUrl -ne $Site.Url) ) { $ReportEntry = "" | Select-Object Hub,SiteUrl $ReportEntry.Hub = $Hub.SiteUrl $ReportEntry.SiteUrl = $Site.Url $Report += $ReportEntry if ($Site.Url -notin $existingSiteUrls) { Add-PnPListItem -List $List -Values @{"Hub" = $Hub.SiteUrl; "SiteUrl" = $Site.Url} # 添加后更新数组,避免重复判断(可选) $existingSiteUrls += $Site.Url } } } }
额外优化(可选)
在添加新列表项后,将新的SiteUrl追加到$existingSiteUrls数组中,避免后续循环重复检查已添加的项,提升脚本执行效率。
内容的提问来源于stack exchange,提问作者NightTom
相关产品推荐
相关产品推荐

