使用PowerShell和SMO恢复数据库时显示进度

Luk*_*asz 9 sql-server powershell smo event-handling

我有一个用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);
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

谢谢.

Luk*_*asz 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
Run Code Online (Sandbox Code Playgroud)

现在要创建事件处理程序,您需要使用内联函数声明它;

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

现在,最后一步是将事件处理程序添加到您正在使用的对象中.通常在C#中你只需要做以下事情;

restore.PercentComplete += new PercentCompleteEventHandler(restore_PercentComplete);
restore.Complete += new Microsoft.SqlServer.Management.Common.ServerMessageEventHandler(restore_Complete);
Run Code Online (Sandbox Code Playgroud)

这在PowerShell脚本中不起作用,您需要做的是使用生成的函数来添加事件.函数名称是EventHandlerName,其开头附加了"add_",就像这样;

$dbRestore.add_PercentComplete($percentEventHandler)
$dbRestore.add_Complete($completedEventHandler)
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人尝试这样做!

  • 您可以使用Write-Progress而不是Write-Host. (2认同)