2011-11-30 9 views
5

से एक कस्टम ऑब्जेक्ट पास करें मेरे पास एक सी # क्लास है जो इसे लॉग ऑब्जेक्ट पास करके पावरहेल स्क्रिप्ट निष्पादित करनी चाहिए। लॉग पूरी तरह से सी # में लिखा गया है, और सामान्य लॉगिंग प्राप्त करने के लिए सी # कोड और पावरहेल में साझा किया जाना चाहिए।सी # से पावरशेल

क्या कोई मुझे बता सकता है कि मैं कस्टम ऑब्जेक्ट को सी # से पावरहेल तक कैसे पारित कर सकता हूं और इसका उपयोग कर सकता हूं?

+0

तुम सिर्फ वर्ग या एक उदाहरण पारित करने के लिए की जरूरत है? – JNK

+0

लॉग का एक उदाहरण। – naspras

उत्तर

1

आप एक विधानसभा में अपने Log वर्ग संकलन के द्वारा PowerShell और सी # के बीच एक वर्ग का हिस्सा और PowerShell में LoadFile का उपयोग (V1 और V2 में काम करना चाहिए)

$lib = [System.Reflection.Assembly]::LoadFile('path to your dll'); 
$lib.Log("Terrible things have happened!") 

यदि फिर भी, आप एक उदाहरण साझा करना चाहते हैं कर सकते हैं पावरशेल और सी # के बीच एक वर्ग के आप SessionStateProxy.SetVariable का उपयोग कर सकते हैं।

+0

असेंबली। लोडफाइल एक असेंबली देता है, इसलिए मुझे लगता है कि यहां एक रेखा गायब है। 'एड-टाइप-पाथ' पर भी विचार करें। –

1

यदि आपको केवल शक्तिशक्ति स्क्रिप्ट में कक्षा का उपयोग करने की आवश्यकता है, तो आप वास्तविक C# कोड को स्क्रिप्ट में ही डाल सकते हैं और इसे किसी प्रकार की परिभाषा के रूप में उपयोग कर सकते हैं।

There is a tutorial here.

मूल रूप से आप का उपयोग Add-Type -TypeDefinition <C# code> -Language CSharp

+0

मेरा मामला थोड़ा अलग है। पावरहेल स्क्रिप्ट सी # प्रोग्राम के बाहर फ़ाइल में रहता है, और मुझे इस फ़ाइल को लॉग के साथ पैरामीटर के रूप में कॉल करने की आवश्यकता है। – naspras

0

अपनी परियोजना के लिए system.management.automation.dll के संदर्भ में जोड़ें और PowerShell Class का उपयोग करें। वहाँ उदाहरण देखें, यह लगभग तैयार है, की तरह कुछ करने के लिए लाइन

ps.AddCommand("Get-Process"); 

बदलने के लिए:

ps.AddCommand(<script-path/name-of-script-in-path>).AddParameter("Log", logInstance); 

यह पैरामीटर Log जो मूल्य एक उदाहरण logInstance हो रहा है के साथ अपनी स्क्रिप्ट आह्वान करने के लिए कहता है लिपि में पारित किया गया। स्क्रिप्ट पैरामीटर Log है और इसके कोड में $Log के रूप में उपयोग करना चाहिए:

param($Log) 

$Log.Write("Begin ...") 
... 
$Log.Write("End ...") 
+0

मैं इसे आजमाने जा रहा हूं। क्या आप कृपया मुझे बता सकते हैं कि मैं पावरहेल स्क्रिप्ट के भीतर से पास पैरामीटर का उपयोग कैसे कर सकता हूं? – naspras

+0

@naspras - मैंने इसे उत्तर देने के लिए जोड़ा है। –

2

मैं runspace का उपयोग कर अपने समस्या का समाधान होगा यह विश्वास करते हैं। उन पर एक अच्छा स्पष्टीकरण और उदाहरण आप निम्नलिखित लिंक में पा सकते हैं: http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C

बस उनका उपयोग करने का एक सामान्य विचार।

आप स्क्रिप्ट है, तो:

param($logger2) 
$logger2.Write("logger2 Write was called"); 
$logger.Write("logger Write was called"); 

और आप कोड निम्नलिखित logger2 और लकड़हारा उपयोग subsitute हैं:

String scriptContent = // get script content 
Logger logger = new Logger(); 
Logger2 logger2 = new Logger2(); 
// create ps runspace 
using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    // start session 
    runspace.Open(); 
    // set variables 
    runspace.SessionStateProxy.SetVariable("logger", logger); 
    // supply commands 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     // create ps representation of the script 
     Command script = new Command(scriptContent, true, false); 
     // suppy parameters to the script 
     script.Parameters.Add(new CommandParameter("logger2", logger2)); 
     // send script to pipeline 
     pipeline.Commands.Add(script); 
     // execute it 
     Collection<PSObject> results = pipeline.Invoke(); 
     // close runspace 
     runspace.Close(); 
    } 
}