2012-06-28 16 views
7

पावरहेल cmdlets में संबंधित कार्यों का एक सेट उजागर करते समय, संपत्ति नामों और सारांश को साझा करना संभव है ताकि इन्हें किसी भी असेंबली में cmdlets में सामान्यीकृत किया जा सके?क्या सी # में पावरहेल cmdlets के बीच गुणों और टिप्पणियों को साझा करना संभव है?

मुझे पता है कि यह व्युत्पन्न कक्षाओं के साथ किया जा सकता है, लेकिन यह समाधान सबसे अच्छा है जब विभिन्न गुणों के साथ कई cmdlets साझा किए जाते हैं।

यहां एक बेहद सरल उदाहरण है। मैं संपत्ति 'नाम' और सभी संबंधित टिप्पणियों को साझा करना चाहता हूं ताकि वे हमारे द्वारा उत्पादित एन cmdlets में समान हों, लेकिन मैं C# में ऐसा करने का एक अच्छा तरीका नहीं सोच सकता। आदर्श रूप से कोई साझाकरण पैरामीटर गुणों जैसे अनिवार्य या स्थिति के विनिर्देश की अनुमति देगा।

namespace FrozCmdlets 
{ 
using System.Management.Automation; 

/// <summary> 
/// Adds a new froz to the system. 
/// </summary> 
[Cmdlet(VerbsCommon.Add, "Froz")] 
public class AddFroz : Cmdlet 
{ 
    /// <summary> 
    /// The name of the froz. 
    /// For more information on the froz, see froz help manual. 
    /// </summary> 
    [Parameter] 
    public string Name { get; set; } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 
     // Add the froz here 
    } 
} 

/// <summary> 
/// Removes a froz from the system. 
/// </summary> 
[Cmdlet(VerbsCommon.Remove, "Froz")] 
public class RemoveFroz : Cmdlet 
{ 
    /// <summary> 
    /// The name of the froz. 
    /// For more information on the froz, see froz help manual. 
    /// </summary> 
    [Parameter] 
    public string Name { get; set; } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 
     // Remove the froz here 
    } 
} 
} 
+0

यदि आप प्राप्त नहीं करना चाहते हैं (मैं कारण के बारे में स्पष्ट नहीं हूं) टिप्पणियां साझा करने का सबसे अच्छा तरीका एक्सएमएल का उपयोग करना है (फ्रेमवर्क स्रोत कोड देखें)। आप अपने कोड के बाहर कोड प्रलेखन रखते हैं, इसे किसी और द्वारा लिखा और बनाए रखा जा सकता है (यदि आवश्यक हो) और इसे कक्षाओं और यहां तक ​​कि असेंबली में भी साझा किया जा सकता है। –

+0

@Adriano एक्सएमएल के माध्यम से टिप्पणियों को साझा करने के विचार को देखने के लिए धन्यवाद। प्राप्त करने के इच्छुक नहीं होने के कारण यह है कि साफ-सफाई करना संभव है। यदि cmdlet ए पी 1, पी 2 का उपयोग करता है, जबकि cmdlet बी पी 2, पी 3 और सेमीडलेट सी का उपयोग करता है तो पी 1, पी 3 का उपयोग पी 1, पी 2, पी 3 वांछित के रूप में प्राप्त करने और साझा करने का कोई तरीका नहीं है। मुझे यह भी एहसास है कि इन गुणों को साझा करने का मेरा विचार अच्छी तरह से स्थापित नहीं किया जा सकता है। जब भी कुछ बदलता है तो एन एन स्थानों को अपडेट करने में परेशानी हो गई है और मुझे यकीन है कि प्रतिलिपि प्रतिलिपि और पेस्ट कोड से नफरत है। – pennyowe

+0

ओह, तो आप सही हैं! मैंने सोचा कि उनके पास कई साझा गुण थे। ऐसा करने का एकमात्र तरीका यह है कि इसमें शामिल है (लेकिन यह केवल टिप्पणियों के लिए ठीक है)। किसी दिन (शायद ...) हमारे पास एकाधिक विरासत होगी ... –

उत्तर

3

हां, पैरामीटर के लिए एक सामान्य बेस क्लास से विरासत के बिना ऐसा करने का एक तरीका है। यह अच्छी तरह से प्रलेखित नहीं है, केवल IDynamicParameters.GetDynamicParameters विधि की टिप्पणियों में संकेत दिया गया है। यहां विषय का एक और विस्तृत उपचार दिया गया है।

पहले, अपने सामान्य मानकों के साथ [पैरामीटर] गुण के रूप में घोषित के साथ एक वर्ग बनाने का श्रेय:

internal class MyCommonParmeters 
{ 
    [Parameter] 
    public string Foo { get; set; } 
    [Parameter] 
    public int Bar { get; set; } 
    ... 
} 

फिर प्रत्येक Cmdlet इन आम पैरामीटर का उपयोग करने IDynamicParameters इंटरफ़ेस को लागू करना चाहिए चाहता है कि एक सदस्य उदाहरण वापस जाने के लिए MyCommonParameters वर्ग की:

[Cmdlet(VerbsCommon.Add, "Froz")] 
public class AddFroz : PSCmdlet, IDynamicParameters 
{ 
    private MyCommonParmeters MyCommonParameters 
     = new MyCommonParmeters(); 

    object IDynamicParameters.GetDynamicParameters() 
    { 
     return this.MyCommonParameters; 
    } 
    ... 

इस दृष्टिकोण के साथ, PowerShell आदेश पैरामीटर बांधने की मशीन खोजने के लिए और से स्थापित हो जाएगा MyCommonParameters उदाहरण बस के रूप में यदि वे Cmdl के सदस्य थे पर मानकों और कक्षाएं

+0

बहुत अच्छा - धन्यवाद बर्ट! मुझे अभी तक ऐसा करने का मौका नहीं मिला है, लेकिन ऐसा लगता है कि यह बिलिंग में फिट होगा। – pennyowe

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