ʻO Powershell hana me nā papa ʻaʻole ia he oxymoron, ke hōʻoiaʻiʻo nei au

Aloha, Habr! Ke hāʻawi aku nei au iā ʻoe i kahi unuhi o ka ʻatikala "PowerShell hana me nā papa.
Ke hoʻohiki nei au ʻaʻole ia he oxymoron"
na Christopher Kuech.

Hiki ke ʻano like ʻole nā ​​​​paradigms hoʻonohonoho ʻana i nā mea a me nā hana, akā kākoʻo like ʻia lāua ʻelua ma Powershell. Aneane nā ʻōlelo hoʻolālā āpau, hana a ʻaʻole paha, loaʻa nā lako no ka hoʻopaʻa inoa-waiwai lōʻihi; ʻO nā papa, e like me nā hana a me nā moʻolelo, hoʻokahi wale nō ala. Inā kaupalena mākou i kā mākou hoʻohana ʻana i nā Papa i ka hoʻopaʻa ʻana i nā inoa a me nā waiwai, a pale aku i nā manaʻo hoʻolālā koʻikoʻi e like me ka hoʻoilina, polymorphism, a i ʻole ka hoʻololi ʻana, hiki iā mākou ke hoʻohana pono iā lākou me ka hoʻopili ʻole i kā mākou code. Eia hou, ma ka hoʻohui ʻana i nā ʻano hoʻololi immutable type, hiki iā mākou ke hoʻonui i kā mākou code hana me nā Papa.

ʻO ke kilokilo o nā castes

ʻO Castes kekahi o nā hiʻohiʻona ikaika loa ma Powershell. Ke hoʻolei nei ʻoe i kahi waiwai, ke hilinaʻi nei ʻoe i ka hoʻomaka mua ʻana a me ka hiki ke hōʻoia i hoʻohui ʻia e ke kaiapuni i kāu noi. No ka laʻana, ʻo ka hoʻolei wale ʻana i kahi kaula i [xml] e holo ia ma o ka parser code a hana i kahi lāʻau xml piha. Hiki iā mākou ke hoʻohana i nā Papa i kā mākou code no ke kumu like.

E hoʻolei i nā papa kuhikuhi

Inā ʻaʻohe āu mea kūkulu hale, hiki iā ʻoe ke hoʻomau me ka ʻole o ka hoʻolei ʻana i ka hashtable i kāu ʻano papa. Mai poina e hoʻohana i nā ʻano hōʻoia e hoʻohana pono i kēia ʻano. Ma ka manawa like, hiki iā mākou ke hoʻohana i nā waiwai i paʻi ʻia e ka papa e holo i ka hohonu hohonu a me ka loiloi hōʻoia.

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
}

Eia kekahi, kōkua ka hoʻolei ʻana i ka loaʻa ʻana o kahi huahana maʻemaʻe. E hoʻohālikelike i ka hoʻopuka ʻana o ka pūʻulu hashtable i hāʻawi ʻia i Format-Table me ka mea āu e loaʻa ai inā hoʻolei mua ʻoe i kēia mau hashtable i loko o kahi papa. Hoʻopaʻa mau ʻia nā waiwai o kahi papa ma ke ʻano i wehewehe ʻia ma laila. Mai poina e hoʻohui i ka huaʻōlelo huna ma mua o kēlā mau waiwai a pau āu e makemake ʻole e ʻike ʻia ma nā hopena.

ʻO Powershell hana me nā papa ʻaʻole ia he oxymoron, ke hōʻoiaʻiʻo nei au

Hoʻolei i nā manaʻo

Inā loaʻa iā ʻoe kahi mea kūkulu me hoʻokahi hoʻopaʻapaʻa, e hoʻolilo i kahi waiwai i kāu ʻano papa e hāʻawi i ka waiwai i kāu mea kūkulu, kahi e hiki ai iā ʻoe ke hoʻomaka i kahi manawa o kāu papa.

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"

Kiola i ka laina

Hiki iā ʻoe ke hoʻopau i ke ʻano papa [string] ToString() e wehewehe i ka loina ma hope o ka hōʻike ʻana i ke kaula o ka mea, e like me ka hoʻohana ʻana i ka interpolation string.

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

E hoʻolei i nā hanana serialized

Hāʻawi ka Cast i ka deserialization palekana. E hāʻule nā ​​hiʻohiʻona ma lalo inā ʻaʻole i kūpono ka ʻikepili i kā mākou kikoʻī ma Cluster

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

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

Castes i kāu code hana

Ho'ākāka mua nā papahana hana i nā hale ʻikepili, a laila hoʻokō i ka papahana ma ke ʻano o ka hoʻololi ʻana ma luna o nā hale ʻikepili hiki ʻole ke hoʻololi. ʻOiai ka manaʻo kū'ē, kōkua maoli nā papa iā ʻoe e kākau i nā code hana e hoʻomaikaʻi i ke ʻano o ka hoʻololi ʻana.

He hana anei ka Powershell a'u e kakau nei?

Nui nā poʻe e hele mai ana mai C# a i ʻole nā ​​ʻano like like ke kākau nei iā Powershell, e like me C#. Ma ka hana ʻana i kēia, ke neʻe nei ʻoe mai ka hoʻohana ʻana i nā manaʻo hoʻolālā hana a e pōmaikaʻi paha ʻoe i ka luʻu nui ʻana i ka hoʻolālā ʻana i nā mea i Powershell a i ʻole ke aʻo ʻana e pili ana i ka hoʻolālā hana.

Inā hilinaʻi nui ʻoe i ka hoʻololi ʻana i ka ʻikepili hiki ʻole ke hoʻohana i nā pipelines (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, etc. papa ma ke ano hana.

Hoʻohana pono i nā papa

ʻO Castes, ʻoiai ke hoʻohana nei lākou i kahi syntax ʻē aʻe, he palapala kiʻi wale nō ma waena o nā kāʻei kapu ʻelua. I ka pipeline, hiki iā ʻoe ke palapala i kahi ʻano waiwai me ka hoʻohana ʻana iā ForEach-Object.

Ma ka laʻana ma lalo nei, hoʻokō ʻia ka mea kūkulu Node i kēlā me kēia manawa i hoʻolei ʻia kahi Datum, a hāʻawi kēia iā mākou i ka manawa e kākau ʻole ai i kahi helu kūpono. ʻO ka hopena, ke kālele nei kā mākou pipeline i ka noiʻi ʻikepili declarative a me ka hōʻuluʻulu ʻana, aʻo kā mākou mau papa e mālama i ka parsing a me ka hōʻoia ʻana.

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

Papa hoʻopili no ka hoʻohana hou ʻana

ʻAʻohe mea maikaʻi e like me ka mea i ʻike ʻia

ʻO ka mea pōʻino, ʻaʻole hiki ke hoʻokuʻu ʻia nā papa e nā modula ma ke ʻano like me nā hana a i ʻole nā ​​mea hoʻololi; aka, aia kekahi mau maalea. E ʻōlelo kākou ua wehewehe ʻia kāu mau papa ma ka faila ./my-classes.ps1

  • Hiki iā ʻoe ke dotsource i kahi faila me nā papa:. ./my-classes.ps1. E hoʻokō kēia i kaʻu-classes.ps1 i kāu kiko o kēia manawa a wehewehe i nā papa āpau mai ka faila ma laila.

  • Hiki iā ʻoe ke hana i kahi module Powershell e hoʻokuʻu aku i kāu mau API maʻamau (cmdlets) a hoʻonohonoho i ka ScriptsToProcess = "./my-classes.ps1" hoʻololi i kāu hōʻike module, me ka hopena like: ./my-classes.ps1 e hoʻokō i loko kou kaiapuni .

ʻO kēlā me kēia koho āu e koho ai, e hoʻomanaʻo ʻaʻole hiki i ka ʻōnaehana ʻano Powershell ke hoʻoholo i nā ʻano o ka inoa like i hoʻouka ʻia mai nā wahi like ʻole.
ʻOiai inā ua hoʻouka ʻoe i ʻelua papa like me nā waiwai like mai nā wahi like ʻole, pilikia ʻoe i ka pilikia.

Ke ala i mua

ʻO ke ala maikaʻi loa e pale aku ai i nā pilikia hoʻonā ʻano ʻaʻole e hōʻike i kāu mau papa i nā mea hoʻohana. Ma kahi o ka manaʻo i ka mea hoʻohana e hoʻokomo i kahi ʻano i wehewehe ʻia e ka papa, e hoʻokuʻu aku i kahi hana mai kāu module e hoʻopau i ka pono e komo pololei i ka papa. No Cluster, hiki iā mākou ke hoʻokuʻu aku i kahi hana New-Cluster e kākoʻo i nā hoʻonohonoho hoʻonohonoho hoʻohana a hoʻihoʻi i kahi 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

He aha hou aʻe e heluhelu ai

E pili ana i nā papa
ʻO PowerShell pale
Hoʻolālā hana ma PowerShell

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka