Get-Módulo -ListAvailable: ¿por Qué o cómo son los módulos impresos en secciones divididas por el Directorio?

0

Pregunta

Cuando hago "Get-Módulo -ListAvailable", powershell de impresión 169 módulos. Por ejemplo:

    Directory: C:\Program Files (x86)\Microsoft SQL Server\150\Tools\PowerShell\Modules


ModuleType Version    Name                                ExportedCommands                                                               
---------- -------    ----                                ----------------                                                               
Manifest   15.0       SQLPS                               {Backup-SqlDatabase, Save-SqlMigrationReport, Invoke-PolicyEvaluation, Resto...


    Directory: C:\Users\user\Documents\WindowsPowerShell\Modules


ModuleType Version    Name                                ExportedCommands                                                               
---------- -------    ----                                ----------------                                                               
Script     3.0.1      DotNetVersionLister                 Get-STDotNetVersion                                                            
Script     1.4.7      PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}         
Script     2.2.5      PowerShellGet                       {Find-Command, Find-DSCResource, Find-Module, Find-RoleCapability...}          
Script     2.2.16     VSSetup                             {Get-VSSetupInstance, Select-VSSetupInstance}                                  


    Directory: C:\Program Files\WindowsPowerShell\Modules


ModuleType Version    Name                                ExportedCommands                                                               
---------- -------    ----                                ----------------                                                               
Script     1.3.1      Configuration                       {Import-Configuration, Export-Configuration, Get-StoragePath, Add-MetadataCo...

Cuando me capturar esta en una matriz: "$m = Get-Módulo -ListAvailable" Parece que fuera una matriz simple, sin embargo, también imprime en estas secciones.

Cómo se hace esto?

Ni siquiera parece ser un "Directorio" de la propiedad en el PSModuleInfo objetos.

powershell
2021-11-23 19:46:21
2

Mejor respuesta

4

Powershell tiene su propio formato del motor. Siempre que utilice el cmdlet, la salida de una lista de System.Management.Automation.PSModuleInfo objetos.

Antes de imprimir el objeto de "raw", Powershell comprobar si hay un formato predefinido disponibles para el tipo y si es así, que la apliquen. Lo que vemos es el resultado de esa transformación.

Hasta PS 5.1, esto se hizo a través de un formato de archivo de configuración, que se define como *.ps1xml archivos. De PS6.0 y versiones posteriores, los formatos predefinidos están incluidos directamente en el código fuente, pero todavía se puede crear nuevos archivos de formato según sea necesario.

Usted puede ver la carga tipo de formato mediante el Get-FormatData cmdlet.

Si usted está interesado en la Get-Module cmdlet específicamente, echa un vistazo (Get-FormatData -TypeName System.Management.Automation.PSModuleInfo).FormatViewDefinition. Usted verá algo como esto:

Name   Control
----   -------
Module System.Management.Automation.TableControl
Module System.Management.Automation.WideControl
Module System.Management.Automation.ListControl

Esto significa que todos los objetos de ese tipo tienen instrucciones especiales relativas a la forma en que debe salida de su objeto. En ese caso, se incluye la agrupación de ruta de acceso y la visualización de las columnas específicas (ModuleType, Versión, Nombre, ExportedCommands). Powershell no elegido para mostrar las propiedades de por sí, consiguió su instrucciones del tipo predefinido en lo que a la pantalla.

En el caso de PSModuleInfo tipo, podemos ver que hay 3 vistas personalizadas para el tipo. Uno para la vista de la tabla (que es el valor predeterminado que se muestra), uno de la lista y amplia, que instruyan a lo que se debe mostrar cuando se utiliza Format-List & Format-Wide.

Desde MS doc

El formato de visualización de los objetos que son devueltos por los comandos (cmdlets, funciones y secuencias de comandos) se definen mediante el formato archivos (formato.ps1xml archivos). Varios de estos archivos son proporcionados por PowerShell para definir el formato de visualización de los objetos devueltos por PowerShell-proporciona comandos, tales como el Sistema.Los diagnósticos.Proceso de objeto devuelto por el cmdlet Get-Process. Sin embargo, también puede crear sus propios archivos de formato para sobrescribir el valor predeterminado formatos de visualización o puede escribir un formato personalizado para definir la visualización de los objetos devueltos por sus propios comandos.

PowerShell utiliza los datos de estos archivos de formato para determinar lo que se muestran y cómo los datos que se muestran es el formato. La muestra los datos pueden incluir las propiedades de un objeto o el valor de una secuencia de comandos.

Usted puede crear sus propios archivos (*.ps1xml) y los incluyen en sus módulos o cargarlos en sus sesiones para modificar la forma en que la salida se muestra.

También puede agregar formato a la salida de sus funciones mediante la definición de un defecto de la pantalla de ajuste (aka ¿qué propiedades deben ser mostrados).

Por ejemplo, tomar esta sencilla función:


  Function Get-EmployeesInfos() {
    $Output = @(
        
        [PSCustomObject]@{
            FirstName            = 'RObert'
            LastName             = 'Samson'
            SocialSecurityNumber = '123 344 555'
            Age                  = '32'
            Salary               = '100000'
        },
        
        [PSCustomObject]@{
            FirstName            = 'Pablo'
            LastName             = 'Morrison'
            SocialSecurityNumber = '123 345 555'
            Age                  = '22'
            Salary               = '10000'
        }


    )
    
    # Default display set
    $defaultDisplaySet = 'FirstName', 'LastName'
    $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet', [string[]]$defaultDisplaySet)
    $Output | Add-Member MemberSet PSStandardMembers ([System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)) -Force
    return $Output


    return $Output
  }

Sin ningún tipo predeterminado de visualización de conjunto, se obtiene a su salida estándar con todas las propiedades que se enumeran.

enter image description here

Con la pantalla por defecto conjunto agregado, aquí está la nueva salida.

enter image description here

Ambas salidas ¿contiene la misma información, pero la consola tiene un formato especial que se le aplica a mostrar sólo lo que es más importante, útil, etc...

Usted puede utilizar el formato vistas a:

  • Colorear de salida
  • Crear árboles
  • Salida de cambio basados en la condición
  • Agregar propiedades virtuales
  • definir el ancho de la columna
  • definir muestran título de la columna
  • etc...

Referencias:

Formato De Archivo Descripción

4Sysops - objeto de Formato de salida en Powershell con Formato.ps1xml archivos

Actualización-FormatData

2021-11-24 00:29:40
1

La razón por la que Get-Module está mostrando el resultado en los grupos es porque ese es el formato predeterminado para Module los objetos siempre PowerShell muestra al usuario. No es una característica específica de la Get-Module cmdlet como tal.

Esto es conveniente la instalación en general, porque entonces usted puede usar los cmdlets tales como Sort-Object y Where-Object para ordenar y filtrar los resultados y, a continuación, los resultados se muestran en grupos de después.

En el ejemplo siguiente, los resultados son filtrados y, a continuación, se muestra en grupos. El significado es que ni Get-Module ni Where-Object es consciente de que el resultado final se muestra en grupos; sólo que lidiar con los objetos.

PS> Get-Module -ListAvailable | Where-Object Name -Match Read

    Directory: C:\program files\powershell\7\Modules

ModuleType Version    PreRelease Name
---------- -------    ---------- ----
Script     2.1.0                 PSReadLine                          ...
Binary     2.0.3                 ThreadJob                           ...

    Directory: C:\Program Files\WindowsPowerShell\Modules

ModuleType Version    PreRelease Name
---------- -------    ---------- ----
Script     2.0.0      beta2      PSReadline                          ...

Usted puede ver lo que PowerShell está haciendo en este caso específico mirando el defecto de código de formato para módulos en GitHub. La parte relevante es el GroupByScriptBlock llame al (menores de volver a formatear para reducir la longitud de la línea):

yield return new FormatViewDefinition("Module",
    TableControl.Create()
        .GroupByScriptBlock(@"
            Split-Path -Parent $_.Path | ForEach-Object {
                if([Version]::TryParse((Split-Path $_ -Leaf), [ref]$null)) {
                    Split-Path -Parent $_
                } else {
                    $_
                }
            } | Split-Path -Parent", customControl: sharedControls[0])
        .AddHeader(Alignment.Left, width: 10)

        ...

Cuando PowerShell se muestra una matriz de objetos de módulo el usuario usando el formato por defecto, se ejecuta el bloque de secuencia de comandos en GroupByScriptBlock en cada uno de los objetos de primera para trabajar fuera de la agrupación.

2021-11-23 21:29:07

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................