2015-05-22 3 views
1

Я использую сценарий powershell ниже, чтобы удалить оповещения SharePoint.Как возобновить сценарий PowerShell после перезагрузки системы?

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 имеется около миллиона предупреждений. Требуется много часов, чтобы удалить все предупреждения за один раз, и поскольку серверы автоматически перезапускаются периодически, сценарий не выполняется полностью.

Я знаю, что возобновить сценарии PowerShell после перезагрузки мы можем использовать PowerShell Workflow с Checkpoint документооборотом, но не уверен, где разместить контрольно-пропускные пункты и PSPersist.

Нужна помощь для возобновления удаления предупреждений в приведенном выше скрипте после перезагрузки системы.

Обновление: После попытки реализовать это я понял, что командлеты SharePoint PowerShell не могут быть связаны с 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

В MSDN documentation состояний:

Вы можете разместить контрольно-пропускные пункты в любом месте в рабочем процессе, в том числе до и после каждой команды или выражения или после каждого действия в рабочем процессе. Рабочий процесс Windows PowerShell позволяет это сделать.

... Добавить контрольную точку после завершения каждой значимой части рабочего процесса; часть, которую вы не хотите повторять, если рабочий процесс прерывается.

... Когда определения рабочего процесса завершены, используйте процесс тестирования для уточнения контрольных точек. Добавляйте и удаляйте контрольные точки для достижения как разумного времени работы, так и разумного времени восстановления.

Посмотрите на свой код, я бы поставил контрольно-пропускной пункт сразу после "Site Collection $site", если удаление предупреждений для данного веб-сайта занимает в среднем разумное время. Если есть только несколько сайтов, каждый из которых содержит тонны предупреждений, я бы разместил его в начале следующего foreach.

Я бы определенно не поместил его внутри рабочего foreach, который удаляет предупреждения.

Я также предлагаю вам взглянуть на возможность рабочих процессов foreach -Parallel, чтобы сделать параллельную операцию удаления. Таким образом, даже последний сайт/веб-сайт должен получить свою очередь, даже если сервер часто перезагружается.

Смежные вопросы