Powershell ืคื•ื ืงืฆื™ื•ื ืœื™ ืขื ืฉื™ืขื•ืจื™ื ื”ื•ื ืœื ืื•ืงืกื™ืžื•ืจื•ืŸ, ืื ื™ ืžื‘ื˜ื™ื— ืืช ื–ื”

ื”ื™ื™ ื”ื‘ืจ! ืื ื™ ืžืฆื™ื’ ืœืชืฉื•ืžืช ืœื‘ืš ืืช ื”ืชืจื’ื•ื ืฉืœ ื”ืžืืžืจ "PowerShell ืคื•ื ืงืฆื™ื•ื ืœื™ ืขื ืฉื™ืขื•ืจื™ื.
ืื ื™ ืžื‘ื˜ื™ื— ืฉื–ื” ืœื ืื•ืงืกื™ืžื•ืจื•ืŸ"
ืžืืช ื›ืจื™ืกื˜ื•ืคืจ ืงื™ืš.

ืคืจื“ื™ื’ืžื•ืช ืชื›ื ื•ืช ืžื•ื ื—ื” ืขืฆืžื™ื ื•ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืขืฉื•ื™ื•ืช ืœื”ื™ืจืื•ืช ืžื ื•ื’ื“ื•ืช ื–ื• ืœื–ื•, ืืš ืฉืชื™ื”ืŸ ื ืชืžื›ื•ืช ื‘ืื•ืชื” ืžื™ื“ื” ื‘- Powershell. ื›ืžืขื˜ ืœื›ืœ ืฉืคื•ืช ื”ืชื›ื ื•ืช, ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืื• ืœื, ื™ืฉ ืžืชืงื ื™ื ืœืงืฉื™ืจืช ืฉื-ืขืจืš ืžื•ืจื—ื‘ืช; ืฉื™ืขื•ืจื™ื, ื›ืžื• ืžื‘ื ื™ื ื•ืฉื™ืื™ื, ื”ื ืจืง ื’ื™ืฉื” ืื—ืช. ืื ื ื’ื‘ื™ืœ ืืช ื”ืฉื™ืžื•ืฉ ืฉืœื ื• ื‘-Class ืœืงืฉื™ืจืช ืฉืžื•ืช ื•ืขืจื›ื™ื, ื•ื ื™ืžื ืข ืžืžื•ืฉื’ื™ ืชื›ื ื•ืช ื›ื‘ื“ื™ื ืžื•ื ื—ื” ืขืฆืžื™ื ื›ืžื• ื™ืจื•ืฉื”, ืคื•ืœื™ืžื•ืจืคื™ื–ื ืื• ืฉื™ื ื•ื™, ื ื•ื›ืœ ืœื ืฆืœ ืืช ื”ื™ืชืจื•ื ื•ืช ืฉืœื”ื ืžื‘ืœื™ ืœืกื‘ืš ืืช ื”ืงื•ื“ ืฉืœื ื•. ื™ืชืจ ืขืœ ื›ืŸ, ืขืœ ื™ื“ื™ ื”ื•ืกืคืช ืฉื™ื˜ื•ืช ื”ืžืจื” ืžืกื•ื’ื™ื ื‘ืœืชื™ ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืขืฉื™ืจ ืืช ื”ืงื•ื“ ื”ืคื•ื ืงืฆื™ื•ื ืœื™ ืฉืœื ื• ืขื Classes.

ื”ืงืกื ืฉืœ ื”ืงืกื˜ื•ืช

ืงืืกื˜ื•ืช ื”ืŸ ืื—ืช ื”ืชื›ื•ื ื•ืช ื”ื—ื–ืงื•ืช ื‘ื™ื•ืชืจ ื‘- Powershell. ื›ืืฉืจ ืืชื” ืžื˜ื™ืœ ืขืจืš, ืืชื” ืžืกืชืžืš ืขืœ ื™ื›ื•ืœื•ืช ื”ืืชื—ื•ืœ ื•ื”ืื™ืžื•ืช ื”ืžืจื•ืžื–ื™ื ืฉื”ืกื‘ื™ื‘ื” ืžื•ืกื™ืคื” ืœื™ื™ืฉื•ื ืฉืœืš. ืœื“ื•ื’ืžื”, ืคืฉื•ื˜ ื™ืฆื™ืงืช ืžื—ืจื•ื–ืช ื‘-[xml] ืชืคืขื™ืœ ืื•ืชื” ื“ืจืš ืงื•ื“ ื”ืžื ืชื— ื•ืชื™ืฆื•ืจ ืขืฅ xml ืฉืœื. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืฉื™ืขื•ืจื™ื ื‘ืงื•ื“ ืฉืœื ื• ืœืื•ืชื” ืžื˜ืจื”.

ื˜ื‘ืœืื•ืช 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
}

ื‘ื ื•ืกืฃ, ื”ืœื™ื”ื•ืง ืขื•ื–ืจ ืœืงื‘ืœ ืชืคื•ืงื” ื ืงื™ื™ื”. ื”ืฉื•ื•ื” ืืช ื”ืคืœื˜ ืฉืœ ืžืขืจืš ื”-hashtable ืฉืœ Cluster ื”ืžื•ืขื‘ืจ ืœ-Format-Table ืขื ืžื” ืฉืืชื” ืžืงื‘ืœ ืื ืืชื” ืžื˜ื™ืœ ืœืจืืฉื•ื ื” ืืช ื”ื˜ื‘ืœืื•ืช ื”-hashtable ื”ืืœื” ืœืžื—ืœืงื”. ื”ืžืืคื™ื™ื ื™ื ืฉืœ ืžื—ืœืงื” ืžื•ืคื™ืขื™ื ืชืžื™ื“ ื‘ืกื“ืจ ืฉื‘ื• ื”ื ืžื•ื’ื“ืจื™ื ืฉื. ืืœ ืชืฉื›ื— ืœื”ื•ืกื™ืฃ ืืช ืžื™ืœืช ื”ืžืคืชื— ื”ื ืกืชืจืช ืœืคื ื™ ื›ืœ ืื•ืชื ืžืืคื™ื™ื ื™ื ืฉืืชื” ืœื ืจื•ืฆื” ืฉื™ื•ืฆื’ื• ื‘ืชื•ืฆืื•ืช.

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 ืžื•ืคืขื™ื ื‘ืกื™ื“ืจื”

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 ืžื‘ื•ืฆืข ื‘ื›ืœ ืคืขื ืฉ-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

  • ืืชื” ื™ื›ื•ืœ dotsource ืงื•ื‘ืฅ ืขื ืžื—ืœืงื•ืช:. ./my-classes.ps1. ื–ื” ื™ืคืขื™ืœ ืืช my-classes.ps1 ื‘ื”ื™ืงืฃ ื”ื ื•ื›ื—ื™ ืฉืœืš ื•ื™ื’ื“ื™ืจ ืืช ื›ืœ ื”ืžื—ืœืงื•ืช ืžื”ืงื•ื‘ืฅ ืฉื.

  • ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืžื•ื“ื•ืœ Powershell ืฉืžื™ื™ืฆื ืืช ื›ืœ ืžืžืฉืงื™ ื”-API ื”ืžื•ืชืืžื™ื ืื™ืฉื™ืช ืฉืœืš (cmdlets) ื•ืœื”ื’ื“ื™ืจ ืืช ื”ืžืฉืชื ื” 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

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”