2010-08-12 7 views
9

Mam skrypt do przywracania bazy danych za pomocą PowerShell i SMO. Teraz wiem, że mogę przekazać procedurę obsługi zdarzeń do PercentComplete na obiekcie przywracania i uzyskać postęp przywracania, jak to się dzieje. Problem polega na tym, że nie wiem, jak utworzyć procedurę obsługi zdarzeń i przekazać jej funkcję w PowerShell? Mogę to zrobić w języku C#Wyświetlanie postępu podczas przywracania bazy danych za pomocą PowerShell i SMO

Każda pomoc zostanie doceniona.

Dziękuję.

Odpowiedz

16

Po głębszym przeszukaniu znalazłem go w dokumentacji. Aby dodać moduły obsługi zdarzeń, należy wykonać następujące czynności:

Zaimportować odpowiednie zespoły;

[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 

Teraz, aby utworzyć procedurę obsługi zdarzenia, należy ją zadeklarować za pomocą funkcji inline;

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

Teraz ostatnim krokiem jest dodanie obsługi zdarzeń do obiektu, z którym pracujesz. Zwykle w języku C# wystarczy wykonać następujące czynności;

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

To nie zadziała w skryptu PowerShell, co trzeba zrobić, to skorzystać z funkcji dodawania wygenerowanego zdarzenia. Nazwa funkcji to EventHandlerName z dopiskiem "add_" dołączonym na początku, tak jak;

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

Mam nadzieję, że to pomoże każdemu, kto spróbuje to zrobić!

+1

Dobra robota :) Myślę, że to nie jest potrzebne do oddania scriptblocks podczas przypisywania do ładowarki. – stej

+2

Można użyć Write-Progress zamiast Write-Host. – JasonMArcher

+0

dzięki za dodanie tego szczegółu. bardzo pomocny, gdy pracowałem nad innymi przykładami – SheldonH

1

Możesz zrobić to w stylu asynchronicznym z pseventingiem w wersji 1 powershell - http://pseventing.codeplex.com. sprawdź postęp, kiedy chcesz, zamiast czekać. v2 powershell ma własne zdarzenia.

Dołączam skrypt w pseventing, aby zrobić dokładnie to, co mówisz, z wyjątkiem mody w tle.

-Oisin

Powiązane problemy