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