2010-08-12 14 views
9

के साथ डेटाबेस को पुनर्स्थापित करते समय प्रगति प्रदर्शित करें मेरे पास PowerShell और SMO के साथ डेटाबेस को पुनर्स्थापित करने के लिए एक स्क्रिप्ट है। अब मुझे पता है कि मैं एक ईवेंट हैंडलर को PercentComplete में पुनर्स्थापित ऑब्जेक्ट पर पास कर सकता हूं और ऐसा होने पर पुनर्स्थापना की प्रगति प्राप्त कर सकता है। समस्या यह है कि मुझे नहीं पता कि इवेंट हैंडलर कैसे बनाएं और इसे PowerShell में एक फ़ंक्शन पास करें? मैं इसे सी #पावरशेल और एसएमओ

restore.PercentComplete += new PercentCompleteEventHandler(restore_PercentComplete); 

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

किसी भी मदद की सराहना की जाएगी।

धन्यवाद।

उत्तर

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!" } 

अब अंतिम चरण ईवेंट हैंडलर को उस ऑब्जेक्ट में जोड़ना है जिसके साथ आप काम कर रहे हैं। आम तौर पर सी # में आप बस निम्नलिखित करते हैं;

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

अच्छा काम :) मुझे लगता है कि यह जब संचालकों को बताए scriptblocks कास्ट करने के लिए आवश्यक नहीं है। – stej

+2

आप लिखने-होस्ट के बजाय लिखें-प्रगति का उपयोग कर सकते हैं। – JasonMArcher

+0

इस विवरण को जोड़ने के लिए धन्यवाद। बहुत उपयोगी है क्योंकि मैं अन्य उदाहरणों के माध्यम से वापस काम कर रहा था – SheldonH

1

आप इसे v1 powerhell - http://pseventing.codeplex.com में pseventing के साथ async शैली कर सकते हैं। जब भी आप प्रतीक्षा करने की बजाय चाहें प्रगति पर जांच करें। v2 शक्तियों का अपना आयोजन है।

मैं पृष्ठभूमि फैशन को छोड़कर, जो कुछ भी कहता हूं, उसे करने के लिए पेंटेंटिंग में एक स्क्रिप्ट शामिल करता हूं।

-Oisin