Functional Powershell เบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™เบšเปเปˆเปเบกเปˆเบ™ oxymoron, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบกเบฑเบ™

Hey Habr! เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ™เปเบฒโ€‹เบชเบฐโ€‹เป€เบซเบ™เบตโ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เบเบฒเบ™โ€‹เปเบ›โ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบ‚เบญเบ‡โ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เป„เบ”เป‰โ€‹ "Functional PowerShell เบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™.
เบ‚เป‰เบญเบเบชเบฑเบ™เบเบฒเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™ oxymoron"
เป‚เบ”เบ Christopher Kuech.

เปเบœเบ™เบงเบฒเบ”เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเปเบšเบšเบฎเบฑเบ”เบเบธเบก เปเบฅเบฐ เบกเบตเบ›เบฐเป‚เบซเบเบ”เบญเบฒเบ”เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบšเปเปˆเบเบปเบ‡เบเบฑเบ™เบเบฑเบšเบเบฑเบ™, เปเบ•เปˆเบ—เบฑเบ‡เบชเบญเบ‡เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเปœเบฑเบšเบชเบฐเปœเบนเบ™เป€เบ—เบปเปˆเบฒเบ—เบฝเบกเบเบฑเบ™เปƒเบ™ Powershell. เป€เบเบทเบญเบšเบ—เบธเบเบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก, เบกเบตเบ›เบฐเป‚เบซเบเบ”เบซเบผเบทเบšเปเปˆ, เบกเบตเบชเบดเปˆเบ‡เบญเปเบฒเบ™เบงเบเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบเบฒเบ™เบœเบนเบเบกเบฑเบ”เบŠเบทเปˆ-เบกเบนเบ™เบ„เปˆเบฒ; เบซเป‰เบญเบ‡เบฎเบฝเบ™, เป€เบŠเบฑเปˆเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบ, เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบงเบดเบ—เบตเบเบฒเบ™เบซเบ™เบถเปˆเบ‡. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเบเบฑเบ”เบเบฒเบ™เปƒเบŠเป‰ Classes เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบšเบเบฒเบ™เบœเบนเบเบกเบฑเบ”เบ‚เบญเบ‡เบŠเบทเปˆเปเบฅเบฐเบ„เบธเบ™เบ„เปˆเบฒ, เปเบฅเบฐเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบงเบฑเบ”เบ–เบธเบซเบ™เบฑเบเป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เบชเบทเบšเบ—เบญเบ”, polymorphism, เบซเบผเบท mutability, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบฑเบšเบชเบปเบ™เบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบงเบดเบ—เบตเบเบฒเบ™เบ›เปˆเบฝเบ™เบ›เบฐเป€เบžเบ”เบ—เบตเปˆเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ”เป‰เบงเบ Classes.

magic เบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบงเบฑเบ™เบ™เบฐ

Castes เปเบกเปˆเบ™เปœเบถเปˆเบ‡เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบชเบธเบ”เปƒเบ™ Powershell. เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เบงเบฒเบ‡เบกเบนเบ™เบ„เปˆเบฒ, เบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบญเบตเบ‡เปƒเบชเปˆเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปเบฅเบฐเบเบฒเบ™เบเบงเบ”เบชเบญเบš implicit เบ—เบตเปˆเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เป‚เบเบ™เบชเบฐเบ•เบฃเบดเบ‡เปƒเบ™ [xml] เบˆเบฐเปเบฅเปˆเบ™เบกเบฑเบ™เบœเปˆเบฒเบ™เบฅเบฐเบซเบฑเบ” parser เปเบฅเบฐเบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰ xml เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ Classes เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบทเปˆเบญเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ”เบฝเบงเบเบฑเบ™.

เบ„เบฒเบชเบ— hashtables

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบกเบตเบ•เบปเบงเบชเป‰เบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบทเบšเบ•เปเปˆเป‚เบ”เบเบšเปเปˆเบกเบตเบ•เบปเบงเบชเป‰เบฒเบ‡เป‚เบ”เบเบเบฒเบ™เบชเบปเปˆเบ‡ hashtable เป„เบ›เบซเบฒเบ›เบฐเป€เบžเบ”เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบขเปˆเบฒเบฅเบทเบกเปƒเบŠเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเป€เบžเบทเปˆเบญเปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเบˆเบฒเบเบฎเบนเบšเปเบšเบšเบ™เบตเป‰. เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเบžเบดเบกเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ–เบดเบ‡เป€เบซเบ”เบœเบปเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปเบฅเบฐเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ—เบตเปˆเป€เบฅเบดเบเป€เบŠเบดเปˆเบ‡เบเบงเปˆเบฒ.

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
}

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เบซเบฅเปเปˆเบŠเปˆเบงเบเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ—เบตเปˆเบชเบฐเบญเบฒเบ”. เบ›เบฝเบšเบ—เบฝเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡ Cluster hashtable array เบ—เบตเปˆเบชเบปเปˆเบ‡เป„เบ›เบซเบฒ Format-Table เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบฎเบฑเบš เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเป‚เบเบ™ hashtables เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบŠเบฑเป‰เบ™เบฎเบฝเบ™. เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ–เบทเบเบฅเบฐเบšเบธเป„เบงเป‰เบชเบฐเป€เปเบตเปƒเบ™เบฅเบณเบ”เบฑเบšเบ—เบตเปˆเบžเบงเบเบกเบฑเบ™เบ–เบทเบเบเบณเบ™เบปเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบขเปˆเบฒเบฅเบทเบกเป€เบžเบตเปˆเบกเบ„เปเบฒเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš.

Functional Powershell เบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™เบšเปเปˆเปเบกเปˆเบ™ oxymoron, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบกเบฑเบ™

เบ„เบงเบฒเบกเบซเบกเบฒเบ

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบต constructor เบ—เบตเปˆเบกเบตเบซเบ™เบถเปˆเบ‡ argument, เบเบฒเบ™เบชเบปเปˆเบ‡เบ„เปˆเบฒเป„เบ›เบซเบฒเบ›เบฐเป€เบžเบ” class เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฐเบชเบปเปˆเบ‡เบ„เปˆเบฒเปƒเบซเป‰เบเบฑเบš constructor เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ instance เบ‚เบญเบ‡ class เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

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"

เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เป„เบ›เปเบ–เบง

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ” override เบงเบดเบ—เบตเบเบฒเบ™เบŠเบฑเป‰เบ™เบฎเบฝเบ™ [string] ToString() เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบซเบผเบฑเบ‡เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡ string เบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธ, เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เปƒเบŠเป‰ string interpolation.

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 instances

Cast เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰ deserialization เบ›เบญเบ”เป„เบž. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบˆเบฐเบฅเบปเป‰เบกเป€เบซเบฅเบงเบ–เป‰เบฒเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเบเบปเบ‡เบเบฑเบšเบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™ Cluster

# ะ’ะฐะปะธะดะฐั†ะธั ัะตั€ะธะฐะปะธะทะพะฒะฐะฝะฝั‹ั… ะดะฐะฝะฝั‹ั…

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

Castes เปƒเบ™เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™

เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบ—เปเบฒเบญเบดเบ”เบเปเบฒเบ™เบปเบ”เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เป€เบ›เบฑเบ™เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰. เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบ›เบฐเบ—เบฑเบšเปƒเบˆเบ—เบตเปˆเบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบซเป‰เบญเบ‡เบฎเบฝเบ™เบเปเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบเป‰เบญเบ™เบเบฒเบ™เบžเบดเบกเบงเบดเบ—เบตเบเบฒเบ™เปเบ›เบ‡.

Powershell เบ—เบตเปˆเบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เบ‚เบฝเบ™เบกเบตเบ›เบฐเป‚เบซเบเบ”เบšเป?

เบซเบผเบฒเบเบ„เบปเบ™เบ—เบตเปˆเบกเบฒเบˆเบฒเบ C# เบซเบผเบทเบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปเบกเปˆเบ™เบ‚เบฝเบ™ Powershell, เป€เบŠเบดเปˆเบ‡เบ„เป‰เบฒเบเบ„เบทเบเบฑเบš C#. เป‚เบ”เบเบเบฒเบ™เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบเป‰เบฒเบเบญเบญเบเป„เบ›เบˆเบฒเบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปเบฅเบฐเบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบเบฒเบ™เบฅเบปเบ‡เป€เบฅเบดเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเปเบšเบšเบงเบฑเบ”เบ–เบธเปƒเบ™ Powershell เบซเบผเบทเบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบผเบฒเบเป‚เบ”เบเปƒเบŠเป‰เบ—เปเปˆ (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบซเป‰เบญเบ‡เบฎเบฝเบ™เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™

Castes, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเปƒเบŠเป‰ syntax เบ—เบฒเบ‡เป€เบฅเบทเบญเบ, เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบญเบ‡เป‚เบ”เป€เบกเบ™. เปƒเบ™เบ—เปเปˆ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เปเบœเบ™เบ—เบตเปˆ array เบ‚เบญเบ‡เบ„เปˆเบฒเป‚เบ”เบเปƒเบŠเป‰ ForEach-Object.

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰, Node constructor เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆ Datum เบ–เบทเบเป‚เบเบ™, เปเบฅเบฐเบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบตเป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเบšเปเปˆเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบธเบกเปƒเบชเปˆเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบเบฒเบ”, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เปเบเบ‡เบเบฒเบ™เปเบเบเบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡.

# ะŸั€ะธะผะตั€ ะบะพะผะฑะธะฝะธั€ะพะฒะฐะฝะธั ะบะปะฐััะพะฒ ั ะบะพะฝะฒะตะนะตั€ะฐะผะธ ะดะปั 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

เบซเป‰เบญเบ‡เบฎเบฝเบ™เบšเบฑเบ™เบˆเบธเบžเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เบทเบ™

เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ”เบตเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบซเป‰เบญเบ‡เบฎเบฝเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบชเบปเปˆเบ‡เบญเบญเบเป‚เบ”เบเป‚เบกเบ”เบนเบ™เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบผเบทเบ•เบปเบงเปเบ›; เปเบ•เปˆเบกเบตเบšเบฒเบ‡ tricks. เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปƒเบ™เป„เบŸเบฅเปŒ ./my-classes.ps1

  • เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” dotsource เป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบตเบซเป‰เบญเบ‡เบฎเบฝเบ™:. ./my-classes.ps1. เบ™เบตเป‰เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ my-classes.ps1 เปƒเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบŠเบฑเป‰เบ™เบฎเบฝเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบเป„เบŸเบฅเปŒเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™.

  • เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เป‚เบกเบ”เบนเบ™ Powershell เบ—เบตเปˆเบชเบปเปˆเบ‡เบญเบญเบ APIs เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ” (cmdlets) เปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ› ScriptsToProcess = "./my-classes.ps1" เปƒเบ™ manifest เป‚เบกเบ”เบนเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ”เป‰เบงเบเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ”เบฝเบงเบเบฑเบ™: ./my-classes.ps1 เบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™ เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ.

เบ•เบปเบงเป€เบฅเบทเบญเบเปƒเบ”เบเปเปˆเบ•เบฒเบกเบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบฅเบทเบญเบ, เบˆเบปเปˆเบ‡เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบฅเบฐเบšเบปเบšเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ Powershell เบšเปเปˆเบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบŠเบทเปˆเบ”เบฝเบงเบเบฑเบ™เบ—เบตเปˆเป‚เบซเบฅเบ”เบกเบฒเบˆเบฒเบเบšเปˆเบญเบ™เบ•เปˆเบฒเบ‡เป†.
เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบˆเบฐเป‚เบซเบฅเบ”เบชเบญเบ‡เบŠเบฑเป‰เบ™เบฎเบฝเบ™เบ”เบฝเบงเบเบฑเบ™เบ—เบตเปˆเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ”เบฝเบงเบเบฑเบ™เบˆเบฒเบเบšเปˆเบญเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบ—เปˆเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เบ—เบตเปˆเบˆเบฐเบกเบตเบšเบฑเบ™เบซเบฒ.

เบงเบดเบ—เบตเบเบฒเบ™เบ•เปเปˆ

เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบเบฒเบ™เบซเบผเบตเบเบฅเป‰เบฝเบ‡เบšเบฑเบ™เบซเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เบ›เบฐเป€เบžเบ”เปเบกเปˆเบ™ เบขเปˆเบฒเป€เบ›เบตเบ”เป€เบœเบตเบเบŠเบฑเป‰เบ™เบฎเบฝเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบ„เบฒเบ”เบซเบงเบฑเบ‡เปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบ›เบฐเป€เบžเบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เปƒเบ™เบŠเบฑเป‰เบ™เบฎเบฝเบ™, เบชเบปเปˆเบ‡เบญเบญเบเบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฒเบเป‚เบกเบ”เบนเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบ—เบตเปˆเบเปเบฒเบˆเบฑเบ”เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบŠเบฑเป‰เบ™เบฎเบฝเบ™เป‚เบ”เบเบเบปเบ‡. เบชเปเบฒเบฅเบฑเบš Cluster, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบญเบญเบเบŸเบฑเบ‡เบŠเบฑเบ™ New-Cluster เบ—เบตเปˆเบˆเบฐเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบŠเบธเบ”เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเป€เบ›เบฑเบ™เบกเบดเบ”เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™ 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

เบกเบตเบซเบเบฑเบ‡เบญเบตเบเปเบ”เปˆเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™

เบเปˆเบฝเบงเบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™
PowerShell เบ›เป‰เบญเบ‡เบเบฑเบ™
เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบ—เบตเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เปƒเบ™ PowerShell

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™