Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 删除SharePoint文档库中的特定项_Powershell_Sharepoint - Fatal编程技术网

Powershell 删除SharePoint文档库中的特定项

Powershell 删除SharePoint文档库中的特定项,powershell,sharepoint,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

我想创建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字符:14
+foreach($items中的项目)
+~~~~
+类别信息:操作停止:(:)[],无效操作异常
+FullyQualifiedErrorId:System.InvalidOperationException


代码不起作用的原因是您试图从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()
    }    
}
$web=获取spweb“URL”
$Libraries=$web.Lists |其中{$\.BaseType-eq“DocumentLibrary”}
foreach($库中的库){
$query=新对象Microsoft.SharePoint.SPQuery
$query.query=“1”
$items=$library.GetItems($query)
对于($i=0;$i-lt$items.Count;$i++)
{
$items[$i].delete()
}    
}

您收到了什么错误消息?很抱歉,我没有编写场景。现在我将编辑问题。当您使用调试器时,是否确实调用了$item.delete()?第4行应该是$items=$library.items,第5行应该是,foreach($items中的item),谢谢Jatin patil!我错过了。我收到了错误信息,将在原始帖子中发布。感谢您的澄清。虽然我认为第二个版本的脚本会更适合我,但它并没有给我任何结果。它没有从任何库中删除项目。但是第一次工作起来很有魅力。CAML查询非常挑剔(并且区分大小写),所以如果有什么不对劲,它就不会工作。如果您想让第二个版本正常工作,可以尝试首先输出$items的内容,以确保CAML查询正常工作。例如($i=0;$i-lt$items.Count;$i++){Write Host$items[$i].Title}