我有一个用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);
}
任何帮助都将不胜感激。
谢谢。
答案 0 :(得分:16)
经过深入搜索后,我终于在文档中找到了它。要添加事件处理程序,您需要执行以下操作:
导入相关的程序集;
[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 :(得分:1)
你可以在v1 powershell中使用pseventing来实现异步样式 - http://pseventing.codeplex.com。随时检查进度而不是等待。 v2 powershell有自己的事件。
我在pseventing中包含一个脚本来完成您所说的内容,除非是以后台方式。
-Oisin