我们已经安排了一个PowerShell脚本,并在过去3-4个月内成功执行(在Test和Prod中)。该脚本的目的是在从外部系统触发某些触发器时更新SharePoint中的文档属性。在没有详细介绍的情况下,下面是用于更新已声明为记录的文档的项属性的代码:
$recordsmanagement=[Microsoft.Office.RecordsManagement.RecordsRepository.Records]
$recordsmanagement::UndeclareItemAsRecord($item)
$item = $list.GetItemById($item.id)
$item.File.CheckOut()
$item[$sSpFieldName]=$sDbValue
$item.Update()
$item = $list.GetItemById($item.id)
$item.File.CheckIn("")
$recordsmanagement::DeclareItemAsRecord($item)
这段代码已经运行了数百次没有问题。出于某种原因,这段代码在一周前开始轰炸最后一行(当重新声明为记录时):
System.Management.Automation.MethodInvocationException: Exception calling "DeclareItemAsRecord" with "1" argument(s): "The file /lib/folder/file.pdf has been modified by SHAREPOINT\system on 10 Oct 2012 00:00:47 -0500."
另一个奇怪的部分是,这只发生在Prod。测试环境似乎执行得很好。我还没有尝试过修改生产,但我很确定我可以使用GetItemById(在CheckIn之后)再次获取$ item对象。我现在有点犹豫不决,因为我想首先得到其他人的观点。
有人对此有任何意见吗?提前谢谢。
答案 0 :(得分:0)
我认为最好的选择是在签到后再次获得该项目。
错误消息表明确实如此。您正在尝试对已修改的SPListItem执行操作。因此,在将其声明为记录之前,请使用GetItemById再次将其拉出来。
为什么它只发生在某些记录和某些环境中我不确定。我猜Sharepoint有点气质。
我也会尝试: