我想创建将由日程安排程序每天运行的PowerShell脚本 应删除的文档在第1列中具有“是”值 贝娄是我的代码,但我不确定为什么它不起作用
$web = get-spweb "URL"
$Libraries = $web.Lists | where {$_.BaseType -eq "DocumentLibrary"}
foreach ($library in $Libraries) {
$items = $library.items
foreach ($item in $items)
{
If($item["Column1"] -eq "Yes")
{
$item.delete()
}
}
}
有什么建议我做错了吗?
修改: 我运行脚本后,它没有给我任何错误信息,但文件没有被删除。
EDIT2 :代码编辑后,我收到以下消息:
收藏被修改;枚举操作可能无法执行。在
C:\ Users \ user \ Desktop \ DeleteItems.ps1:5 char:14
+ foreach($ item中的$ item)
+ ~~~~~
+ CategoryInfo:OperationStopped:(:) [],InvalidOperationException
+ FullyQualifiedErrorId:System.InvalidOperationException
答案 0 :(得分:1)
您的代码无效的原因是您尝试从foreach循环内的枚举中删除项目。如果在foreach循环期间添加或删除项目,.NET中的大多数集合都会抛出异常。
尝试常规for循环,看看会发生什么:
$web = get-spweb "URL"
$Libraries = $web.Lists | where {$_.BaseType -eq "DocumentLibrary"}
foreach ($library in $Libraries) {
$items = $library.items
for ($i=0; $i -lt $items.Count; $i++)
{
If($items[$i]["Column1"] -eq "Yes")
{
$items[$i].delete()
}
}
}
这可能已经足够了,但是PowerShell可能会为外部foreach循环抛出异常,因为从技术上讲,您正在修改循环内的文档库。如果是这种情况,你也需要在外面使用for循环。
另外,加速PowerShell的一种方法是对文档库使用caml查询,这样它只返回Column1 = yes的项(我假设Column1是Yes / No字段)。这看起来像这样:
$web = get-spweb "URL"
$Libraries = $web.Lists | where {$_.BaseType -eq "DocumentLibrary"}
foreach ($library in $Libraries) {
$query = New-Object Microsoft.SharePoint.SPQuery
$query.Query = "<Where><Eq><FieldRef Name='Column1'/><Value Type='Boolean'>1</Value></Eq></Where>"
$items = $library.GetItems($query)
for ($i=0; $i -lt $items.Count; $i++)
{
$items[$i].delete()
}
}