我使用下面的powershell脚本删除SharePoint警报。
foreach ($site in Get-SPSite -Limit All)
{
"Site Collection $site"
foreach ($web in $site.allwebs)
{
" Web $web"
$c = $web.alerts.count
" Deleting $c alerts"
for ($i=$c-1;$i -ge 0; $i--) { $web.alerts.delete($i) }
}
}
Dev,Test和UAT环境中每个都有大约100万个警报。一次性删除所有警报需要花费数小时,并且当服务器自动定期重新启动时,脚本无法完全执行。
我知道要在重新启动后恢复PowerShell脚本,我们可以将PowerShell 工作流程与检查点 - 工作流程一起使用,但不确定将检查点和PSPersist放在哪里
需要帮助才能在系统重启后继续删除上述脚本中的警报。
更新:尝试实施后,我意识到SharePoint PowerShell cmdlet无法与PowerShell Workflow结合使用。它不允许
Add-PSSnapin "Microsoft.SharePoint.PowerShell"
将添加到工作流程
Workflow SPAlerts
{
//Below tweaks didn't work
InlineScript{Add-PSSnapin "Microsoft.SharePoint.PowerShell"}
Invoke-Command -ScriptBlock {Add-PSSnapin "Microsoft.SharePoint.PowerShell"}
Invoke-Expression "......"
}
答案 0 :(得分:1)
您可以在工作流程的任何位置放置检查点,包括在每个命令或表达式之前和之后,或者在工作流程中的每个活动之后。 Windows PowerShell工作流允许您这样做。
...在工作流的每个重要部分完成后添加一个检查点;如果工作流程中断,您不想重复的部分。
...工作流程定义完成后,使用测试流程优化检查点。添加和删除(注释掉)检查点,以实现合理的运行时间和合理的恢复时间。
查看您的代码,如果删除给定网站的警报平均需要合理的时间,我会将检查点放在"Site Collection $site"
之后。如果只有少数网站,每个网站都包含大量警报,那么我会把它放在下一个foreach的开头。
我绝对不会将它放在删除警报的工作者foreach中。
我还建议您查看工作流的foreach -Parallel
功能,以使删除并行。这样即使服务器经常重启,即使最后一个站点/网站也应该轮到它。