Búsqueda de sitios web

Ampliación de scripts externos en PowerShell


Siempre estoy buscando formas de hacer más con PowerShell. Y muchas veces, una vez que encuentro una técnica, busco otras áreas donde puedo aplicarla. Espero que hoy sea así para ti. Quizás no necesites duplicar mi trabajo en este artículo, pero espero que reconozcas el valor de las técnicas y conceptos y encuentres tus propias formas de aplicarlos. Lo que me interesa es ampliar y mejorar los resultados de PowerShell.

En PowerShell, existen diferentes tipos de comandos. Un tipo es un script externo. Estos son archivos de script de PowerShell que se pueden ejecutar sin especificar la ruta.

Get-Command profile.ps1 | 
Select-Object -property Name,Path,@{Name="LastWriteTime";Expression={(Get-Item $_.path).lastWriteTime}},
@{Name="Location";Expression={Split-Path $_.source}}

Es importante que sigas el objeto en la tubería. Get-Command está escribiendo un objeto System.Management.Automation.ExternalScriptInfo en la canalización. Ya conozco algunas de las propiedades que puedo usar. Pero también estoy usando una tabla hash para definir propiedades nuevas. Estoy creando una propiedad llamada LastWriteTime. El valor es el valor LastWriteTime del objeto de archivo que obtengo con Get-Item. También estoy creando una propiedad llamada Ubicación que será el directorio principal del script.

Get-Command -CommandType ExternalScript |Select-Object -property Name,Path,
@{Name="LastWriteTime";Expression={(Get-Item $_.path).lastWriteTime}},
@{Name="Location";Expression={Split-Path $_.source}} | 
Sort-Object -Property Location |
Format-Table -GroupBy Location -property Name,LastWriteTime

Voy a usar un comando de mi módulo PSTypeExtensionTools que puedes instalar desde la Galería de PowerShell. Funciona en Windows PowerShell y PowerShell 7, incluso multiplataforma. Aquí está mi código.

$tname = "System.Management.Automation.ExternalScriptInfo"
Add-PSTypeExtension -TypeName $tname -MemberType ScriptProperty -MemberName Location -Value {Split-Path $this.source}
Add-PSTypeExtension -TypeName $tname -MemberType ScriptProperty -MemberName Target -Value {
    $f = Get-Item $this.source
    #Use the target if the file is linked
    if ($f.Target) {
        $f.target
    }
    else {
        #use the full name
        $f.fullname
    }
}
Add-PSTypeExtension -TypeName $tname -MemberType ScriptProperty -MemberName LastWriteTime -Value {
    $f = Get-Item $this.source
    if ($f.Target) {
        (Get-Item -path $f.target).LastWriteTime
    }
    else {
        $f.LastWriteTime
    }
}

Sí, puedes hacer algo similar con Add-Member. Pero ahora vea lo fácil que es mi comando de PowerShell.

En mi sistema, tengo algunos scripts con enlaces simbólicos y es por eso que muestro una propiedad Target.

Estos cambios solo son válidos en esta sesión de PowerShell. Si los quiero todo el tiempo, tendría que insertar el código en un script de perfil. Sin embargo, puedo simplificarlo porque puedo exportar mis extensiones a un archivo json.

Get-PSTypeExtension -TypeName $tname | Export-PSTypeExtension -Path c:\scripts\externalscriptinfo.json

Luego, en mi perfil, puedo tener una sola línea de código para incorporarlos.

Import-PSTypeExtension C:\scripts\externalscriptinfo.json

¡Pero espera hay mas! ¿Recuerda ese comando incómodo de antes para formatear scripts externos como una tabla agrupada? Puedo simplificar eso también.
Si no lo tiene, instale el módulo PSScriptTools desde la Galería de PowerShell. Luego puede usar el comando New-PSFormatXML para crear un archivo de formato personalizado.

Get-Command mybackuppending.ps1 | New-PSFormatXML -Path c:\scripts\externalscriptinfo.format.ps1xml -Typename $tname -GroupBy Location -Properties Name, Target, LastWriteTime -ViewName location -FormatType table

En mi script de perfil de PowerShell importaré este archivo.

Update-FormatData C:\scripts\externalscriptinfo.format.ps1xml

Mira qué fácil es esto ahora.

Espero que esto te inspire a transformar PowerShell para hacer tu vida y tu trabajo más fáciles. ¡Buena suerte!

Artículos relacionados