繁体   English   中英

系统重启后如何恢复PowerShell脚本?

[英]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 WorkflowCheckpoint-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM