יצירת מודול בעולם האמיתי: יצירת פונקציות

ניהול מערכות עשוי להרגיש כמו שחמם כדורים רבים בו זמנית. רגע אחד, אתה מטפל בבעיה באחסון; ברגע הבא, אתה מחפש מפרטי מעבד או בודק קיבולת זיכרון. לעשות זאת באופן ידני אינו רק משעמם אלא גם קל לטעויות. אם אתה תקוע במחזור זה, זה הזמן לעצור את השגעון. האוטומציה היא התשובה שלך!

במדריך זה, תלמד כיצד לבנות פונקציות PowerShell כך שתוכל לייעל את זרימות העבודה שלך ולהתמקד במה שממש חשוב.

תהנה מסט של תסריטים עוצמתיים באמצעות הערכתך, חוסך לך זמן ועוזר לך לפעול כמומחה!

בניית פונקציות לחילוץ מידע

כשאנו ממשיכים במודול, נמלא את המאפיין Info במידע חומרה באמצעות הפקודה Get-CimInstance. גישה זו מאפשרת לנו לסטנדרטייז ולשכפל קוד בצורה יעילה.

הפונקציות הבאות אוספות מידע על זיכרון, אחסון ומעבד מסיבי:

function Get-MemoryInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Memory'
        'Info'              = $null
    }

    $scriptBlock = {
        Get-CimInstance -ClassName Win32_PhysicalMemory
    }
    $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock

    $outObject['Info'] = $result
    [pscustomobject]$outObject
}

function Get-StorageInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Storage'
        'Info'              = $null
    }

    $scriptBlock = {
        Get-CimInstance -ClassName Win32_LogicalDisk
    }
    $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock

    $outObject['Info'] = $result
    [pscustomobject]$outObject
}

function Get-ProcessorInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Processor'
        'Info'              = $null
    }

    $scriptBlock = {
        Get-CimInstance -ClassName Win32_LogicalDisk
    }
    $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock

    $outObject['Info'] = $result
    [pscustomobject]$outObject
}

שינוי פלט

המידע הגולמי שנאסף משאילתות המערכת לעיתים קרובות כולל פרטים יותר מהנחוץ, וזה עשוי להיות מסובך לפרש. מצב כזה עשוי להוביל לאובדן יעילות כאשר מתמקדים במאפיינים ספציפיים ופעוליים.

כדי לסטנדרטיז את המידע, תוכל לשנות את הפלט מהפקודה Get-CimInstance לאובייקט מותאם.

להלן גרסה מעודכנת:

function Get-MemoryInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Memory'
        'Info'              = $null
    }

    $scriptBlock = {
        Get-CimInstance -ClassName Win32_PhysicalMemory
    }
    $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock

    $info = $result | ForEach-Object {
        [pscustomobject]@{
            'LocatorId' = $_.DeviceLocator
            'Capacity'  = $_.Capacity
        }
    }

    $outObject['Info'] = $info
    [pscustomobject]$outObject
}

function Get-StorageInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Storage'
        'Info'              = $null
    }

    $scriptBlock = {
        Get-CimInstance -ClassName Win32_LogicalDisk
    }
    $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock

    $info = $result | ForEach-Object {
        [pscustomobject]@{
            'VolumeName'      = $_.VolumeName
            'VolumeLetter'    = $_.DeviceId
            'VolumeCapacity'  = $_.Size
            'VolumeFreeSpace' = $_.FreeSpace
        }
    }

    $outObject['Info'] = $info
    [pscustomobject]$outObject
}

טיפול בערכים ביתיים

מידע חומרה לעיתים תכליתי כולל ערכים מספריים כמו קיבולת זיכרון או אחסון בבתים. למרות שמדוייק מבחינה טכנית, ערכים אלה עשויים להיות יותר פרקטיים לפתרון מהיר. המרה לגיגהאית מספקת הבנה יותר אינטואיטיבית של מדדי חומרה.

לצורך קריאות יותר טובה, פונקציית העזר ConvertTo-Gb עושה את התהליך זה יעיל:

function ConvertTo-Gb {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Bytes
    )

    $numberGb = $Bytes / 1GB
    [math]::Round($numberGb, 2)
}

function Get-MemoryInfo {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    $outObject = @{
        'ComputerName'      = $Session.ComputerName
        'HardwareCategory'  = 'Memory'
        'Info'              = $null
    }

    $scriptBlock = {
        Get-CimInstance -ClassName Win32_PhysicalMemory
    }
    $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock

    $info = $result | ForEach-Object {
        [pscustomobject]@{
            'LocatorId' = $_.DeviceLocator
            'Capacity'  = (ConvertTo-Gb -Bytes $_.Capacity)
        }
    }

    $outObject['Info'] = $info
    [pscustomobject]$outObject
}

הגישה הזו משפרת את הפונקציונליות והנקראות של הנתונים שמוחזרים על ידי פונקציות אלו. עדכונים או שינויים עתידיים מתקלים יותר על ידי המרכזה של הלוגיקה חוזרת לתוך פונקציות עזר כמו ConvertTo-Gb.

מסקנה

למדת כיצד ליצור פונקציות PowerShell באמצעות השלבים שנתונים במדריך זה. בין אם זה איסוף מידע חומרה ממערכות מרוחקות, המרת פלטים גולמיים לאובייקטים מותאמים מבנה, או הפיכת הנתונים לקריאים יותר.

עתה ששלטת בטכניקות אלה, שקול איך תוכל להרחיב על היסוד הזה. למשל, תוכל להוסיף קטגוריות חומרה נוספות למודול שלך, כמו מתאמי רשת או מידע GPU. תוכל גם לשלב את הפונקציות הללו בזרימות עבודה אוטומטיות גדולות יותר, כמו מעקב אחר בריאות המערכת או ניהול מלאי.

האפשרויות בלתי נגמרות, ואתה בדרכך לבניית סט כלים חזק לניהול ביטחון של המערכות שלך בביטחון.

Source:
https://adamtheautomator.com/powershell-functions-module/