Core Kilta blogi

PowerShell-palikka C#:lla

Aika pitkään ehdin C#:lla koodailla ennen kuin tuli ensimmäinen kerta jolloin jouduin miettimään toiminnon paketoimista PowerShell-moduuliksi.

Kaikki alkoi siitä että keksin hienon pienen sovelluksen jota luultavasti joissakin organisaatioissa infrakaverit ajaisivat. No kun ideasta keskustelin meidän oman infraporukan kanssa niin varsin aikaisessa vaiheessa joku totesi että nykyään kaikki pitää olla PowerShell-rajapinnan takana. Ja minä sitten menin tuota uskomaan.

PowerShell-skriptiä en ollut koskaan tehnyt enkä oikeasti ole edes joutunut käyttään CmdLet-palikoita. Ensimmäiset googlaukset menivät hutiksi koska hakusanojen perusteella löytyi vain kuinka kirjoitetaan ps-skripti PowerShell:llä. Aikani lisäilin sopivia hakusanoja niin johan löytyi muutama ihan kunnollinen tutoriaali miten itse tehdään Visual studiolla ja C#:lla oma powershell-laajennusosa. Esimerkiksi tästä löytyy tiiviisti oleellista asiaa PowerShell-moduulien tekemisestä ja niiden parameterirajapinnasta.

Loppujen lopuksi rajapinta CmdLetin tekemiseen on aika yksinkertainen. Periytytetään oma luokka CmdLet-kantaluokasta, määritellään attribuuteilla minkä niminen CmdLet:in verbistä tulee ja minkä tyyppistä dataa se palauttaa. Paluutyyppi kannattaa määrittää putkituksen takia. Lisäksi parametrien välitys CmdLet:lle vaati hieman opiskelua mutta lopulta aika suoraviivaisesti parametrit asettuu propertyihin attribuuttien avulla. Varsinainen toiminto mitä CmdLet-tekee koodataan yhteen ylikirjoitettavaan metodiin ProcessRecord, ei sinällään mitään rakettitiedettä.

Tarkoitus oli alunperin tehdä kolme CmdLet:iä, ensimmäinen etsii halutut tiedostot ja välittää ne seuraavalla prosessoitavaksi ja kolmas olisi sitten kirjoittanut sopivaan paikkaa tulokset. No ennen kuin olin ehtinyt edes kaikkia tehdä niin sain ohjeistuksen että tuohon pitäisi tehdä vielä hieno käyttöliittymä jotta käyttäminen onnistuisi muiltakin kuin PowerShell-osaajilta. Sitä selvitellessä tuli aika nopeasti ilmi että PowerShell-käyttöliittymähän on itse asiassa XAML-koodausta joten siirsin koko projektin koodin WPF-projektiin. Se siitä PowerShell-koodauksesta.

Tulipahan tutustuttua yhteen uuteen asiaan ja kynnys jatkossa tehdä joku toiminto PowerShell-moduuliksi laski nollaan. Ja varmasti PowerShell-laajennoksille löytyy koodaajan kannalta paljon hyviä paikkoja missä sitä voi hyödyntää vaikka tällä kertaa ei osunutkaan omalle kohdalle.

Jaa artikkeli