[英]How to resume PowerShell script after system reboot?
我正在使用下面的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) }
}
}
在开发,测试和UAT环境中,大约有数百万条警报。 一次删除所有警报需要花费数小时,而且由于服务器会定期自动重新启动,因此脚本无法完全执行。
我知道重启后要恢复PowerShell脚本,我们可以将PowerShell Workflow与Checkpoint-workflow一起使用,但不确定在哪里放置checkpoint和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 "......"
}
MSDN文档指出:
您可以在工作流中的任何位置放置检查点,包括在每个命令或表达式之前和之后,或在工作流中的每个活动之后。 Windows PowerShell工作流允许您这样做。
...在工作流的每个重要部分完成之后添加检查点; 如果工作流程中断,您不想重复的部分。
...当工作流程定义完成时,使用测试过程来完善您的检查点。 添加和删除(注释掉)检查点以实现合理的运行时间和合理的恢复时间。
查看您的代码,如果删除给定网站的警报平均花费合理的时间,我将在"Site Collection $site"
之后放置检查点。 如果只有几个站点,每个站点包含大量警报,那么我会将其放在下一个foreach的开始处。
我绝对不会将其放置在删除警报的worker foreach中。
我还建议您查看工作流的foreach -Parallel
功能,以使删除操作并行进行。 这样,即使服务器经常重启,即使是最后一个站点/网站也应该轮到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.