2010-08-12 32 views
9

Tôi có một tập lệnh để khôi phục cơ sở dữ liệu bằng PowerShell và SMO. Bây giờ tôi biết rằng tôi có thể vượt qua một trình xử lý sự kiện vào PercentComplete trên đối tượng khôi phục và nhận được tiến trình khôi phục khi nó xảy ra. Vấn đề là tôi không biết làm thế nào để tạo một trình xử lý sự kiện và chuyển cho nó một hàm trong PowerShell? Tôi có thể làm điều đó trong C#Hiển thị tiến trình trong khi khôi phục cơ sở dữ liệu bằng PowerShell và SMO

restore.PercentComplete += new PercentCompleteEventHandler(restore_PercentComplete); 

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

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn bạn.

Trả lời

16

Sau khi tìm kiếm sâu hơn, cuối cùng tôi đã tìm thấy nó trong tài liệu. Để thêm trình xử lý sự kiện, bạn cần phải làm như sau:

Nhập các hội đồng có liên quan;

[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 

Bây giờ để tạo trình xử lý sự kiện, bạn cần khai báo bằng hàm nội tuyến;

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

Bây giờ bước cuối cùng là thêm trình xử lý sự kiện vào đối tượng bạn đang làm việc. Thông thường trong C# bạn chỉ cần làm như sau;

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

Điều này sẽ không hoạt động trong kịch bản PowerShell, những gì bạn cần làm là sử dụng chức năng được tạo để thêm sự kiện. Tên hàm là EventHandlerName với "add_" được thêm vào phần đầu của nó, giống như vậy;

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

Hy vọng điều này sẽ giúp bất kỳ ai khác cố gắng làm điều này!

+1

Làm việc tốt :) Tôi đoán không cần thiết phải bỏ tập lệnh khi gán cho trình xử lý. – stej

+2

Bạn có thể sử dụng Write-Progress thay vì Write-Host. – JasonMArcher

+0

cảm ơn bạn đã thêm chi tiết này. rất hữu ích khi tôi đang làm việc trở lại thông qua các ví dụ khác – SheldonH

1

Bạn có thể làm phong cách không đồng bộ với pseventing trong v1 powershell - http://pseventing.codeplex.com. kiểm tra tiến độ bất cứ khi nào bạn thích thay vì chờ đợi. v2 powershell có sự kiện riêng.

tôi bao gồm một tập lệnh trong việc pseventing để làm chính xác những gì bạn nói, ngoại trừ trong một thời trang nền.

-Oisin

Các vấn đề liên quan