Get-Module-ListAvailable: Por que ou como são módulos impressos em seções divididas por Diretório?

0

Pergunta

Quando eu faço o "Get-Module-ListAvailable", powershell irá imprimir 169 módulos. Por exemplo:

    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...

Quando eu capturar isso em uma matriz: "$m = Get-Module-ListAvailable" Ele parece ser apenas uma simples matriz, mas também imprime em uma dessas seções.

Como isso é feito?

Não parece mesmo ser um "Diretório" de propriedade sobre o PSModuleInfo objetos.

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

Melhor resposta

4

Powershell ter a sua própria formatação do motor. Sempre que você usar esse cmdlet, você gerar uma lista de System.Management.Automation.PSModuleInfo os objetos.

Antes de imprimir o objeto "cru", Powershell verifique se há um predefinidos de formatação disponíveis para o tipo e, em caso afirmativo, aplicá-lo. O que você vê é o resultado da transformação.

Até PS 5.1, isso era feito através de formatação do arquivo de configuração, definida como *.ps1xml arquivos. A partir de PS6.0 e a mais recente, formatos predefinidos são agora incluídas diretamente no código-fonte, mas você ainda pode criar os arquivos de formato conforme necessário.

Você pode visualizar o carregado tipo de formato usando o Get-FormatData cmdlet.

Se você está interessado no Get-Module cmdlet especificamente, confira (Get-FormatData -TypeName System.Management.Automation.PSModuleInfo).FormatViewDefinition. Você verá algo como isto:

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

Isso significa que todos os objetos de que tipo de instruções especiais sobre a forma que deveria saída do seu objeto. Nesse caso, inclui agrupamento pelo caminho e exibir as colunas específicas (ModuleType, Versão, Nome, ExportedCommands). Powershell não escolheu para exibir essas propriedades, por si só, ela tem o seu instruções do tipo predefinido no qual a apresentar.

No caso de PSModuleInfo tipo, podemos ver que há 3 modos de exibição personalizados para o tipo. Uma para o modo de exibição de tabela (que é o padrão mostrado), uma para a lista e grande, que instruem o que mostrar quando você usa Format-List & Format-Wide.

A partir do MS doc

O formato de apresentação para os objetos que são retornados pelos comandos (cmdlets, funções e scripts) são definidos por meio de formatação arquivos (formato.ps1xml arquivos). Vários destes ficheiros são fornecidos pela PowerShell para definir o formato de visualização para os objetos retornados pelo PowerShell comandos providos, tais como o Sistema.O diagnóstico.Processo objeto retornado pelo cmdlet Get-Process. No entanto, você também pode crie o seu próprio personalizado formatação de arquivos para substituir o padrão formatos de visualização, ou você pode escrever uma formatação personalizada arquivo para definir a exibição de objetos retornados por seus próprios comandos.

O PowerShell usa os dados destes arquivos de formatação para determinar o que é apresentado e a forma como os dados exibidos são formatados. O apresentado os dados podem incluir as propriedades de um objeto ou o valor de um script.

Você pode criar seus próprios arquivos (*.ps1xml) e incluí-los em seus módulos ou carregá-los em suas sessões para modificar a forma como o resultado é apresentado.

Você também pode adicionar formatação para a saída de suas funções, definindo um padrão de exibição definido (aka o que propriedades deve ser apresentado).

Por exemplo, este simples de função:


  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
  }

Sem qualquer exibição padrão definido, você teria a sua saída padrão com todas as propriedades listadas.

enter image description here

Com a exibição padrão definido adicionado, aqui é a nova saída.

enter image description here

As duas saídas não contém a mesmas informações, mas o console de ter um especial a formatação aplicada a ele para mostrar apenas o que é mais importante, útil, etc...

Você pode usar a formatação vistas para:

  • Colorir saída
  • Crie árvores
  • Alterar a saída com base na condição
  • Adicione virtual propriedades
  • definir a largura da coluna
  • definir exibido o título da coluna de
  • etc...

Referências:

Arquivo De Formatação Visão Geral

4Sysops - objeto Formatação de saída em Powershell com o Formato.ps1xml arquivos

Atualização-FormatData

2021-11-24 00:29:40
1

A razão que Get-Module está mostrando o resultado em grupos, é porque esse é o formato padrão para Module objetos sempre que PowerShell mostra-los para o usuário. Não é uma característica específica do Get-Module cmdlet como tal.

Este é instalação conveniente, em geral, porque em seguida, você pode usar os cmdlets, como Sort-Object e Where-Object para classificar e filtrar os resultados e, em seguida, temos os resultados mostrados em grupos posteriormente.

No exemplo a seguir, os resultados são filtrados e, em seguida, apresentadas em grupos. O significado é que nem Get-Module nem Where-Object está ciente de que o resultado final vai ser mostrado em grupos; eles apenas lidar com os 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                          ...

Você pode ver o que PowerShell está a fazer, neste caso específico, observando o padrão de formatação de código para módulos no GitHub. A parte relevante é a GroupByScriptBlock chamada (com menor reformatação para reduzir o comprimento da linha):

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)

        ...

Quando PowerShell mostra uma matriz de objetos do módulo para o usuário usando o formato padrão, ele será executado o bloco de script em GroupByScriptBlock em cada objecto em primeiro lugar para trabalhar fora do agrupamento.

2021-11-23 21:29:07

Em outros idiomas

Esta página está em outros idiomas

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