Создание модуля в реальном мире: создание функций

Управление системами может казаться как жонглирование слишком многими мячами одновременно. Одну минуту вы устраняете проблему хранения данных; на следующей охотитесь за характеристиками процессора или проверяете объем памяти. Делать это вручную не только утомительно, но и подвержено ошибкам. Если вы застряли в этом цикле, пришло время остановить безумие. Автоматизация – ваш ответ!

В этом руководстве вы узнаете, как создавать функции 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/