Get-Module -ListAvailable: Pourquoi et comment sont les modules imprimé en sections divisées par Répertoire?

0

La question

Quand je fais "Get-Module -ListAvailable", powershell impression 169 modules. Par exemple:

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

Quand je capture ce dans un tableau: "$m = Get-Module -ListAvailable" Il semble juste comme un simple tableau, mais il imprime aussi dans ces sections.

Comment est-ce fait?

Il n'y a pas même l'air d'être un "Répertoire" de la propriété sur la PSModuleInfo objets.

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

La meilleure réponse

4

Powershell avoir son propre moteur de formatage. Chaque fois que vous utilisez la cmdlet, vous sortie une liste de System.Management.Automation.PSModuleInfo objets.

Avant l'impression de l'objet "raw", Powershell vérifier si il y a une mise en forme prédéfinie disponibles pour le type et le cas échéant, de l'appliquer. Ce que vous voyez est le résultat de cette transformation.

Jusqu'à PS 5.1, cela a été fait par le formatage du fichier de configuration, défini comme *.ps1xml fichiers. De PS6.0 et versions plus récentes, formats prédéfinis sont maintenant inclus directement dans le code source, mais vous pouvez toujours créer d'autres format de fichiers que nécessaire.

Vous pouvez afficher les chargés de type de format à l'aide de la Get-FormatData applet de commande.

Si vous êtes intéressé dans le Get-Module cmdlet plus précisément, découvrez (Get-FormatData -TypeName System.Management.Automation.PSModuleInfo).FormatViewDefinition. Vous verrez quelque chose comme ceci:

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

Cela signifie que tous les objets de ce type ont des instructions spéciales concernant la façon dont il convient de sortie de son objet. Dans ce cas, il comprend le regroupement de chemin d'accès et d'afficher les colonnes (ModuleType, Version, Nom, ExportedCommands). Powershell n'ont pas choisi d'afficher les propriétés par lui-même, il y a des instructions du type prédéfini sur les éléments à afficher.

Dans le cas de PSModuleInfo type, nous pouvons voir qu'il y a 3 vues personnalisées pour le type. Un pour la vue de la table (qui est la valeur par défaut affichée), l'un pour la liste et large, qui instruisent ce que pour montrer lorsque vous utilisez Format-List & Format-Wide.

À partir de MS doc

Le format d'affichage pour les objets retournés par les commandes (les applets de commande, les fonctions et les scripts) sont définies à l'aide de mise en forme les fichiers (format.ps1xml fichiers). Plusieurs de ces fichiers sont fournis par PowerShell pour définir le format d'affichage pour les objets retournés par PowerShell-commandes fournies, telles que le Système.Diagnostics.Processus l'objet retourné par la cmdlet Get-Process. Cependant, vous pouvez également créer vos propres fichiers de mise en forme pour remplacer la valeur par défaut les formats d'affichage ou vous pouvez écrire une mise en forme personnalisée fichier à définir l'affichage des objets retournés par vos propres commandes.

PowerShell utilise les données de ces fichiers de mise en forme afin de déterminer ce qui est affiché et comment les données affichées est formaté. L'affiche les données peuvent inclure les propriétés d'un objet ou la valeur d'un script.

Vous pouvez créer vos propres fichiers (*.ps1xml) et de les inclure dans vos modules ou de les charger dans vos séances de modifier la façon dont la sortie est affichée.

Vous pouvez également ajouter une mise en forme à la sortie de vos fonctions par la définition d'un affichage par défaut de l'ensemble (aka quelles propriétés doit être affiché).

Par exemple, prenez cette fonction simple:


  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
  }

Sans affichage par défaut défini, vous devriez obtenir votre sortie standard avec toutes les propriétés énumérées.

enter image description here

Avec l'affichage par défaut ajouté, voici la nouvelle sortie.

enter image description here

Les deux sorties ne contient les mêmes informations, mais la console ont un formatage spécial est appliqué pour ne montrer que ce qui est le plus important, utile, etc...

Vous pouvez utiliser la mise en forme des vues de:

  • La colorisation de sortie
  • Créer des arbres
  • Changement de la sortie en fonction de la condition
  • Ajouter des propriétés virtuelles
  • définir la largeur de colonne
  • définir affiché titre de la colonne
  • etc...

Références:

Mise En Forme De Fichiers Aperçu

4Sysops - objet de mise en forme de la sortie en Powershell avec Format.ps1xml fichiers

Mise À Jour-FormatData

2021-11-24 00:29:40
1

La raison que Get-Module est de montrer le résultat dans les groupes est parce que c'est le format par défaut pour Module les objets chaque fois que PowerShell montre à l'utilisateur. Ce n'est pas une caractéristique spécifique de la Get-Module applet de commande en tant que tel.

C'est pratique en général parce que vous pouvez ensuite utiliser les applets de commande tels que Sort-Object et Where-Object de trier et de filtrer les résultats et ensuite les résultats dans des groupes par la suite.

Dans l'exemple suivant, les résultats sont filtrés, puis dans des groupes. La signification est que ni Get-Module ni Where-Object est conscient que le résultat final sera affiché dans les groupes; ils simplement de traiter avec les objets.

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

Vous pouvez voir ce que PowerShell est en train de faire dans ce cas précis par la recherche à la mise en forme par défaut de code pour les modules sur GitHub. La partie pertinente est l' GroupByScriptBlock appel (avec un mineur le reformatage de réduire la longueur de la ligne):

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)

        ...

Lorsque PowerShell montre un tableau d'objets de module à l'utilisateur en utilisant le format par défaut, il sera exécuté le bloc de script dans GroupByScriptBlock sur chaque objet pour travailler sur le groupement.

2021-11-23 21:29:07

Dans d'autres langues

Cette page est dans d'autres langues

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