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

හෙලෝ, හබ්ර්! ලිපියේ පරිවර්තනයක් මම ඔබේ අවධානයට ඉදිරිපත් කරමි "පන්ති සහිත ක්‍රියාකාරී පවර්ෂෙල්."
මම පොරොන්දු වෙනවා ඒක විරෝධාකල්පයක් නෙවෙයි කියලා"
ක්‍රිස්ටෝපර් කූච් විසිනි.

වස්තු-නැඹුරු සහ ක්‍රියාකාරී ක්‍රමලේඛන පරාමිතීන් එකිනෙකට පටහැනි බව පෙනෙන්නට තිබුණත්, දෙකම PowerShell හි සමානව සහාය දක්වයි. ක්‍රියාකාරී හෝ නොවූ සියලුම ක්‍රමලේඛන භාෂා පාහේ පුළුල් නාම-අගය බන්ධනය ලබා දෙයි; ව්‍යුහයන් සහ වාර්තා වැනි පන්ති එක් ප්‍රවේශයක් පමණි. අපගේ පන්ති භාවිතය නාම-අගය බන්ධනයට සීමා කිරීමෙන් සහ උරුමය, බහුරූපතාව හෝ විකෘතිතාව වැනි බර වස්තු-නැඹුරු ක්‍රමලේඛන සංකල්ප වළක්වා ගැනීමෙන්, අපගේ කේතය සංකීර්ණ නොකර ඒවායේ ප්‍රතිලාභ අපට ලබා ගත හැකිය. තවද, වෙනස් කළ නොහැකි වර්ග පරිවර්තන ක්‍රම එකතු කිරීමෙන්, අපට අපගේ ක්‍රියාකාරී කේතය පන්ති සමඟ පොහොසත් කළ හැකිය.

කුල මායාව

Casts යනු PowerShell හි ඇති බලවත්ම විශේෂාංගවලින් එකකි. ඔබ අගයක් වාත්තු කරන විට, ඔබ පරිසරය ඔබේ යෙදුමට එකතු කරන ව්‍යංග ආරම්භක සහ වලංගුකරණ හැකියාවන් මත රඳා පවතී. උදාහරණයක් ලෙස, [xml] වෙත නූලක් වාත්තු කිරීමෙන් එය විග්‍රහක කේතය හරහා ක්‍රියාත්මක වන අතර සම්පූර්ණ XML ගසක් ජනනය වේ. අපට එම අරමුණ සඳහාම අපගේ කේතයේ Classes භාවිතා කළ හැකිය.

හැෂ් මේස විකාශනය කරන්න

ඔබට කන්ස්ට්‍රක්ටරයක් ​​නොමැති නම්, ඔබට හැෂ් ටේබල් එක ඔබේ පන්ති වර්ගයට වාත්තු කිරීමෙන් එකක් නොමැතිව ඉදිරියට යා හැක. මෙම රටාවෙන් පූර්ණ ප්‍රයෝජන ගැනීමට වලංගුකරණ ගුණාංග භාවිතා කිරීමට අමතක නොකරන්න. ඊටත් වඩා ගැඹුරු ආරම්භක සහ වලංගුකරණ තර්කනය ක්‍රියාත්මක කිරීමට අපට ටයිප් කළ පන්ති ගුණාංග භාවිතා කළ හැකිය.

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
}

තවද, වාත්තු කිරීම වඩා පිරිසිදු ප්‍රතිදානයක් නිපදවීමට උපකාරී වේ. Format-Table වෙත ලබා දෙන හැෂ් ටේබල් වල 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

    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 = 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 පන්ති භාවිතා කිරීමෙන් ප්‍රතිලාභ ලැබෙනු ඇත.

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

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

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

# Пример комбинирования классов с конвейерами для 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 සඳහා, අපට පරිශීලක-හිතකාමී පරාමිති කට්ටල සඳහා සහය දක්වන සහ Cluster එකක් ආපසු ලබා දෙන 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 හි ක්‍රියාකාරී ක්‍රමලේඛනය

මූලාශ්රය: www.habr.com

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