Inoshanda Powershell ine makirasi haisi oxymoron, ndinoivimbisa

Mhoro, Habr! Ndinokupa kutariswa kweshanduro yechinyorwa "Inoshanda PowerShell ine Makirasi.
Ndinovimbisa kuti haisi oxymoron"
naChristopher Kuech.

Chinhu-chinotungamirwa uye chinoshanda chekugadzirisa maparadigms angaite seanopesana, asi ese ari maviri anotsigirwa zvakaenzana muPowershell. Inenge mitauro yese yekuronga, inoshanda kana kwete, ine zvivakwa zvekuwedzera zita-kukosha kusunga; Makirasi, semagadzirirwo nemarekodhi, ingori nzira imwe chete. Kana tikaganhurira mashandisiro edu eMakirasi pakusungirirwa kwemazita nehunhu, uye tikadzivirira inorema-inomisikidzwa-yakatarisana nehurongwa hwekuita senhaka, polymorphism, kana kuchinjika, tinogona kutora mukana wemabhenefiti avo pasina kuomesa kodhi yedu. Kupfuurirazve, nekuwedzera isingachinjike mhando yekushandura nzira, tinogona kupfumisa yedu inoshanda kodhi nemaClass.

Mashiripiti emakasa

Castes chimwe chezvinhu zvine simba zvakanyanya muPowershell. Kana iwe ukakanda kukosha, iwe uri kuvimba neyakajeka yekutanga uye yekusimbisa kugona iyo nharaunda inowedzera kune yako application. Semuyenzaniso, kungokanda tambo mu [xml] kunomhanyisa kuburikidza neparser kodhi uye kugadzira yakazara xml muti. Tinogona kushandisa Makirasi mukodhi yedu kune chinangwa chimwe chete.

Kanda hashtables

Kana iwe usina muvaki, unogona kuenderera usina mumwe nekukanda hashtable kurudzi rwekirasi yako. Usakanganwa kushandisa hunhu hwekusimbisa kuti utore mukana wakazara weiyi pateni. Panguva imwecheteyo, isu tinogona kushandisa zvivakwa zvekirasi kumhanya zvakadzika yekutanga uye yekusimbisa pfungwa.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

[Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

Mukuwedzera, kukanda kunobatsira kuwana yakachena kubuda. Enzanisa kuburitsa kweCluster hashtable array yakapfuudzwa kuFormat-Table nezvaunowana kana ukatanga wakanda ma hashtable aya mukirasi. Zvimiro zvekirasi zvinogara zvichinyorwa muhurongwa hwazvinotsanangurwa imomo. Usakanganwe kuwedzera iro rakavanzika kiyi pamberi pezvinhu zvese izvo zvausingade kuti zvionekwe mumhedzisiro.

Inoshanda Powershell ine makirasi haisi oxymoron, ndinoivimbisa

Cast of meanings

Kana iwe uine muvaki ane nharo imwe chete, kukanda kukosha kumhando yekirasi yako kuchapfuura kukosha kune muvaki wako, kwaunogona kutanga chiitiko chekirasi yako.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    Cluster([string] $id) {
        $this.Service, $this.FlightingRing, $this.Region, $this.Index = $id -split "-"
    }
}

[Cluster]"MyService-PROD-EastUS-2"

Kanda kumutsara

Iwe unogona zvakare kudarika iyo [tambo] ToString() kirasi nzira yekutsanangura iyo logic kuseri kwechinhu chinomiririra tambo, sekushandisa tambo kududzira.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index

    [string] ToString() {
        return $this.Service, $this.FlightingRing, $this.Region, $this.Index -join "-"
    }
}

$cluster = [Cluster]@{
    Service       = "MyService"
    FlightingRing = "PROD"
    Region        = "EastUS"
    Index         = 2
}

Write-Host "We just created a model for '$cluster'"

Cast serialized zviitiko

Cast inobvumira yakachengeteka deerialization. Mienzaniso iri pazasi ichakundikana kana iyo data ikasasangana nemaitiro edu muCluster

# Валидация сСриализованных Π΄Π°Π½Π½Ρ‹Ρ…

[Cluster]$cluster = Get-Content "./my-cluster.json" | ConvertFrom-Json
[Cluster[]]$clusters = Import-Csv "./my-clusters.csv"

Inokanda mukodhi yako inoshanda

Mapurogiramu anoshanda anotanga atsanangura zvimiro zve data, wozoshandisa chirongwa ichi senhevedzano yeshanduko pamusoro pezvisingachinji zve data zvimiro. Kunyangwe paine fungidziro inopokana, makirasi anonyatso kukubatsira iwe kunyora inoshanda kodhi yekutenda nemhando yekushandura nzira.

Iyo Powershell yandiri kunyora inoshanda here?

Vanhu vazhinji vanouya kubva kuC # kana mamiriro akafanana vari kunyora Powershell, yakafanana neC #. Nekuita izvi, uri kubva pakushandisa mashandiro ehurongwa hwemazano uye ungangobatsirika kubva kunyura zvakanyanya muchirongwa chakatarisana nechinhu muPowershell kana kudzidza zvakawanda nezve mashandiro ehurongwa.

Kana iwe uchivimba zvakanyanya nekushandura isingachinji data uchishandisa mapaipi (|), Ndekupi-Chinhu, ForEach-Object, Sarudza-Chinhu, Boka-Chinhu, Ronga-Chinhu, nezvimwewo - une mamwe maitiro anoshanda uye iwe unozobatsirwa nekushandisa Powershell makirasi mumaitiro anoshanda.

Kushanda kushandiswa kwemakirasi

Castes, kunyangwe vachishandisa imwe syntax, ingori mepu pakati pemadomasi maviri. Mupombi, iwe unogona mepu akatevedzana ehunhu uchishandisa ForEach-Object.

Mumuenzaniso uri pasi apa, muvaki weNode anourayiwa nguva dzose apo Datum inokandwa, uye izvi zvinotipa mukana wekusanyora nhamba yakakwana yekodhi. Nekuda kweizvozvo, pombi yedu inotarisa pakuzivisa data kubvunza uye kuunganidza, nepo makirasi edu achitarisira kupatsanura data uye kusimbiswa.

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ комбинирования классов с ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°ΠΌΠΈ для separation of concerns Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°Ρ…

class Node {
    [ValidateLength(3, 7)]
    [string] $Name
    [ValidateSet("INT", "PPE", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope", "WestEurope")]
    [string] $Region
    Node([string] $Name) {
        $Name -match "([a-z]+)(INT|PPE|PROD)([a-z]+)"
        $_, $this.Service, $this.FlightingRing, $this.Region = $Matches
        $this.Name = $Name
    }
}

class Datum {
    [string] $Name
    [int] $Value
    [Node] $Computer
    [int] Severity() {
        $this.Name -match "[0-9]+$"
        return $Matches[0]
    }
}

Write-Host "Urgent Security Audit Issues:"
Import-Csv "./audit-results.csv" `
    | ForEach-Object {[Datum]$_} `
    | Where-Object Value -gt 0 `
    | Group-Object {$_.Severity()} `
    | Where-Object Name -lt 2 `
    | ForEach-Object Group `
    | ForEach-Object Computer `
    | Where-Object FlightingRing -eq "PROD" `
    | Sort-Object Name, Region -Unique

Packaging class yekushandisa zvakare

Hapana chinhu chakanaka sezvazvinoratidzika

Nehurombo, makirasi haagone kutumirwa kunze nemamodules nenzira imwechete semabasa kana chinja; asi pane mamwe mazano. Ngatiti makirasi ako anotsanangurwa mufaira ./my-classes.ps1

  • Unogona dotsource faira nemakirasi:. ./my-classes.ps1. Izvi zvinozoita my-classes.ps1 muchikamu chako chazvino uye tsanangura makirasi ese kubva pafaira ipapo.

  • Unogona kugadzira Powershell module inoendesa kunze ese ako etsika maAPIs (cmdlets) uye woseta iyo ScriptsToProcess = "./my-classes.ps1" inoshanduka mumodule manifest yako, ine mhedzisiro imwe cheteyo: ./my-classes.ps1 ichaitwa mukati nharaunda yako.

Chero sarudzo yaunosarudza, yeuka kuti Powershell's type system haigone kugadzirisa mhando dzezita rimwe chete rakaremerwa kubva kunzvimbo dzakasiyana.
Kunyangwe iwe ukarodha makirasi maviri akafanana ane zvivakwa zvakafanana kubva kunzvimbo dzakasiyana, iwe uri panjodzi yekusangana nematambudziko.

Nzira yekumberi

Nzira yakanakisa yekudzivirira matambudziko emhando yekugadzirisa kusambofumura makirasi ako kune vashandisi. Panzvimbo pekutarisira mushandisi kuunza kirasi-yakatsanangurwa mhando, tumira kunze basa kubva kune yako module inobvisa kudiwa kwekuwana kirasi zvakananga. Kune Cluster, tinogona kutumira kunze-Itsva-Cluster basa rinotsigira mushandisi-ane hushamwari parameter seti uye kudzosera Cluster.

class Cluster {
    [ValidatePattern("^[A-z]+$")]
    [string] $Service
    [ValidateSet("TEST", "STAGE", "CANARY", "PROD")]
    [string] $FlightingRing
    [ValidateSet("EastUS", "WestUS", "NorthEurope")]
    [string] $Region
    [ValidateRange(0, 255)]
    [int] $Index
}

function New-Cluster {
    [OutputType([Cluster])]
    Param(
        [Parameter(Mandatory, ParameterSetName = "Id", Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string] $Id,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Service,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $FlightingRing,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [string] $Region,
        [Parameter(Mandatory, ParameterSetName = "Components")]
        [int] $Index
    )

    if ($Id) {
        $Service, $FlightingRing, $Region, $Index = $Id -split "-"
    }

    [Cluster]@{
        Service       = $Service
        FlightingRing = $FlightingRing
        Region        = $Region
        Index         = $Index
    }
}

Export-ModuleMember New-Cluster

Chii chimwe chekuverenga

NezveMakirasi
Dziviriro PowerShell
Inoshanda Chirongwa muPowerShell

Source: www.habr.com

Voeg