Pide tu presupuesto ya!

Creación de un módulo del mundo real: crear funciones

La gestión de sistemas puede tener ganas de hacer malabarismos con demasiadas bolas a la vez. Un minuto, estás solucionando un problema de almacenamiento; Al siguiente, estás cazando especificaciones del procesador o verificando la capacidad de memoria. Hacerlo manualmente no solo es tedioso sino propenso a los errores. Si estás atrapado en este ciclo, es hora de detener la locura. ¡La automatización es su respuesta!

En esta guía, aprenderá cómo construir funciones de PowerShell para que pueda optimizar sus flujos de trabajo y centrarse en lo que realmente importa.

¡Disfruta de un conjunto de guiones poderosos en tu juego de herramientas, ahorrándote tiempo y ayudándote a operar como un profesional!

Construir funciones para extraer información

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

Las siguientes funciones recopilan información de memoria, almacenamiento y procesador de 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 salida

Los datos sin procesar recuperados de las consultas del sistema a menudo incluyen más detalles de los necesarios, por lo que es engorroso interpretarlo. Esta situación puede conducir a ineficiencias al enfocarse en atributos específicos y procesables.

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

Aquí hay 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 memoria o la capacidad de 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 de ayudante 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 la legibilidad de los datos devueltos por estas funciones. Las actualizaciones o cambios futuros se vuelven más manejables al centralizar la lógica repetitiva en funciones de ayuda ConvertTo-Gb.

Conclusión

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

Ahora que ha dominado estas técnicas, considere cómo puede ampliar esta base. Por ejemplo, puede agregar más categorías de hardware a su módulo, como adaptadores de red o información de GPU. También puede integrar estas funciones en flujos de trabajo de automatización más grandes, como el monitoreo de la salud del sistema o la gestión de inventario.

Las posibilidades son infinitas y estás en camino de construir un conjunto de herramientas robusto para administrar con confianza tus sistemas.

Written by

Leave a comment