Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΠΎΡ‚ Powershell со класи Π½Π΅ Π΅ оксиморон, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°ΠΌ

Π•Ρ˜ Π₯Π°Π±Ρ€! Π’ΠΈ Π³ΠΎ ΠΏΡ€Π΅Π·Π΅Π½Ρ‚ΠΈΡ€Π°ΠΌ ΠΏΡ€Π΅Π²ΠΎΠ΄ΠΎΡ‚ Π½Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° β€žΠ€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ PowerShell со класи.
Π’Π΅Ρ‚ΡƒΠ²Π°ΠΌ Π΄Π΅ΠΊΠ° Π½Π΅ Π΅ ΠΎΠΊΡΠΈΠΌΠΎΡ€ΠΎΠ½β€œ
ΠΎΠ΄ ΠšΡ€ΠΈΡΡ‚ΠΎΡ„Π΅Ρ€ ΠšΡƒΠ΅Ρ….

ΠžΠ±Ρ˜Π΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Ρ‡ΠΊΠΈ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π°Π°Ρ‚ нСсогласни Π΅Π΄Π½Π° со Π΄Ρ€ΡƒΠ³Π°, Π½ΠΎ ΠΈ Π΄Π²Π΅Ρ‚Π΅ сС ΠΏΠΎΠ΄Π΅Π΄Π½Π°ΠΊΠ²ΠΎ ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ Π²ΠΎ Powershell. РСчиси ситС програмски Ρ˜Π°Π·ΠΈΡ†ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΈΠ»ΠΈ Π½Π΅, ΠΈΠΌΠ°Π°Ρ‚ моТности Π·Π° ΠΏΡ€ΠΎΡˆΠΈΡ€Π΅Π½ΠΎ Π²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ ΠΈΠΌΠ΅-врСдност; ΠšΠ»Π°ΡΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎ структуритС ΠΈ записитС, сС само Π΅Π΄Π΅Π½ пристап. Ако ја ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° Класи Π½Π° Π²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° имиња ΠΈ врСдности ΠΈ ΠΈΠ·Π±Π΅Π³Π½ΡƒΠ²Π°ΠΌΠ΅ Ρ‚Π΅ΡˆΠΊΠΈ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΈ програмски ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΈ ΠΊΠ°ΠΊΠΎ Π½Π°ΡΠ»Π΅Π΄ΡƒΠ²Π°ΡšΠ΅, ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·Π°ΠΌ ΠΈΠ»ΠΈ промСнливост, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ искористимС Π±Π΅Π· Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΊΠΎΠ΄. ΠŸΠΎΠ½Π°Ρ‚Π°ΠΌΡƒ, со додавањС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π·Π±ΠΎΠ³Π°Ρ‚ΠΈΠΌΠ΅ Π½Π°ΡˆΠΈΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ΄ со Класи.

ΠœΠ°Π³ΠΈΡ˜Π°Ρ‚Π° Π½Π° каститС

ΠšΠ°ΡΡ‚ΠΈΡ‚Π΅ сС Π΅Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜ΠΌΠΎΡœΠ½ΠΈΡ‚Π΅ карактСристики Π²ΠΎ Powershell. Кога Π΄Π°Π²Π°Ρ‚Π΅ врСдност, сС ΠΏΠΎΡ‚ΠΏΠΈΡ€Π°Ρ‚Π΅ Π½Π° ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚Π½ΠΈΡ‚Π΅ моТности Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ ΠΎΠΊΠΎΠ»ΠΈΠ½Π°Ρ‚Π° Π³ΠΈ Π΄ΠΎΠ΄Π°Π²Π° Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Сдноставното ΠΈΡΡ„Ρ€Π»Π°ΡšΠ΅ Π½Π° Π½ΠΈΠ·Π° Π²ΠΎ [xml] ќС Π³ΠΎ ΠΏΠΎΠΌΠΈΠ½Π΅ Π½ΠΈΠ· парсСрскиот ΠΊΠΎΠ΄ ΠΈ ќС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° цСлосно xml Π΄Ρ€Π²ΠΎ. МоТСмС Π΄Π° користимС Класи Π²ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° истата Ρ†Π΅Π».

Π€Ρ€Π»ΠΈ Ρ…Π°ΡˆΡ‚Π°Π±Π»ΠΎΠ²ΠΈ

Ако Π½Π΅ΠΌΠ°Ρ‚Π΅ конструктор, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅ Π±Π΅Π· Ρ‚Π°ΠΊΠΎΠ² со Ρ„Ρ€Π»Π°ΡšΠ΅ Ρ…Π°ΡˆΡ‚Π°Π± Π²ΠΎ Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° класа. НС Π·Π°Π±ΠΎΡ€Π°Π²Π°Ρ˜Ρ‚Π΅ Π΄Π° Π³ΠΈ користитС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΡ‚Π΅ Π·Π° Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡ˜Π° Π·Π° цСлосно ΠΈΡΠΊΠΎΡ€ΠΈΡΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ²Π°Π° шСма. Π’ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ користимС типскитС ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° Π½Π° класата Π·Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ ΡƒΡˆΡ‚Π΅ ΠΏΠΎΠ΄Π»Π°Π±ΠΎΠΊΠ° Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡ˜Π°.

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 ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½Π° Π²ΠΎ Π€ΠΎΡ€ΠΌΠ°Ρ‚-Ρ‚Π°Π±Π΅Π»Π° со ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°Ρ‚Π΅ Π°ΠΊΠΎ ΠΏΡ€Π²ΠΎ Π³ΠΈ Ρ„Ρ€Π»ΠΈΡ‚Π΅ ΠΎΠ²ΠΈΠ΅ Ρ…Π°ΡˆΡ‚Π°Π±Π»ΠΈ Π²ΠΎ класа. Π‘Π²ΠΎΡ˜ΡΡ‚Π²Π°Ρ‚Π° Π½Π° класата сСкогаш сС Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ ΠΏΠΎ рСдослСдот ΠΏΠΎ кој сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Ρ‚Π°ΠΌΡƒ. НС Π·Π°Π±ΠΎΡ€Π°Π²Π°Ρ˜Ρ‚Π΅ Π΄Π° Π³ΠΎ Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ скриСниот ΠΊΠ»ΡƒΡ‡Π΅Π½ Π·Π±ΠΎΡ€ ΠΏΡ€Π΅Π΄ ситС ΠΎΠ½ΠΈΠ΅ ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° ΡˆΡ‚ΠΎ Π½Π΅ сакатС Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ Π²ΠΈΠ΄Π»ΠΈΠ²ΠΈ Π²ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΠΎΡ‚ Powershell со класи Π½Π΅ Π΅ оксиморон, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°ΠΌ

Листа Π½Π° Π·Π½Π°Ρ‡Π΅ΡšΠ°

Ако ΠΈΠΌΠ°Ρ‚Π΅ конструктор со Π΅Π΄Π΅Π½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΡΡ‚Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ врСдност Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° класа ќС ја прСнСсС врСдноста Π½Π° Π²Π°ΡˆΠΈΠΎΡ‚ конструктор, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ ΠΎΠ΄ Π²Π°ΡˆΠ°Ρ‚Π° класа

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"

Π€Ρ€Π»Π°Ρ˜ Π½Π° линија

ΠœΠΎΠΆΠ΅Ρ‚Π΅ исто Ρ‚Π°ΠΊΠ° Π΄Π° Π³ΠΎ ΠΎΡ‚Ρ„Ρ€Π»ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ Π½Π° класата [string] ToString() Π·Π° Π΄Π° ја Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π·Π°Π΄ ΠΏΡ€Π΅Ρ‚ΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π½ΠΈΠ·Π°Ρ‚Π° Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΎΡ‚, ΠΊΠ°ΠΊΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»Π°Ρ†ΠΈΡ˜Π° Π½Π° Π½ΠΈΠ·Π°.

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

Π€Ρ€Π»Π°Ρ˜Ρ‚Π΅ ΡΠ΅Ρ€ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ случаи

Листата ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° сигурна Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ»Ρƒ Π½Π΅ΠΌΠ° Π΄Π° успСат Π°ΠΊΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π½Π΅ Π³ΠΈ исполнуваат Π½Π°ΡˆΠΈΡ‚Π΅ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ ΠšΠ»Π°ΡΡ‚Π΅Ρ€ΠΎΡ‚

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

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

ΠšΠ°ΡΡ‚ΠΈ Π²ΠΎ Π²Π°ΡˆΠΈΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ΄

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΏΡ€Π²ΠΎ Π³ΠΈ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π°Ρ‚ структуритС Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠ° ја спровСдуваат ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΊΠ°ΠΊΠΎ Π½ΠΈΠ·Π° ΠΎΠ΄ трансформации ΠΏΡ€Π΅ΠΊΡƒ Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ структури Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. И ΠΏΠΎΠΊΡ€Π°Ρ˜ ΠΊΠΎΠ½Ρ‚Ρ€Π°Π΄ΠΈΠΊΡ‚ΠΎΡ€Π½ΠΈΠΎΡ‚ Π²ΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΠΊ, класитС навистина Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π°Π°Ρ‚ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ΄ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈ.

Π”Π°Π»ΠΈ Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ Powershell ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΠΈΡˆΡƒΠ²Π°ΠΌ?

ΠœΠ½ΠΎΠ³Ρƒ Π»ΡƒΡ“Π΅ ΠΊΠΎΠΈ Π΄ΠΎΠ°Ρ“Π°Π°Ρ‚ ΠΎΠ΄ C# ΠΈΠ»ΠΈ слични ΠΏΠΎΠ·Π°Π΄ΠΈΠ½ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°Π°Ρ‚ Powershell, ΡˆΡ‚ΠΎ Π΅ слично Π½Π° C#. Π‘ΠΎ ΠΎΠ²Π°, Π²ΠΈΠ΅ сС ΠΎΠ΄Π΄Π°Π»Π΅Ρ‡ΡƒΠ²Π°Ρ‚Π΅ ΠΎΠ΄ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΈ Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅ ΠΈ Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ ќС ΠΈΠΌΠ°Ρ‚Π΅ корист ΠΎΠ΄ ΠΌΠ½ΠΎΠ³Ρƒ Π½ΡƒΡ€ΠΊΠ°ΡšΠ΅ Π²ΠΎ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ Powershell ΠΈΠ»ΠΈ Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ повСќС Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅.

Ако ΠΌΠ½ΠΎΠ³Ρƒ сС ΠΏΠΎΡ‚ΠΏΠΈΡ€Π°Ρ‚Π΅ Π½Π° Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π° Π½Π° Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object ΠΈΡ‚Π½. - ΠΈΠΌΠ°Ρ‚Π΅ ΠΏΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ стил ΠΈ ќС ΠΈΠΌΠ°Ρ‚Π΅ корист ΠΎΠ΄ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Powershell часови Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ стил.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° часови

ΠšΠ°ΡΡ‚ΠΈΡ‚Π΅, ΠΈΠ°ΠΊΠΎ користат Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π° синтакса, сС само ΠΌΠ°ΠΏΠΈΡ€Π°ΡšΠ΅ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Π΄Π²Π° Π΄ΠΎΠΌΠ΅Π½ΠΈ. Π’ΠΎ Π½Π°Ρ„Ρ‚ΠΎΠ²ΠΎΠ΄ΠΎΡ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΌΠ°ΠΏΠΈΡ€Π°Ρ‚Π΅ Π½ΠΈΠ·Π° врСдности ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ForEach-Object.

Π’ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ ΠΏΠΎΠ΄ΠΎΠ»Ρƒ, конструкторот Π½Π° јазол сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° сСкој ΠΏΠ°Ρ‚ ΠΊΠΎΠ³Π° сС Ρ„Ρ€Π»Π°Π°Ρ‚ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΈ Ρ‚ΠΎΠ° Π½ΠΈ Π΄Π°Π²Π° моТност Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌΠ΅ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ количСство ΠΊΠΎΠ΄. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, Π½Π°ΡˆΠΈΠΎΡ‚ гасовод сС фокусира Π½Π° Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ Π±Π°Ρ€Π°ΡšΠ΅ ΠΈ ΡΠΎΠ±ΠΈΡ€Π°ΡšΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π°ΡˆΠΈΡ‚Π΅ класи сС Π³Ρ€ΠΈΠΆΠ°Ρ‚ Π·Π° ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅ ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅.

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ комбинирования классов с ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°ΠΌΠΈ для 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

Класа Π½Π° ΠΏΠ°ΠΊΡƒΠ²Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°

ΠΠΈΡˆΡ‚ΠΎ Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΡƒ Π΄ΠΎΠ±Ρ€ΠΎ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π°

Π—Π° ΠΆΠ°Π», класитС Π½Π΅ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС ΠΈΠ·Π²Π΅Π·ΡƒΠ²Π°Π°Ρ‚ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π° ист Π½Π°Ρ‡ΠΈΠ½ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅; Π½ΠΎ ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠΈ Ρ‚Ρ€ΠΈΠΊΠΎΠ²ΠΈ. Π”Π° Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π²Π°ΡˆΠΈΡ‚Π΅ класи сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ./my-classes.ps1

  • ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²ΠΎΡ€ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° со класи:. ./my-classes.ps1. Ова ќС Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈ my-classes.ps1 Π²ΠΎ Π²Π°ΡˆΠΈΠΎΡ‚ сСгашСн опсСг ΠΈ ќС Π³ΠΈ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° ситС класи ΠΎΠ΄ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Ρ‚Π°ΠΌΡƒ.

  • ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Powershell ΠΌΠΎΠ΄ΡƒΠ» ΡˆΡ‚ΠΎ Π³ΠΈ ΠΈΠ·Π²Π΅Π·ΡƒΠ²Π° ситС ваши сопствСни API (cmdlets) ΠΈ Π΄Π° ја поставитС ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° ScriptsToProcess = β€ž./my-classes.ps1β€œ Π²ΠΎ манифСстот Π½Π° Π²Π°ΡˆΠΈΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ», со истиот Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚: ./my-classes.ps1 ќС сС ΠΈΠ·Π²Ρ€ΡˆΠΈ Π²ΠΎ Π²Π°ΡˆΠ°Ρ‚Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°.

Која ΠΎΠΏΡ†ΠΈΡ˜Π° ΠΈ Π΄Π° ја ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅, ΠΈΠΌΠ°Ρ˜Ρ‚Π΅ Π½Π° ΡƒΠΌ Π΄Π΅ΠΊΠ° систСмот Π·Π° Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° Powershell Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ со исто ΠΈΠΌΠ΅ Π²Ρ‡ΠΈΡ‚Π°Π½ΠΈ ΠΎΠ΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ мСста.
Π”ΡƒΡ€ΠΈ ΠΈ Π°ΠΊΠΎ стС Π²Ρ‡ΠΈΡ‚Π°Π»Π΅ Π΄Π²Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ класи со исти ΡΠ²ΠΎΡ˜ΡΡ‚Π²Π° ΠΎΠ΄ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ мСста, Ρ€ΠΈΠ·ΠΈΠΊΡƒΠ²Π°Ρ‚Π΅ Π΄Π° Π½Π°ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

ΠŸΠ°Ρ‚ΠΎΡ‚ Π½Π°ΠΏΡ€Π΅Π΄

ΠΠ°Ρ˜Π΄ΠΎΠ±Π°Ρ€ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ со Ρ€Π΅Π·ΠΎΠ»ΡƒΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ Π΅ никогаш Π΄Π° Π½Π΅ Π³ΠΈ ΠΈΠ·Π»ΠΎΠΆΡƒΠ²Π°Ρ‚Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ часови Π½Π° корисницитС. НамСсто Π΄Π° ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Ρ‚Π΅ корисникот Π΄Π° ΡƒΠ²Π΅Π·Π΅ Ρ‚ΠΈΠΏ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ ΠΎΠ΄ класа, ΠΈΠ·Π²Π΅Π·Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΎΠ΄ Π²Π°ΡˆΠΈΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ» ΡˆΡ‚ΠΎ ја Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π΅Π½ пристап Π΄ΠΎ класата. Π—Π° ΠšΠ»Π°ΡΡ‚Π΅Ρ€, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠ·Π²Π΅Π·Π΅ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Ново-ΠšΠ»Π°ΡΡ‚Π΅Ρ€ ΡˆΡ‚ΠΎ ќС ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° сСтови Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΈ Π·Π° корисникот ΠΈ ќС Π²Ρ€Π°Ρ‚ΠΈ ΠšΠ»Π°ΡΡ‚Π΅Ρ€.

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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€