Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ Powershell с класовС β€” Π½Π΅ Π΅ оксиморон, увСрявам Π²ΠΈ Π² Ρ‚ΠΎΠ²Π°

Π—Π΄Ρ€Π°Π²Π΅ΠΉ, Π₯Π°Π±ΡŠΡ€! ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡΠΌ Π²ΠΈ ΠΏΡ€Π΅Π²ΠΎΠ΄ Π½Π° статия "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ PowerShell с классовС.
ΠžΠ±Π΅Ρ‰Π°Π²Π°ΠΌ, Ρ‡Π΅ Π½Π΅ Π΅ оксиморон"
Π°Π²Ρ‚ΠΎΡ€ΡŠΡ‚ Π΅ Christopher Kuech.

ΠžΠ±Π΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π°Ρ‚Π° ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Π½Π΅ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΈ, Π½ΠΎ ΠΈ Π΄Π²Π΅Ρ‚Π΅ са равнопоставСни Π² PowerShell. ΠŸΠΎΡ‡Ρ‚ΠΈ всички ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Ρ‰ΠΈ Π΅Π·ΠΈΡ†ΠΈ, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΈΠ»ΠΈ Π½Π΅, Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Ρ‚ с срСдства Π·Π° Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΎ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° ΠΈΠΌΠ΅Π½Π° ΠΈ стойности; ΠšΠ»Π°ΡΠΎΠ²Π΅Ρ‚Π΅, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° struct-ΠΎΠ²Π΅ ΠΈ record-ΠΎΠ²Π΅, са само Π΅Π΄ΠΈΠ½ ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚Π΅. Ако ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠΌ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° класовСтС Π΄ΠΎ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΈΠΌΠ΅Π½Π° ΠΈ стойности ΠΈ ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ "Ρ‚Π΅ΠΆΠΊΠΈΡ‚Π΅" ΠΎΠ±Π΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΊΠ°Ρ‚ΠΎ наслСдяванС, ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΡŠΠΌ ΠΈΠ»ΠΈ измСняСмост, Ρ‰Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° сС възползвамС ΠΎΡ‚ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ прСдимства, Π±Π΅Π· Π΄Π° услоТнявамС ΠΊΠΎΠ΄Π° си. ОсвСн Ρ‚ΠΎΠ²Π°, добавяйки нСизмСняСми ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΠΌ функционалния си ΠΊΠΎΠ΄ с класовС.

ΠœΠ°Π³ΠΈΡΡ‚Π° Π½Π° кастовСтС

ΠšΠ°ΡΡ‚ΠΎΠ²Π΅Ρ‚Π΅ са Π΅Π΄Π½ΠΎ ΠΎΡ‚ Π½Π°ΠΉ-ΠΌΠΎΡ‰Π½ΠΈΡ‚Π΅ прСдимства Π² 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, с Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅, Π°ΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° кастватС Ρ‚Π΅Π·ΠΈ Ρ…Π΅ΡˆΡ‚Π°Π±Π»ΠΈΡ†ΠΈ Π² клас. Бвойствата Π½Π° класа Π²ΠΈΠ½Π°Π³ΠΈ сС изброяват Π² Ρ€Π΅Π΄Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ са ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ. НС забравяйтС Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° Π΄ΡƒΠΌΠ° hidden ΠΏΡ€Π΅Π΄ всички Ρ‚Π΅Π·ΠΈ свойства, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ трябва Π΄Π° сС Π²ΠΈΠΆΠ΄Π°Ρ‚ Π² ΠΈΠ·Ρ…ΠΎΠ΄Π°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ 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 "Π’ΠΎΠΊΡƒ-Ρ‰ΠΎ ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π» Π·Π° '$cluster'"

ΠšΠ°ΡΡ‚ Π½Π° сСриализирани инстанции

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

ОпакованС Π½Π° класа Π·Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°

Нищо Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π΄ΠΎΠ±Ρ€ΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°

Π—Π° съТалСниС, класовСтС Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Скспортирани ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½, ΠΊΠ°ΠΊΡ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ; Π½ΠΎ ΠΈΠΌΠ° няколко Ρ‚Ρ€ΠΈΠΊΠ°. Π”Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ класовС са ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π² Ρ„Π°ΠΉΠ»Π° ./my-classes.ps1.

  • ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ дотсорсванС Π½Π° Ρ„Π°ΠΉΠ»Π° с класовС: . ./my-classes.ps1. Π’ΠΎΠ²Π° Ρ‰Π΅ изпълни my-classes.ps1 Π² Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° Π²ΠΈ област Π½Π° видимост ΠΈ Ρ‰Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ всички класовС ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π°.

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

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster