2010-04-16 5 views
7

मैं स्वचालन के माध्यम से कुछ पावरहेल स्क्रिप्ट चलाने के लिए देख रहा हूं। कुछ की तरह:होस्ट समस्याओं में चलने के बिना स्वचालन के माध्यम से PowerShell स्क्रिप्ट को कैसे चलाएं

IList errors; 
Collection<PSObject> res = null; 
using (RunspaceInvoke rsi = new RunspaceInvoke()) 
{ 
    try 
    { 
     res = rsi.Invoke(commandline, null, out errors); 
    } 
    catch (Exception ex) 
    { 
     LastErrorMessage = ex.ToString(); 
     Debug.WriteLine(LastErrorMessage); 
     return 1; 
    } 
} 

समस्या का सामना करना पड़ रहा हूँ कि मेरी स्क्रिप्ट ऐसी write-host के रूप में cmdlets का उपयोग करता है, तो ऊपर फेंकता है एक System.Management.Automation.CmdletInvocationException -

इस समारोह आह्वान नहीं कर सकता क्योंकि वर्तमान मेजबान को लागू नहीं करता है यह।

इस समस्या को हल करने के लिए कुछ अच्छे विकल्प क्या हैं?

+0

स्कॉट, मुझे एक ही समस्या का सामना करना पड़ रहा है। क्या आप कुछ मार्गदर्शन या कोड प्रदान कर सकते हैं कि आपने कार्यान्वयन कैसे किया? –

+0

ठीक है, मुझे जवाब मिल गया: बस PSHost, PSHostUserInterface और PSHostRawUserInterface का उत्तराधिकारी है और विधियों को कुछ भी नहीं/वापस शून्य करें। आमतौर पर क्या होता है इसका पता लगाने के लिए, संदेश/पाठ जो कि अन्यथा cmd-line पर मुद्रित किया जाएगा लॉग किया जा सकता है। –

उत्तर

11

एक विकल्प एक लेखन-होस्ट फ़ंक्शन बनाने और अपने रनस्पेस में इंजेक्ट करना है। समारोह को एक ही नाम के साथ एक cmdlet पर प्राथमिकता लेनी होगी। इस फ़ंक्शन में, आप कुछ भी नहीं कर सकते हैं या शायद [कंसोल] :: लेखन रेखा() का उपयोग कर सकते हैं यदि आपका ऐप एक कंसोल ऐप है, या यदि आपका ऐप एक जीयूआई ऐप है, तो कुछ ऑब्जेक्ट को PowerShell सत्र में इंजेक्ट करें कि फ़ंक्शन आउटपुट लिख सकता है करने के लिए (Runspace.SessionStateProxy.SetVariable देखें)।

एक और (थोड़ा अधिक जटिल) विकल्प PowerShell hosting interfaces in your app को लागू करना है।

+0

मैं होस्टिंग इंटरफेस दृष्टिकोण के साथ गया था। बहुत खराब होस्टिंग के लिए एक डिफ़ॉल्ट NonInteractive UI नहीं है। –

संबंधित मुद्दे