2012-06-28 4 views
7

Czy ujawniając zestaw powiązanych funkcji w cmdletach Powershell, można udostępniać nazwy właściwości i pomoc skróconą, aby znormalizować je w cmdletach w zespole?Czy można udostępniać właściwości i komentarze między cmdletami Powershell w języku C#?

Wiem, że można to zrobić z klasami pochodnymi, ale to rozwiązanie jest niezręczne w najlepszym przypadku, gdy istnieje wiele poleceń cmdlet z różnymi właściwościami do współdzielenia.

Oto niezwykle prosty przykład. Chciałbym udostępnić właściwość "Name" i wszystkie powiązane komentarze tak, aby były takie same w poleceniach cm, które produkujemy, ale nie mogę wymyślić dobrego sposobu na zrobienie tego w języku C#. W idealnym przypadku udostępnianie umożliwi specyfikację atrybutów parametrów, takich jak Obowiązkowe lub Pozycja.

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

Jeśli nie chcesz wyprowadzać (nie mam jasności co do przyczyny), najlepszym sposobem na dzielenie się komentarzami jest użycie XML (patrz kod źródłowy frameworka). Zachowujesz dokumentację kodu poza swoim kodem, można ją napisać i konserwować (jeśli jest to konieczne) przez kogoś innego i można ją udostępniać w klasach, a nawet w złożeniach. –

+0

@Adriano Dzięki za pomysł, aby spojrzeć na udostępnianie komentarzy za pośrednictwem XML obejmuje. Powodem, dla którego nie chce się wywodzić, jest to, że można to zrobić w sposób czysty. Jeśli cmdlet A używa P1, P2, podczas gdy cmdlet B używa P2, P3 i cmdlet C używa P1, P3, nie ma sposobu na wyprowadzenie i udostępnienie P1, P2, P3 według potrzeb. Mam także świadomość, że mój pomysł dzielenia się tymi właściwościami może nie być uzasadniony. Właśnie stało się kłopotliwe aktualizowanie N miejsc, gdy coś się zmienia i na pewno nienawidzę kopiować i wklejać kodu. – pennyowe

+0

Och, masz rację! Po prostu myślałem, że mają wiele wspólnych właściwości. Jedyny sposób, w jaki myślę to zrobić, to poprzez włączenie (ale jest to w porządku tylko dla komentarzy). Pewnego dnia (może ...) będziemy mieć wiele dziedzin ... –

Odpowiedz

3

Tak, istnieje sposób, aby to zrobić bez dziedziczenia ze wspólnej klasy bazowej dla parametrów. Jego nie jest dobrze udokumentowane, tylko napomknął w uwagach metody IDynamicParameters.GetDynamicParameters. Oto bardziej szczegółowe traktowanie tematu.

Najpierw należy utworzyć klasę ze swoimi wspólnych parametrów deklarowanych jako właściwości z [parametr] atrybuty:

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

Następnie każdy komandletu że chce korzystać z tych wspólnych parametrów powinna implementować interfejs IDynamicParameters powrócić instancję użytkownika klasy MyCommonParameters:

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

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

z tym podejściem, parametr polecenia PowerShell spoiwo będzie znaleźć i wypełnić parametry na przykład MyCommonParameters tak jakby byli członkami Cmdl et classes.

+0

Bardzo fajnie - dzięki Burt! Nie miałem jeszcze okazji wypróbować tego, ale wygląda na to, że będzie pasować do fakturowania. – pennyowe

Powiązane problemy