Ѐункционалният 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, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° Format-Table, с Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚Π΅, Π°ΠΊΠΎ ΠΏΡŠΡ€Π²ΠΎ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈΡ‚Π΅ Ρ‚Π΅Π·ΠΈ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Π² клас. Бвойствата Π½Π° Π΄Π°Π΄Π΅Π½ клас Π²ΠΈΠ½Π°Π³ΠΈ са ΠΈΠ·Π±Ρ€ΠΎΠ΅Π½ΠΈ Π² Ρ€Π΅Π΄Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ са Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Ρ‚Π°ΠΌ. НС забравяйтС Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ скритата ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° Π΄ΡƒΠΌΠ° ΠΏΡ€Π΅Π΄ΠΈ всички Ρ‚Π΅Π·ΠΈ свойства, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ искатС Π΄Π° сС Π²ΠΈΠΆΠ΄Π°Ρ‚ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅.

Ѐункционалният 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'"

ΠŸΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° сСриализирани СкзСмпляри

Cast позволява бСзопасна дСсСриализация. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈ, Π°ΠΊΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π΅ отговарят Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° спСцификация Π² 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.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ, ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ΡŠΡ‚ Π½Π° Node сС изпълнява всСки ΠΏΡŠΡ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ Data, ΠΈ Ρ‚ΠΎΠ²Π° Π½ΠΈ Π΄Π°Π²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ писанСто Π½Π° голямо количСство ΠΊΠΎΠ΄. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° Π½Π°ΡˆΠΈΡΡ‚ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ сС фокусира Π²ΡŠΡ€Ρ…Ρƒ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ заявки Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π°Π³Ρ€Π΅Π³ΠΈΡ€Π°Π½Π΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π½Π°ΡˆΠΈΡ‚Π΅ класовС сС Π³Ρ€ΠΈΠΆΠ°Ρ‚ Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ.

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

  • ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° dotsource Ρ„Π°ΠΉΠ» с класовС:. ./my-classes.ps1. Π’ΠΎΠ²Π° Ρ‰Π΅ изпълни my-classes.ps1 Π² тСкущия Π²ΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‚ ΠΈ Ρ‰Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° всички класовС ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π° Ρ‚Π°ΠΌ.

  • ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΌΠΎΠ΄ΡƒΠ» Powershell, ΠΊΠΎΠΉΡ‚ΠΎ Скспортира всичкитС Π²ΠΈ пСрсонализирани API (ΠΊΡ€Π°Ρ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ) ΠΈ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° ScriptsToProcess = "./my-classes.ps1" Π² манифСста Π½Π° вашия ΠΌΠΎΠ΄ΡƒΠ» със ΡΡŠΡ‰ΠΈΡ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚: ./my-classes.ps1 Ρ‰Π΅ сС изпълни Π² Π²Π°ΡˆΠ°Ρ‚Π° срСда.

ΠšΠΎΡΡ‚ΠΎ ΠΈ опция Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅, ΠΈΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ систСмата Π·Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π½Π° Powershell Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ с Π΅Π΄Π½ΠΎ ΠΈ ΡΡŠΡ‰ΠΎ ΠΈΠΌΠ΅, Π·Π°Ρ€Π΅Π΄Π΅Π½ΠΈ ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ мСста.
Π”ΠΎΡ€ΠΈ Π°ΠΊΠΎ стС Π·Π°Ρ€Π΅Π΄ΠΈΠ»ΠΈ Π΄Π²Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ класа с Π΅Π΄Π½Π°ΠΊΠ²ΠΈ свойства ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ мСста, рискуватС Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π½Π΅Ρ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.

ΠŸΡŠΡ‚ΡΡ‚ Π½Π°ΠΏΡ€Π΅Π΄

Най-добрият Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΅ Π½ΠΈΠΊΠΎΠ³Π° Π΄Π° Π½Π΅ ΠΈΠ·Π»Π°Π³Π°Ρ‚Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ класовС Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅. ВмСсто Π΄Π° ΠΎΡ‡Π°ΠΊΠ²Π°Ρ‚Π΅ потрСбитСлят Π΄Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π° Ρ‚ΠΈΠΏ, Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ ΠΎΡ‚ клас, СкспортирайтС функция ΠΎΡ‚ вашия ΠΌΠΎΠ΄ΡƒΠ», която Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π° нСобходимостта ΠΎΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ класа. Π—Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° СкспортирамС функция New-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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€