Vývoj vlastního CmdLetu v C# – příprava projektu Visual Studia

Vývoj vlastního PowerShell příkazu (CmdLet) je velice snadné a rychlé – ideální pro často opakované akce, případně akce u zákazníka, kde nemusí být vždy vzdálený přístup do jeho infrastruktury. Za posledních pár let už jsem jich napsal desítky a jsem jsem z toho stále nadšen, hlavně tou jednoduchostí, v podstatě jsem tím zcela nahradil jednoúčelové konzolové aplikace, kde již navíc není nutné řešit parsování argumentů, přehledná výpis na konzolovou obrazovku, všechno je již tak nějak vyřešeno. Jako příklad jednoho z CmdLetů bych uvedl snadné nasazení jedné naší aplikace hostované v Azure, kde s každým zákazníkem bylo vždy nutné přihlásit se na portál Azure, vytvořit hosting pro aplikaci, nastavit domény, standard mód, vytvořit a nastavit DB, connection string do aplikace, vytvořit storage provider, přihlašovací údaje zapsat do aplikace, nastavit zálohování, a tak bych mohl pokračovat….. až po finální nahrání zkompilované verze – prostě práce na minimálně 2-4h a to ještě s rizikem chyby. Nyní k tomu slouží dva CmdLety, jeden pro přihlášení k Azure, druhý už pro založení tenantu a provedení všech potřebných akcí zcela automaticky.

V tomto prvním díle ukážu pouze základ, založení Visual Studio projektu a jeho nastavení.

Základem vlastního PowerShell CmdLetu je založený projekt typu Class Library

image 

image

Volba verze .NET Frameworku je závislá na požadované verzi PowerShellu, pokud například skriptujete akce pro SharePoint 2010, musíte nastavit .NET Framework verze maximálně 3.5.

  • PowerShell 2.0 – .NET Framework 3.5
  • PowerShell 3.0 – .NET Framework 4
  • PowerShell 4.0 – .NET Framework 4.5
[more]

Po založení projektu je nutné ručně přidat potřebné reference, hlavní referencí je System.Management.Automation.dll, kterou naleznete (případně dle vaší verze PowerShellu):
C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0

image

Následně se již můžeme vrhnout na prvním CmdLet, pro první sample klasicky Hello World, založíme novou třídu a pojmenujeme jí GetHelloWorldMessage:

image

A začneme přidávat atributy a base třídu:

  • importujte namespace System.Management.Automation
  • třída GetHelloWorldMessage musí být zděděna z objektu PSCmdlet
  • přidejte atribut CmdLet k nově vytvořené třídě, první parametr definuje jednu z povolených akcí, respektive prefixů (na funkci samotného CmdLetu nemá vliv, jenom definuje standard) a druhý parametr určující název samotné Powershell funkce, tentokrát bez prefixu již daného výčtovým typem VerbsCommon, výsledek tedy může být:
    [Cmdlet(VerbsCommon.Get, „HelloWorldMessage“)]
    Samotný příkaz tedy bude dostupný jako Get-HelloWorldMessage

Samotnou funkčnost implementujete přetížením metody ProcessRecord(), která je definována v base PSCmdLetu a navíc přidáme jeden vstupní parametr pro specifikaci jména uživatele – tento parametr je označen jako povinný.

image

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using System.Threading.Tasks;

namespace DevIT.PowerShell.Samples
{
    [Cmdlet(VerbsCommon.Get, "HelloWorldMessage")]
    public class GetHelloWorldMessage : PSCmdlet
    {
        [Parameter(Mandatory = true, HelpMessage = "Zadejte Vaše jméno.")]
        public string YourName { get; set; }
        protected override void ProcessRecord()
        {
            WriteVerbose("Spouštíme hrozně složitou akci...");
            WriteObject(string.Format("Vítejte, {0}!", YourName ?? string.Empty));
        }
    }
}

 

Nyní už jenom zkompilujeme, spustíme konzoli PowerShellu, nalistujeme adresář s výsledným DLL souborem a importujeme ho do sady dostupných PowerShell příkazů:

Import-Module .\DevIT.PowerShell.Samples.dll

Následně již můžeme zavolat příkaz Get-HelloWorldMessage:

image

Případně rovnou s parametrem Get-HelloWorldMessage -YourName “Pavel”

Nebo klasicky parametrem –? zobrazit dostupné volby, při prvním volání nápovědy však budete vyzván k přegenerování nápovědy, která se generuje na základě atributů uvedených u CmdLetu i samotných parametrů:

image