Biçimlendirme, bir dizi öğeyi döndüren bir PowerShell işleviyle nasıl çalışır?


2

Bu küçük işlevi yazarsam:

function Foo {
    Get-Process | % { $_ } 
} 

Ve eğer kaçarsam

Foo

Yalnızca küçük bir özellik alt kümesi görüntüler:

PS C:\Users\Administrator> foo

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
     86      10     1680        412    31     0,02   5916 alg
    136      10     2772       2356    78     0,06   3684 atieclxx
    123       7     1780       1040    33     0,03    668 atiesrxx
...
...

Ancak yalnızca 8 sütun gösterilse bile, (gösterildiği gibi) birçok başka özellik vardır foo | gm.

Bu işlevin yalnızca bu 8 özelliği göstermesine neden olan nedir?

Aslında bir üçüncü parti. Net kütüphanesinden karmaşık nesneleri döndüren benzer bir işlev oluşturmaya çalışıyorum. Kütüphane, 2 seviyeli bir nesne hiyerarşisini düzleştiriyor:

function Actual {

    $someDotnetObject.ACollectionProperty.ASecondLevelCollection | % { $_ }

}

Bu yöntem, nesneleri liste biçiminde (özellik başına bir satır) atar.

Asıl nesneyi kullanılabilir kılmak için neyin görüntülendiğini nasıl kontrol edebilirim ?

Bunu denedim:

function Actual {

    $someDotnetObject.ACollectionProperty.ASecondLevelCollection | % { $_ } | format-table Property1, Property2

}

Konsolda beklenen tabloyu gösterir:

Property1  Property2
---------  ---------
     ValA       ValD
     ValB       ValE
     ValC       ValF

Ama eşyalarımı kaybettim. Get-MemberSonuç üzerinde çalışan gösterir:

   TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData

Name                                    MemberType Definition                                                                              
----                                    ---------- ----------                                                                              
Equals                                  Method     bool Equals(System.Object obj)                                                          
GetHashCode                             Method     int GetHashCode()                                                                       
GetType                                 Method     type GetType()                                                                          
ToString                                Method     string ToString()                                                                       
autosizeInfo                            Property   Microsoft.PowerShell.Commands.Internal.Format.AutosizeInfo autosizeInfo {get;set;}      
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   System.String ClassId2e4f51ef21dd47e99d3c952918aff9cd {get;}                            
groupingEntry                           Property   Microsoft.PowerShell.Commands.Internal.Format.GroupingEntry groupingEntry {get;set;}    
pageFooterEntry                         Property   Microsoft.PowerShell.Commands.Internal.Format.PageFooterEntry pageFooterEntry {get;set;}
pageHeaderEntry                         Property   Microsoft.PowerShell.Commands.Internal.Format.PageHeaderEntry pageHeaderEntry {get;set;}
shapeInfo                               Property   Microsoft.PowerShell.Commands.Internal.Format.ShapeInfo shapeInfo {get;set;}            


   TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData

Name                                    MemberType Definition                                                                          
----                                    ---------- ----------                                                                          
Equals                                  Method     bool Equals(System.Object obj)                                                      
GetHashCode                             Method     int GetHashCode()                                                                   
GetType                                 Method     type GetType()                                                                      
ToString                                Method     string ToString()                                                                   
ClassId2e4f51ef21dd47e99d3c952918aff9cd Property   System.String ClassId2e4f51ef21dd47e99d3c952918aff9cd {get;}                        
groupingEntry                           Property   Microsoft.PowerShell.Commands.Internal.Format.GroupingEntry groupingEntry {get;set;}
shapeInfo                               Property   Microsoft.PowerShell.Commands.Internal.Format.ShapeInfo shapeInfo {get;set;}        

2. seviyedeki alt nesne üyelerini göstermek yerine. Bu durumda, sonucu bu tür bir argüman için bekleyen fonksiyonlara yönlendiremiyorum.

Powershell'in bu senaryoyu nasıl ele alması gerekiyor?

Yanıtlar:


1

Bu aslında format dosyaları tarafından kontrol edilir. Powershell'den help about_Format.ps1xml:

Windows PowerShell'deki Format.ps1xml dosyaları, Windows PowerShell'deki nesnelerin varsayılan görüntüsünü tanımlar. Nesnelerin görüntüsünü değiştirmek veya Windows PowerShell'de oluşturduğunuz yeni nesne türleri için varsayılan ekranları tanımlamak için kendi Format.ps1xml dosyalarınızı oluşturabilirsiniz.

Windows PowerShell bir nesneyi görüntülediğinde, nesnenin varsayılan görüntüsünü belirlemek için verileri yapılandırılmış biçimlendirme dosyalarında kullanır. Biçimlendirme dosyalarındaki veriler, nesnenin bir tabloda mı yoksa listede mi oluşturulacağını belirler ve hangi özelliklerin varsayılan olarak görüntüleneceğini belirler.

Biçimlendirme yalnızca ekranı etkiler. Hangi nesne özelliklerinin boru hattından geçildiğini veya bunların nasıl iletildiğini etkilemez.

İçin, örneğin, uygun olarak get-processgeri döner System.Diagnostics.Processtanımlanmıştır (çıkış biçimi), DotNetTypes.format.ps1xml:

    <Name>process</Name>
    <ViewSelectedBy>
        <TypeName>System.Diagnostics.Process</TypeName>
    </ViewSelectedBy>
    <TableControl>
        <TableHeaders>
            <TableColumnHeader>
                <Label>Handles</Label>
                <Width>7</Width>
                <Alignment>right</Alignment>
            </TableColumnHeader>
            <TableColumnHeader>
                <Label>NPM(K)</Label>
                <Width>7</Width>
                <Alignment>right</Alignment>
            </TableColumnHeader>
(output omitted)

Bu dosyalar ile biraz oynamak zorunda kalacağım. Bu çözüm gibi görünüyor. Yakında rapor edeceğim.
Steve B

Bu aslında işe yaradı. Tek eksik kısım, çıktı sütunlarının otomatik olarak boyutlandırılmasıdır. Format-Table -AutosizeBu dosyada kurulabilecek herhangi bir eşdeğer var mı (bu süper kullanıcı için yeni bir soru olabilir)?
Steve B

1
Burada belirtilen şekilde <AutoSize /> yöntemini deneyebilirsiniz: msdn.microsoft.com/en-us/library/windows/desktop/… . Bunlar: blogs.msdn.com/b/powershell/archive/2006/04/30/… ve blogs.msdn.com/b/powershell/archive/2006/06/21/… de pek çok yararlı bilgi içerir
wmz

Onu özledim. Çok teşekkürler, bugün pek çok yararlı şey öğrendim :)
Steve B

0

Böyle bir şey dene:

... | ForEach-Object {
  Write-Host $_.Something
  $_
}

$_Kod bloğu içindeki iz , nesneyi iletir.


Bu iki katına çıktı mı? Hem özellik hem de nesnenin kendisi?
Steve B

$foo = ... | % { Write-Host $_.Something; $_ }Veya deneyin ... | % { Write-Host $_.Something; $_ } > output.txt. Her Write-Hostzaman çıktısı doğrudan ana bilgisayara gider, daha fazla işlenmez.
Ansgar Wiechers,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.