【发布时间】:2019-01-29 10:44:29
【问题描述】:
在 Sharepoint 库中,我们有一个自定义字段,它是多用户字段,该库存储员工图片。但是有时人们离开公司,我们需要删除他们的照片。
我创建了一个执行以下步骤的脚本:
- 它对整个库、多用户字段进行查询,然后得到一个唯一列表。
- 然后,它会针对每个用户查询列表,以查看哪些特定列表项有一张不再在这里工作的人的照片。
Sharepoint 存储多人字段的问题如下:
57;#JohnSmith 56;#Johanna Smith
所以,我所做的是与匹配项进行比较,但我没有得到我想要的结果。
示例结果:
56;#John Smith
Picture1_2012_09_07_123jpg.jpg + + 56;#John Smith
第一个结果是OK的。
第二个结果是这样的:
WilliamGates_1jpg.jpg + + 056;#William Gates (Not OK)
JeanClaudeVanDamme_2011_05_24__112jpg.jpg + + 560;#JeanClaudeVanDamme (Not OK)
我的脚本:
Add-PSSnapin Microsoft.Sharepoint.powershell
#$ErrorActionPreference = "Stop"
#Set-StrictMode -Version "Latest"
#. .\Functions-Logging.ps1
#Start-History -name "PDB Asset Cleaning"
$site = Get-SPSite https://oursharepointsite.com/sites/pdb/
$web = $site.RootWeb
$expiredAccountFound = $false
$context = Get-SPServiceContext $site
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
$camlQuery = New-Object Microsoft.SharePoint.SPQuery
$camlQuery.Query = '<Where><And><Neq><FieldRef Name="ContentType" /><Value Type="Computed">Folder</Value></Neq><IsNotNull><FieldRef Name="Persons_PDB" /></IsNotNull></And></Where>'
$camlQuery.ViewFields = '<FieldRef Name="Persons_PDB" />'
$camlQuery.ViewFieldsOnly = $true
$camlQuery.ViewAttributes = 'Scope="Recursive"'
$list = $web.Lists.TryGetList("Assets")
$listItems = $list.GetItems($camlQuery)
$filteredItems = $listItems | ForEach-Object {$_.Item("Persons_PDB").LookupValue} | Select -Unique
$date = Get-Date
$fileName = "D:\Installers\PictureDB\R 1.0\Scripts\Add-ArtifactsToWeb\" + $date.ToShortDateString().Replace('/','-') + ".txt"
$message = "Report of " + $date.ToShortDateString()
$message += "`r`n"
$message += "`r`n"
foreach($item in $filteredItems)
{
$user = $web.EnsureUser($item)
if (-Not $profileManager.UserExists($user.LoginName))
{
$loginName = $user.LoginName.Substring(13)
Write-Host $loginName
$userFromAD = Get-ADUser -Filter {SAMAccountName -eq $loginName}
$concatenatedUser = $user.ID.ToString() + ";#" + $userFromAd.Name
Write-Host $concatenatedUser
$query = [String]::Format("<Where><Contains><FieldRef Name='Persons_PDB' LookupId='True'/><Value Type='LookupMulti'>{0}</Value></Contains></Where>",$user.ID)
$userItemsQuery = New-Object Microsoft.SharePoint.SPQuery
$userItemsQuery.Query = $query
$userItemsQuery.ViewAttributes = 'Scope="Recursive"'
$userItems = $list.GetItems($userItemsQuery)
foreach($item in $userItems)
{
if($item["Persons_PDB"].ToString() -match $concatenatedUser)
{
write-host $item.File.Name +" " + $item["Persons_PDB"]
}
#Write-Host $item . "will be deleted"
#Write-Host $list.GetItemById($item.Id)
#$list.GetItemById($item.Id).Recycle()
}
}
}
$web.Dispose()
$site.Dispose()
#Stop-History
【问题讨论】:
-
-match期望$concatenatedUser是正则表达式,但您没有提供正则表达式。它是否适用于简单的“-eq”?字符串中的#可能会造成混淆,因为它具有特殊含义(注释):Regular Expression Quick Reference -
你可以试试
-match [Regex]::Escape($concatenatedUser)
标签: regex powershell sharepoint