Creando un módulo del mundo real: Creando funciones

Gestionar sistemas puede sentirse como hacer malabares con demasiadas pelotas a la vez. Un minuto estás resolviendo un problema de almacenamiento; al siguiente, estás buscando especificaciones de procesador o verificando la capacidad de memoria. Hacerlo manualmente no solo es tedioso, sino propenso a errores. Si te encuentras atrapado en este ciclo, es hora de detener la locura. ¡La automatización es tu respuesta!

En esta guía, aprenderás cómo construir funciones de PowerShell para poder optimizar tus flujos de trabajo y enfocarte en lo que realmente importa.

Disfruta de un conjunto de potentes scripts en tu arsenal, ahorrándote tiempo y ayudándote a operar como un profesional.

Creación de funciones para extraer información

A medida que avanzamos en el módulo, poblaremos la propiedad Info con información de hardware utilizando el cmdlet Get-CimInstance. Este enfoque nos permite estandarizar y reutilizar el código de manera efectiva.

Las siguientes funciones recopilan información de memoria, almacenamiento y procesador desde una sesión remota:

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
}

Transformación de la salida

Los datos sin procesar recuperados de las consultas del sistema a menudo incluyen más detalles de los necesarios, lo que dificulta su interpretación. Esta situación puede llevar a ineficiencias al centrarse en atributos específicos y accionables.

Para estandarizar los datos, puedes transformar la salida de Get-CimInstance en un objeto personalizado.

Aquí tienes una versión actualizada:

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
}

Manejo de valores de bytes

La información de hardware a menudo incluye valores numéricos como la capacidad de memoria o almacenamiento en bytes. Si bien es técnicamente preciso, estos valores podrían ser más prácticos para una interpretación rápida. Convertirlos a gigabytes proporciona una comprensión más intuitiva de las métricas de hardware.

Para una mejor legibilidad, la función auxiliar ConvertTo-Gb hace que este proceso sea eficiente:

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
}

Este enfoque mejora la funcionalidad y legibilidad de los datos devueltos por estas funciones. Las futuras actualizaciones o cambios se vuelven más manejables al centralizar la lógica repetitiva en funciones auxiliares como ConvertTo-Gb.

Conclusión

Has aprendido cómo crear funciones de PowerShell utilizando los pasos descritos en esta guía. Ya sea recopilando información de hardware de sistemas remotos, transformando salidas en bruto en objetos personalizados estructurados o haciendo que los datos sean más legibles.

Ahora que has dominado estas técnicas, considera cómo puedes expandir esta base. Por ejemplo, podrías agregar más categorías de hardware a tu módulo, como adaptadores de red o información de GPU. También podrías integrar estas funciones en flujos de trabajo de automatización más grandes, como monitoreo de salud del sistema o gestión de inventario.

Las posibilidades son infinitas, y estás en camino de construir un conjunto de herramientas sólido para gestionar tus sistemas con confianza.

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