Get-Module-ListAvailable: Modüller neden veya nasıl Dizine bölünmüş bölümlere yazdırılır?

0

Soru

"Get-Module-ListAvailable" yaptığımda, powershell 169 modül yazdırır. Örneğin:

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

Bunu bir dizide yakaladığımda: "$m = Get-Module-ListAvailable" Sadece basit bir dizi gibi görünüyor, ancak bu bölümlerde de yazdırılıyor.

Bu nasıl yapılır?

PSModuleInfo nesnelerinde bir "Dizin" özelliği bile yok gibi görünüyor.

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

En iyi cevabı

4

Powershell'in kendi biçimlendirme motoru vardır. Bu cmdlet'i her kullandığınızda, bir liste çıktısı alırsınız System.Management.Automation.PSModuleInfo nesne.

"Raw" nesnesini yazdırmadan önce, Powershell tür için önceden tanımlanmış bir biçimlendirme olup olmadığını kontrol edin ve eğer öyleyse uygulayın. Gördüğünüz şey bu dönüşümün sonucudur.

PS 5.1'e kadar bu,*. ps1xml dosyaları olarak tanımlanan yapılandırma dosyasını biçimlendirerek yapıldı. PS6.0 ve daha yenisinden, önceden tanımlanmış biçimler artık doğrudan kaynak koduna dahil edilmiştir, ancak yine de gerektiğinde ek biçim dosyaları oluşturabilirsiniz.

Yüklenen biçim türünü kullanarak görüntüleyebilirsiniz Get-FormatData cmdlet'i.

Eğer ilgileniyorsanız Get-Module özellikle cmdlet'i kontrol edin (Get-FormatData -TypeName System.Management.Automation.PSModuleInfo).FormatViewDefinition. Böyle bir şey göreceksin.:

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

Bu tür nesneleri nesne çıkış biçimi ile ilgili özel bir talimat var yani. Bu durumda, yola göre gruplandırmayı ve belirli sütunları (ModuleType, Version, Name, ExportedCommands) görüntülemeyi içerir. Powershell bu özellikleri kendi başına görüntülemeyi seçmedi, ne görüntüleneceğine ilişkin önceden tanımlanmış türden talimatlarını aldı.

Bu durumda PSModuleInfo tür, tür için 3 özel görünüm olduğunu görebiliriz. Biri tablo görünümü için (varsayılan olarak gösterilir), biri liste ve geniş için, kullandığınızda nelerin gösterileceğini bildirir Format-List & Format-Wide.

BAYAN doktor'dan

Komutlarla döndürülen nesneler için görüntüleme biçimi (cmdlet'ler, işlevler ve komut dosyaları) biçimlendirme kullanılarak tanımlanır dosyalar (format.ps1xml dosyaları). Bu dosyalardan bazıları tarafından sağlanmaktadır Tarafından döndürülen nesnelerin görüntü biçimini tanımlamak için PowerShell Sistem gibi PowerShell tarafından sağlanan komutlar.Tanı.Süreç get-Process cmdlet'i tarafından döndürülen nesne. Ancak, ayrıca varsayılanın üzerine yazmak için kendi özel biçimlendirme dosyalarınızı oluşturun görüntü biçimleri veya tanımlamak için özel bir biçimlendirme dosyası yazabilirsiniz kendi komutlarınız tarafından döndürülen nesnelerin görüntülenmesi.

PowerShell, neyi belirlemek için bu biçimlendirme dosyalarındaki verileri kullanır görüntülenir ve görüntülenen verilerin nasıl biçimlendirildiği. Görüntülenen veriler, bir nesnenin özelliklerini veya bir komut dosyasının değerini içerebilir.

Çıktı görüntülenme şeklini değiştirmek için kendi dosyalarınızı (*.ps1xml) oluşturabilir ve bunları modüllerinize ekleyebilir veya oturumlarınıza yükleyebilirsiniz.

Ayrıca, varsayılan bir görüntü kümesi tanımlayarak işlevlerinizin çıktısına biçimlendirme ekleyebilirsiniz (diğer bir deyişle hangi özelliklerin görüntülenmesi gerektiği).

Örneğin, bu basit işlevi ele alalım:


  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
  }

Herhangi bir varsayılan görüntü kümesi olmadan, listelenen tüm özelliklerle standart çıktıyı alırsınız.

enter image description here

Varsayılan görüntü kümesi eklendiğinde, işte yeni çıktı.

enter image description here

Her iki çıktı da aynı bilgileri içerir, ancak konsolun yalnızca en önemli, yararlı vb.Olanı göstermek için kendisine uygulanan özel bir biçimlendirmesi vardır...

Biçimlendirme görünümlerini aşağıdakiler için kullanabilirsiniz:

  • Çıktıyı renklendir
  • Ağaçlar oluştur
  • Çıktıyı duruma göre değiştirin
  • Sanal özellikler ekleme
  • sütun genişliğini tanımla
  • görüntülenen sütun başlığını tanımla
  • vb...

Başvuru:

Biçimlendirme Dosyasına Genel Bakış

4Sysops-Powershell'de nesne çıktısını Format. ps1xml dosyalarıyla biçimlendirme

Güncelleme-FormatData

2021-11-24 00:29:40
1

Bunun nedeni Get-Module sonucun gruplar halinde gösterilmesi, bunun için varsayılan biçim olması nedeniyledir Module PowerShell bunları kullanıcıya her gösterdiğinde nesneler. Bu belirli bir özellik değil Get-Module cmdlet gibi.

Bu genel olarak uygun bir tesistir, çünkü daha sonra aşağıdaki gibi cmdlet'leri kullanabilirsiniz Sort-Object ve Where-Object sonuçları sıralamak ve filtrelemek ve daha sonra sonuçları gruplar halinde göstermek için.

Aşağıdaki örnekte, sonuçlar filtrelenir ve sonra gruplar halinde gösterilir. Önemli olan, ikisinin de Get-Module ne Where-Object nihai sonucun gruplar halinde gösterileceğinin farkındadır; sadece nesnelerle ilgilenirler.

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

Github'daki modüller için varsayılan biçimlendirme koduna bakarak Powershell'in bu özel durumda ne yaptığını görebilirsiniz. İlgili kısım GroupByScriptBlock çağrı (hat uzunluğunu azaltmak için küçük yeniden biçimlendirme ile):

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)

        ...

PowerShell, varsayılan biçimi kullanarak kullanıcıya bir dizi modül nesnesi gösterdiğinde, komut dosyası bloğunu şu şekilde çalıştırır: GroupByScriptBlock her nesne üzerinde önce gruplama çalışması gerekir.

2021-11-23 21:29:07

Diğer dillerde

Bu sayfa diğer dillerde

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