Отображение прогресса при восстановлении базы данных с помощью PowerShell и SMO - PullRequest
9 голосов
/ 12 августа 2010

У меня есть скрипт для восстановления базы данных с помощью PowerShell и SMO.Теперь я знаю, что могу передать обработчик событий в PercentComplete на объекте восстановления и получить ход восстановления, как это происходит.Проблема в том, что я не знаю, как создать обработчик событий и передать ему функцию в PowerShell?Я могу сделать это в C #

restore.PercentComplete += new PercentCompleteEventHandler(restore_PercentComplete);

static void restore_PercentComplete(object sender, PercentCompleteEventArgs e)
{
  System.Console.WriteLine("{0}", e.Percent);
}

Любая помощь будет оценена.

Спасибо.

Ответы [ 2 ]

16 голосов
/ 12 августа 2010

После некоторого более глубокого поиска я наконец нашел это в документации. Чтобы добавить обработчики событий, вам нужно сделать следующее:

Импорт соответствующих сборок;

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SmoExtended') | out-null
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.ConnectionInfo') | out-null

Теперь, чтобы создать обработчик событий, вам нужно объявить его с помощью встроенной функции;

$percentEventHandler = [Microsoft.SqlServer.Management.Smo.PercentCompleteEventHandler] { Write-Host "Restored " $_.Percent "%" }
$completedEventHandler = [Microsoft.SqlServer.Management.Common.ServerMessageEventHandler] { Write-Host "Database " $databasename " Created Successfuly!" }

Теперь последний шаг - добавить обработчик событий к объекту, с которым вы работаете. Обычно в C # вы просто делаете следующее:

restore.PercentComplete += new PercentCompleteEventHandler(restore_PercentComplete);
restore.Complete += new Microsoft.SqlServer.Management.Common.ServerMessageEventHandler(restore_Complete);

Это не будет работать в скрипте PowerShell, вам нужно использовать сгенерированную функцию для добавления событий. Имя функции - это EventHandlerName с добавлением «add_» в начале, например:

$dbRestore.add_PercentComplete($percentEventHandler)
$dbRestore.add_Complete($completedEventHandler)

Надеюсь, это поможет кому-то другому, пытающемуся сделать это!

1 голос
/ 13 августа 2010

Вы можете сделать это в асинхронном стиле с помощью pseventing в v1 powershell - http://pseventing.codeplex.com. проверять прогресс в любое время вместо ожидания.v2 powershell имеет свое собственное событие.

Я включил сценарий в pseventing, чтобы делать именно то, что вы говорите, за исключением фонового режима.

-Oisin

...