删除SharePoint文档库

时间:2018-02-21 14:00:49

标签: powershell sharepoint

我想创建将由日程安排程序每天运行的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

1 个答案:

答案 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()
    }    
}