2010-08-12 14 views
9

Tengo un script para restaurar una base de datos con PowerShell y SMO. Ahora sé que puedo pasar un controlador de eventos a PercentComplete en el objeto de restauración y obtener el progreso de la restauración a medida que ocurre. El problema es que no sé cómo crear un controlador de eventos y pasarle una función en PowerShell. Puedo hacerlo en C#Mostrar el progreso al restaurar la base de datos con PowerShell y SMO

restore.PercentComplete += new PercentCompleteEventHandler(restore_PercentComplete); 

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

Cualquier ayuda sería apreciada.

Gracias.

Respuesta

16

Después de una búsqueda más profunda finalmente lo encontré en la documentación. Para agregar controladores de eventos, debe hacer lo siguiente:

Importe los ensamblajes pertinentes;

[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 

Ahora, para crear el controlador de eventos, debe declararlo con una función en línea;

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

Ahora el último paso es agregar el controlador de eventos al objeto con el que está trabajando. Normalmente en C# solo haces lo siguiente;

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

Esto no funcionará en el script de PowerShell, lo que necesita hacer es usar la función generada para agregar eventos. El nombre de la función es EventHandlerName con "add_" agregado al principio, como tal;

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

¡Espero que esto ayude a cualquier otra persona que intente hacer esto!

+1

Buen trabajo :) supongo que no es necesario para emitir los scriptblocks al asignar a los manipuladores. – stej

+2

Puede usar Write-Progress en lugar de Write-Host. – JasonMArcher

+0

gracias por agregar este detalle. muy útil ya que estaba trabajando a través de otros ejemplos – SheldonH

1

Puede hacerlo en estilo asincrónico con pseventing en v1 powershell - http://pseventing.codeplex.com. verifique el progreso siempre que lo desee en lugar de esperar. v2 powershell tiene su propio evento.

incluyo un script en pseventing para hacer exactamente lo que dices, excepto en forma de fondo.

-Oisin

Cuestiones relacionadas