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

时间:2015-05-22 11:15:03

标签: powershell sharepoint workflow

我使用下面的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 "......"
}

1 个答案:

答案 0 :(得分:1)

MSDN documentation州:

  

您可以在工作流程的任何位置放置检查点,包括在每个命令或表达式之前和之后,或者在工作流程中的每个活动之后。 Windows PowerShell工作流允许您这样做。

     

...在工作流的每个重要部分完成后添加一个检查点;如果工作流程中断,您不想重复的部分。

     

...工作流程定义完成后,使用测试流程优化检查点。添加和删​​除(注释掉)检查点,以实现合理的运行时间和合理的恢复时间。

查看您的代码,如果删除给定网站的警报平均需要合理的时间,我会将检查点放在"Site Collection $site"之后。如果只有少数网站,每个网站都包含大量警报,那么我会把它放在下一个foreach的开头。

我绝对不会将它放在删除警报的工作者foreach中。

我还建议您查看工作流的foreach -Parallel功能,以使删除并行。这样即使服务器经常重启,即使最后一个站点/网站也应该轮到它。