Get-Modulo -ListAvailable: Perché e come sono i moduli stampati in sezioni diviso per Directory?

0

Domanda

Quando faccio "Get-Modulo -ListAvailable", powershell stampa 169 moduli. Per esempio:

    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 mi cattura in un array: "$m = Get-Modulo -ListAvailable" Sembra un semplice array, ma anche stampe in queste sezioni.

Come è questo fatto?

Ci non sembra nemmeno essere un "direttorio", è di proprietà PSModuleInfo oggetti.

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

Migliore risposta

4

Powershell avere il suo motore di formattazione. Ogni volta che si utilizza il cmdlet, è uscita una lista di System.Management.Automation.PSModuleInfo oggetti.

Prima di stampare l'oggetto "a crudo", Powershell controllare se c'è un valore predefinito di formattazione disponibili per il tipo e se è così, la si applica. Quello che vedi è il risultato di tale trasformazione.

Fino a PS 5.1, questo è stato fatto attraverso la formattazione del file di configurazione, definito come *.file ps1xml. Da alla ps6.0 e versioni più recenti, i formati predefiniti sono ora inclusi direttamente nel codice sorgente, ma si può ancora creare ulteriori formato di file, se necessario.

È possibile visualizzare caricato tipo di formato utilizzando il Get-FormatData cmdlet.

Se siete interessati alla Get-Module cmdlet in particolare, check-out (Get-FormatData -TypeName System.Management.Automation.PSModuleInfo).FormatViewDefinition. Si vedrà qualcosa di simile a questo:

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

Questo significa che tutti gli oggetti di quel tipo sono indicazioni particolari relative al modo in cui dovrebbe uscita del suo oggetto. In questo caso, esso comprende il raggruppamento, percorso e visualizzare le colonne specifiche (ModuleType, Versione, Nome, ExportedCommands). Powershell non è stato scelto per visualizzare le proprietà di per sé, ha le sue istruzioni predefinite tipo di cosa visualizzare.

In caso di PSModuleInfo tipo, possiamo vedere che c'è di 3 visualizzazioni personalizzate per il tipo. Uno per la tabella di vista (che è il default che compare), uno per la lista e in largo, che insegni cosa vedi quando si utilizza Format-List & Format-Wide.

Da MS doc

Il formato di visualizzazione per gli oggetti che vengono restituiti dai comandi (cmdlet, funzioni e script) sono definite utilizzando la formattazione file (formato.ps1xml file). Molti di questi file sono forniti da PowerShell per definire il formato di visualizzazione per gli oggetti restituiti da PowerShell-comandi previsti, come ad esempio il Sistema.Diagnostica.Processo oggetto restituito dal cmdlet Get-Process. Tuttavia, è anche possibile creare il proprio personalizzato la formattazione del file da sovrascrivere l'impostazione predefinita formati di visualizzazione oppure si può scrivere una formattazione personalizzata file per definire l'esposizione di oggetti restituiti da i vostri comandi.

PowerShell usa i dati in questi file di formattazione per determinare che cosa viene visualizzato e come i dati visualizzati è formattato. Visualizzato i dati possono includere le proprietà di un oggetto o il valore di uno script.

È possibile creare i propri file (*.ps1xml) e inserirle nei moduli o caricare durante le sessioni di modificare il modo in cui l'output viene visualizzato.

Puoi anche aggiungere una formattazione per l'output delle funzioni mediante la definizione di una visualizzazione di default impostato (aka quali proprietà deve essere visualizzata).

Per esempio, prendete questa semplice funzione:


  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
  }

Senza di visualizzazione di default impostato, si dovrebbe ottenere il vostro output standard con tutte le proprietà elencate.

enter image description here

Con la visualizzazione di default impostato aggiunta, ecco la nuova uscita.

enter image description here

Entrambe le uscite non contiene le stesse informazioni, ma le console hanno una speciale formattazione applicata per mostrare solo ciò che è più importante, utile, ecc...

È possibile utilizzare la formattazione vista:

  • Colorare uscita
  • Creare alberi
  • Modificare l'output in base alla condizione
  • Aggiungere proprietà virtuale
  • definire la larghezza della colonna
  • definire visualizzato il titolo della colonna
  • ecc...

Riferimenti:

La Formattazione Del File Panoramica

4Sysops - oggetto di Formattazione output in Powershell con il Formato.file ps1xml

Aggiornamento-FormatData

2021-11-24 00:29:40
1

Il motivo che Get-Module mostra il risultato in gruppi sia perché è il formato di default per Module oggetti ogni volta che PowerShell li mostra all'utente. Non è una caratteristica specifica della Get-Module cmdlet come tale.

Questa comoda struttura in generale, perché poi si possono utilizzare i cmdlet come Sort-Object e Where-Object per ordinare e filtrare i risultati e quindi i risultati sono mostrati in gruppi in seguito.

Nell'esempio riportato di seguito, i risultati vengono filtrati e quindi mostrata in gruppi. Il significato è che né Get-ModuleWhere-Object è consapevole che il risultato finale sarà mostrato in gruppi, hanno solo a che fare con oggetti.

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

Si può vedere ciò che PowerShell sta facendo in questo specifico caso, guardando la formattazione predefinita del codice per i moduli su GitHub. La parte rilevante è l' GroupByScriptBlock chiamare (con minori riformattazione per ridurre la lunghezza di riga):

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 un array di oggetti del modulo per l'utente che utilizza il formato di default, verrà eseguito il blocco di script in GroupByScriptBlock ogni oggetto prima di lavorare fuori, il raggruppamento.

2021-11-23 21:29:07

In altre lingue

Questa pagina è in altre lingue

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