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

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

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

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

ΠšΠ°ΡΡ‚ΠΎΠ²Π΅Ρ‚Π΅ са Π΅Π΄Π½Π° ΠΎΡ‚ Π½Π°ΠΉ-ΠΌΠΎΡ‰Π½ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² 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

  • ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ dot-sourcing Π½Π° Ρ„Π°ΠΉΠ»Π° с класовСтС: . ./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