Powershell mai aiki tare da azuzuwan ba oxymoron bane, na ba da garanti

Hello, Habr! Ina gabatar muku da fassarar labarin "Ayyukan PowerShell tare da Classes.
Na yi alkawari ba oxymoron ba ne"
da Christopher Kuech.

Siffofin shirye-shirye masu dacewa da abu da aiki na iya zama da alama sun yi hannun riga da juna, amma duka biyun suna goyan baya daidai da Powershell. Kusan duk yarukan shirye-shirye, masu aiki ko a'a, suna da wuraren daurin suna-daraja mai tsayi; Azuzuwa, kamar tsari da bayanai, hanya ɗaya ce kawai. Idan muka iyakance amfani da azuzuwan zuwa ɗaurin sunaye da ƙima, kuma mu guje wa ra'ayoyin shirye-shirye masu nauyi kamar gado, polymorphism, ko mutability, za mu iya amfani da su ba tare da rikitar da lambar mu ba. Bugu da ari, ta ƙara hanyoyin juyawa nau'in mara canzawa, za mu iya haɓaka lambar aikin mu tare da Azuzuwa.

Sihiri na castes

Castes suna ɗaya daga cikin mafi ƙarfi fasali a cikin Powershell. Lokacin da kuka jefa ƙima, kuna dogara ga fayyace fage da iyawar tabbatarwa da mahalli ke ƙarawa ga aikace-aikacenku. Misali, kawai jefa kirtani a cikin [xml] zai gudanar da shi ta cikin lambar parser kuma ya samar da cikakkiyar bishiyar xml. Za mu iya amfani da Classes a cikin lambar mu don wannan manufa.

Yi jita-jita

Idan ba ku da ginin gini, kuna iya ci gaba ba tare da ɗaya ba ta hanyar jefa hashtable zuwa nau'in ajin ku. Kar a manta da yin amfani da sifofin tabbatarwa don cin gajiyar wannan tsarin. A lokaci guda, za mu iya amfani da kaddarorin da aka buga a ajin don gudanar da zurfafa farawa da dabaru masu inganci.

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
}

Bugu da ƙari, simintin gyaran kafa yana taimakawa wajen samun fitarwa mai tsabta. Kwatanta abubuwan da aka fitar na Cluster hashtable array da aka wuce zuwa Tsarin-Table tare da abin da kuke samu idan kun fara jefa waɗannan hashtables cikin aji. A koyaushe ana jera kaddarorin aji a cikin tsari da aka ayyana su a can. Kar a manta don ƙara kalmar sirri ta ɓoye kafin duk waɗannan kaddarorin waɗanda ba ku so su bayyana a cikin sakamakon.

Powershell mai aiki tare da azuzuwan ba oxymoron bane, na ba da garanti

Cast na ma'ana

Idan kuna da maginin gini mai gardama ɗaya, jefa ƙima zuwa nau'in ajin ku zai wuce ƙimar ga mai ginin ku, inda zaku iya fara misali na ajin ku.

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"

Jefa zuwa layi

Hakanan zaka iya soke hanyar ajin [kirtani] ToString() don ayyana ma'anar da ke bayan abin wakilcin kirtani, kamar yin amfani da interpolation na kirtani.

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'"

Jada jerin misalai

Cast yana ba da damar ɓata lafiya. Misalan da ke ƙasa za su gaza idan bayanan ba su cika ƙayyadaddun mu ba a cikin Tari

# Валидация сериализованных данных

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

Castes a cikin lambar aikin ku

Shirye-shiryen aiki da farko suna bayyana tsarin bayanai, sannan aiwatar da shirin a matsayin jerin sauye-sauye akan tsarin bayanan da ba za a iya canzawa ba. Duk da sabanin ra'ayi, azuzuwan suna taimaka muku da gaske rubuta lambar aiki godiya ga nau'in hanyoyin juyawa.

Shin Powershell da nake rubutawa yana aiki?

Mutane da yawa da suka zo daga C # ko makamantansu suna rubuta Powershell, wanda yayi kama da C #. Ta yin wannan, kuna ƙaura daga amfani da dabarun shirye-shirye masu aiki kuma kuna iya amfana daga nutsewa sosai cikin shirye-shiryen da suka dace da abu a cikin Powershell ko ƙarin koyo game da shirye-shirye masu aiki.

Idan kun dogara kacokan kan canza bayanan da ba za a iya canzawa ta amfani da bututun mai ba (|), Inda-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, da dai sauransu - kuna da ƙarin salon aiki kuma zaku amfana ta amfani da Powershell azuzuwan a cikin salon aiki.

Amfani da azuzuwan aiki

Castes, ko da yake suna amfani da madadin daidaitawa, taswira ne kawai tsakanin yankuna biyu. A cikin bututun mai, zaku iya tsara tsararrun ƙima ta amfani da ForEach-Object.

A cikin misalin da ke ƙasa, ana aiwatar da maginin Node a duk lokacin da aka jefa Datum, kuma wannan yana ba mu zarafi don guje wa rubuta adadi mai kyau na lamba. Sakamakon haka, bututun namu yana mai da hankali kan ƙira da tattara bayanai, yayin da azuzuwan mu ke kula da tantancewa da tabbatarwa.

# Пример комбинирования классов с конвейерами для 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

Ajin marufi don sake amfani

Babu wani abu mai kyau kamar yadda ake gani

Abin baƙin ciki, ba za a iya fitar da azuzuwan ta nau'ikan kayayyaki kamar yadda ayyuka ko masu canji ba; amma akwai wasu dabaru. Bari mu ce an ayyana azuzuwan ku a cikin fayil ɗin ./my-classes.ps1

  • Kuna iya gano tushen fayil tare da azuzuwan:. ./my-classes.ps1. Wannan zai aiwatar da my-classes.ps1 a cikin iyakokin ku na yanzu kuma ya ayyana duk azuzuwan daga fayil ɗin da ke wurin.

  • Kuna iya ƙirƙirar tsarin Powershell wanda ke fitar da duk API ɗinku na al'ada (cmdlets) kuma saita madaidaicin ScriptsToProcess = "./my-classes.ps1" a cikin bayyanuwanku, tare da sakamako iri ɗaya: ./my-classes.ps1 zai aiwatar a ciki muhallin ku .

Ko wane zaɓi da kuka zaɓa, ku tuna cewa tsarin nau'in Powershell ba zai iya warware nau'ikan suna ɗaya da aka loda daga wurare daban-daban ba.
Ko da kun ɗora nauyin azuzuwan guda biyu tare da kaddarorin iri ɗaya daga wurare daban-daban, kuna haɗarin shiga cikin matsaloli.

Hanya gaba

Hanya mafi kyau don guje wa matsalolin ƙudurin nau'in shine kar a taɓa fallasa azuzuwan ku ga masu amfani. Maimakon tsammanin mai amfani ya shigo da nau'in da aka ayyana a aji, fitar da wani aiki daga tsarin ku wanda ke kawar da buƙatar shiga aji kai tsaye. Don Ƙungiya, za mu iya fitarwa aikin Sabon-Cluster wanda zai goyi bayan saitin siga na abokantaka da maido da Tari.

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

Me kuma za a karanta

Game da Darasi
Tsaro PowerShell
Shirye-shiryen Ayyuka a cikin PowerShell

source: www.habr.com

Add a comment