පන්ති සමඟ ක්‍රියාකාරී පවර්ෂෙල් ඔක්සිමොරොන් නොවේ, මම එය සහතික කරමි

හෙලෝ, හබ්ර්! ලිපියේ පරිවර්තනයක් මම ඔබේ අවධානයට ඉදිරිපත් කරමි පන්ති සමඟ ක්‍රියාකාරී PowerShell.
මම පොරොන්දු වෙනවා එය ඔක්සිමොරොන් එකක් නොවන බව"
Christopher Kuech විසිනි.

වස්තු-නැඹුරු සහ ක්‍රියාකාරී ක්‍රමලේඛන සුසමාදර්ශයන් එකිනෙක පරස්පර ලෙස පෙනෙන්නට ඇත, නමුත් දෙකම 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 hashtable array හි ප්‍රතිදානය Format-Table වෙත ලබා දීම සහ ඔබ මෙම හැෂ් ටේබල් ප්‍රථමයෙන් පන්තියකට දැමූ විට ඔබට ලැබෙන දේ සමඟ සසඳන්න. පන්තියක ගුණාංග සෑම විටම ලැයිස්තුගත කර ඇත්තේ ඒවා එහි අර්ථ දක්වා ඇති අනුපිළිවෙලට ය. ඔබට ප්‍රතිඵලවල දෘශ්‍යමාන වීමට අවශ්‍ය නොවන සියලුම ගුණාංග වලට පෙර සැඟවුණු මූල පදය එක් කිරීමට අමතක නොකරන්න.

පන්ති සමඟ ක්‍රියාකාරී පවර්ෂෙල් ඔක්සිමොරොන් නොවේ, මම එය සහතික කරමි

අර්ථ කුලකය

ඔබට එක් තර්කයක් සහිත කන්ස්ට්‍රක්ටරයක් ​​තිබේ නම්, ඔබේ පන්ති වර්ගයට අගයක් දැමීමෙන් අගය ඔබේ ඉදිකිරීම්කරු වෙත ලබා දෙනු ඇත, එහිදී ඔබට ඔබේ පන්තියේ අවස්ථාවක් ආරම්භ කළ හැක.

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 ආරක්ෂිත deerialization ඉඩ දෙයි. දත්ත පොකුරු තුළ අපගේ පිරිවිතර සපුරා නොමැති නම් පහත උදාහරණ අසාර්ථක වනු ඇත

# Валидация сериализованных данных

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

ඔබේ ක්‍රියාකාරී කේතයේ කුල

ක්‍රියාකාරී වැඩසටහන් පළමුව දත්ත ව්‍යුහයන් නිර්වචනය කරයි, පසුව වෙනස් කළ නොහැකි දත්ත ව්‍යුහයන් හරහා පරිවර්තන අනුපිළිවෙලක් ලෙස වැඩසටහන ක්‍රියාත්මක කරයි. පරස්පර විරෝධී හැඟීම තිබියදීත්, ටයිප් පරිවර්තන ක්‍රමවලට ස්තූතිවන්ත වන පරිදි ක්‍රියාකාරී කේතය ලිවීමට පන්ති ඔබට උපකාර කරයි.

මම ලියන Powershell එක ක්‍රියාකාරීද?

C# හෝ ඒ හා සමාන පසුබිම් වලින් එන ගොඩක් අය C# වලට සමාන Powershell ලියනවා. මෙය සිදු කිරීමෙන්, ඔබ ක්‍රියාකාරී ක්‍රමලේඛන සංකල්ප භාවිතයෙන් ඉවත් වන අතර Powershell හි වස්තු-නැඹුරු වැඩසටහන් වලට දැඩි ලෙස කිමිදීමෙන් හෝ ක්‍රියාකාරී ක්‍රමලේඛනය පිළිබඳ වැඩිදුර ඉගෙනීමෙන් ප්‍රතිලාභ ලැබෙනු ඇත.

ඔබ නල මාර්ග (|), Where-Object, ForEach-Object, Select-Object, Group-Object, Sort-Object යනාදිය භාවිතයෙන් වෙනස් කළ නොහැකි දත්ත පරිවර්තනය කිරීම මත දැඩි ලෙස රඳා සිටින්නේ නම් - ඔබට වඩාත් ක්‍රියාකාරී විලාසයක් ඇති අතර ඔබට Powershell භාවිතා කිරීමෙන් ප්‍රතිලාභ ලැබෙනු ඇත. ක්රියාකාරී ශෛලිය තුල පන්ති.

පන්තිවල ක්රියාකාරී භාවිතය

කුල, විකල්ප වාක්‍ය ඛණ්ඩයක් භාවිතා කළද, වසම් දෙකක් අතර සිතියම්ගත කිරීමක් පමණි. නල මාර්ගයක් තුළ, ForEach-Object භාවිතයෙන් ඔබට අගයන් මාලාවක් සිතියම්ගත කළ හැක.

පහත උදාහරණයේ, Datum එකක් විකාශනය කරන සෑම අවස්ථාවකම Node constructor එක ක්‍රියාත්මක වන අතර, මෙය සාධාරණ කේතයක් නොලියා සිටීමට අපට අවස්ථාව ලබා දෙයි. එහි ප්‍රතිඵලයක් වශයෙන්, අපගේ නල මාර්ගය ප්‍රකාශන දත්ත විමසීම සහ එකතු කිරීම කෙරෙහි අවධානය යොමු කරන අතර, අපගේ පන්ති දත්ත විග්‍රහ කිරීම සහ වලංගු කිරීම ගැන සැලකිලිමත් වේ.

# Пример комбинирования классов с конвейерами для 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 ක්‍රියාත්මක කරන අතර එහි ඇති ගොනුවෙන් සියලුම පන්ති නිර්වචනය කරනු ඇත.

  • ඔබට ඔබේ සියලු අභිරුචි API (cmdlets) අපනයනය කරන Powershell මොඩියුලයක් සාදා ඔබේ මොඩියුල මැනිෆෙස්ටයේ ScriptsToProcess = "./my-classes.ps1" විචල්‍යය සැකසිය හැක, එම ප්‍රතිඵලය සමඟින්: ./my-classes.ps1 ක්‍රියාත්මක වනු ඇත. ඔබේ පරිසරය.

ඔබ තෝරා ගන්නා විකල්පය කුමක් වුවත්, Powershell වර්ගයේ පද්ධතියට විවිධ ස්ථාන වලින් පූරණය වන එකම නමේ වර්ග විසඳිය නොහැකි බව මතක තබා ගන්න.
ඔබ විවිධ ස්ථාන වලින් එකම ගුණාංග සහිත සමාන පන්ති දෙකක් පූරණය කළද, ඔබ ගැටළු වලට මුහුණ දීමේ අවදානමක් ඇත.

ඉදිරියට මාර්ගය

විභේදන ගැටළු වළක්වා ගැනීමට ඇති හොඳම ක්‍රමය නම් ඔබේ පන්ති කිසිවිටෙක පරිශීලකයින්ට හෙළි නොකිරීමයි. පරිශීලකයා විසින් පන්ති නිර්වචනය කළ වර්ගයක් ආයාත කිරීමට අපේක්ෂා කරනවා වෙනුවට, පන්තියට සෘජුවම ප්‍රවේශ වීමේ අවශ්‍යතාවය ඉවත් කරන ශ්‍රිතයක් ඔබේ මොඩියුලයෙන් අපනයනය කරන්න. 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

අදහස් එක් කරන්න