Ia-Module -ListAvailable: de Ce sau cum sunt module tipărite în secțiuni împărțite de Director?

0

Problema

Când am făcut "Ia-Module -ListAvailable", powershell va imprima 169 module. De exemplu:

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

Când am captura acest lucru într-o matrice: "$m = Get-Module -ListAvailable" Se pare ca doar o gamă de simplu, dar, de asemenea, imprimă în aceste secțiuni.

Cum se face acest lucru?

Acolo nu pare a fi nici măcar un "Director" de proprietate pe PSModuleInfo obiecte.

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

Cel mai bun răspuns

4

Powershell avea propria formatare motor. Ori de câte ori utilizați ca cmdlet-ului, te ieșire o listă de System.Management.Automation.PSModuleInfo obiecte.

Înainte de imprimare obiect "prime", Powershell verifica dacă există o predefinite de formatare disponibile pentru tipul și dacă da, se aplică. Ceea ce vezi este rezultatul acestei transformări.

Până la PS 5.1, acest lucru a fost făcut prin formatarea fișierului de configurare, definit ca *.ps1xml fișiere. De la PS6.0 și mai noi, formate predefinite sunt acum incluse direct în codul sursă, dar puteți crea încă suplimentare de fișiere în format după cum este necesar.

Puteți vizualiza încărcate tip de format cu ajutorul Get-FormatData cmdlet-ului.

Dacă sunteți interesat în Get-Module cmdlet-ului în mod special, a verifica afară (Get-FormatData -TypeName System.Management.Automation.PSModuleInfo).FormatViewDefinition. Veți vedea ceva de genul asta:

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

Acest lucru înseamnă că orice obiect de acest tip au instrucțiuni speciale cu privire la modul în care ar trebui ieșire a obiectului său. În acest caz, acesta include gruparea de cale și care afișează anumite coloane (ModuleType, Versiunea, Numele, ExportedCommands). Powershell nu a ales să se afișeze acele proprietăți în sine, ea a primit instrucțiuni de la predefinite tip pe ceea ce pentru a afișa.

În caz de PSModuleInfo tip, putem vedea că există 3 vizualizări particularizate pentru tipul. Una pentru masa de vedere (care este implicit arătat), unul pentru lista și largă, care se instrui ce să arate, atunci când utilizați Format-List & Format-Wide.

De la MS doc

Formatul de afișare pentru obiectele care sunt returnate de comenzi (cmdlet-uri, funcții, și script-uri) sunt definite prin utilizarea de formatare fișierele (în format.ps1xml fișiere). Mai multe dintre aceste fișiere sunt furnizate de către PowerShell pentru a defini formatul de afișare pentru acele obiecte returnate de PowerShell-cu condiția comenzi, cum ar fi Sistemul.Diagnosticare.Procesul obiectul returnat de la Procesul cmdlet. Cu toate acestea, puteți, de asemenea, creați-vă propriul personalizat formatare fișiere pentru a suprascrie implicit formate de afișare sau puteți scrie o formatare personalizată fișier pentru a defini afișarea de obiecte returnate de către propriile comenzi.

PowerShell utilizează datele din aceste formatare fișiere pentru a determina ce este afișat și cum datele afișate este formatat. Afișat datele pot include proprietățile unui obiect sau valoare de un script.

Puteți crea propriile fișiere (*.ps1xml) și să le includă în module sau încărcați-le în sesiuni pentru a modifica modul de ieșire este afișat.

Puteți adăuga, de asemenea, formatarea la ieșirea de funcții definind un ecran implicit setat (aka ce proprietăți ar trebui să fie afișate).

De exemplu, această funcție simplă:


  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
  }

Fără nici implicit de afișare set, v-ar obține de ieșire standard cu toate proprietățile enumerate.

enter image description here

Cu afișajul implicit set adăugat, aici este noua ieșire.

enter image description here

Ambele ieșiri fac conține aceleași informații, dar consola avea o formatare specială aplicată pentru a arăta doar ceea ce este cel mai important, util, etc...

Puteți utiliza formatarea vedere la:

  • Colorize de ieșire
  • Crea copaci
  • Schimbarea de ieșire în funcție de stare
  • Adăugați proprietăți virtuale
  • defini lățimea coloanei
  • defini afișat titlul coloanei
  • etc...

Referințe:

Formatarea Fișierului De Ansamblu

4Sysops - Formatare obiect ieșire în Powershell cu Format.ps1xml fișiere

Update-FormatData

2021-11-24 00:29:40
1

Motivul pentru care Get-Module dă rezultatul în grupuri este pentru că este formatul implicit pentru Module obiecte ori de câte ori PowerShell le prezinta pentru utilizator. Nu e o trăsătură specifică a Get-Module cmdlet-ului ca atare.

Acest lucru este convenabil facilitate, în general, pentru că puteți apoi utilizați cmdlet-uri, cum ar fi Sort-Object și Where-Object pentru a sorta și filtra rezultatele și apoi au rezultatele prezentate în grupuri după aceea.

În următorul exemplu, rezultatele sunt filtrate și apoi afișate în grupuri. Semnificația este că nici Get-Module nici Where-Object este conștient de faptul că rezultatul final va fi afișat în grupuri; au de-a face doar cu obiecte.

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

Puteți vedea ce PowerShell este de a face în acest caz specific, uitandu-se la formatarea implicită cod pentru module de pe GitHub. Partea relevantă este GroupByScriptBlock apel (cu mici reformatarea pentru a reduce lungimea liniei):

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)

        ...

Când PowerShell prezinta o serie de module de obiecte pentru utilizator folosind formatul implicit, acesta va rula script-ul în bloc GroupByScriptBlock pe fiecare obiect în primul rând pentru a lucra în grup.

2021-11-23 21:29:07

În alte limbi

Această pagină este în alte limbi

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