स्वरूपण PowerShell फ़ंक्शन के साथ कैसे काम करता है जो तत्वों का एक सेट लौटाता है?


2

अगर मैं यह छोटा-सा कार्य लिखूं:

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

और अगर मैं दौड़ता हूं

Foo

यह केवल गुणों का एक छोटा सा उप-भाग प्रदर्शित करता है:

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

लेकिन अगर केवल 8 कॉलम दिखाए जाते हैं, तो भी बहुत सारे अन्य गुण हैं (जैसा foo | gmकि दिखा रहा है)।

इस फ़ंक्शन को केवल 8 गुण दिखाने के लिए क्या कारण है?

मैं वास्तव में एक समान फ़ंक्शन बनाने की कोशिश कर रहा हूं जो एक 3 पार्टी .Net लाइब्रेरी से जटिल वस्तुओं को वापस कर रहा है। पुस्तकालय वस्तुओं के 2 स्तरीय पदानुक्रम को समतल कर रहा है:

function Actual {

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

}

यह विधि ऑब्जेक्ट को सूची रूप (प्रति पंक्ति एक पंक्ति) में डंप कर रही है।

मैं वास्तविक वस्तु को उपलब्ध रखते हुए जो प्रदर्शित होता है, उसे कैसे नियंत्रित कर सकता हूं ?

मैंने यह कोशिश की है:

function Actual {

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

}

यह कंसोल में अपेक्षित तालिका दिखाता है:

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

लेकिन मैंने अपनी वस्तुओं को खो दिया। Get-Memberपरिणाम शो पर चल रहा है :

   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;}        

इसके बजाय दूसरे स्तर के बाल वस्तु सदस्यों को दिखाना। इस मामले में, मैं इस प्रकार के तर्क की प्रतीक्षा कर रहे कार्यों के परिणाम को पाइप नहीं कर सकता।

Powershell को ऐसे परिदृश्य को कैसे माना जाता है?

जवाबों:


1

यह वास्तव में प्रारूप फ़ाइलों द्वारा नियंत्रित किया जाता है। पावरशेल से help about_Format.ps1xml:

Windows PowerShell में Format.ps1xml फ़ाइलें Windows PowerShell में ऑब्जेक्ट्स के डिफ़ॉल्ट प्रदर्शन को परिभाषित करती हैं। आप ऑब्जेक्ट्स के प्रदर्शन को बदलने के लिए या Windows PowerShell में बनाए गए नए ऑब्जेक्ट प्रकारों के लिए डिफ़ॉल्ट डिस्प्ले को परिभाषित करने के लिए अपनी स्वयं की Format.ps1xml फाइलें बना सकते हैं।

जब Windows PowerShell एक ऑब्जेक्ट प्रदर्शित करता है, तो यह ऑब्जेक्ट के डिफ़ॉल्ट प्रदर्शन को निर्धारित करने के लिए संरचित स्वरूपण फ़ाइलों में डेटा का उपयोग करता है। स्वरूपण फ़ाइलों में डेटा निर्धारित करता है कि ऑब्जेक्ट तालिका में या किसी सूची में प्रदान किया गया है या नहीं, और यह निर्धारित करता है कि कौन से गुण डिफ़ॉल्ट रूप से प्रदर्शित होते हैं।

स्वरूपण केवल प्रदर्शन को प्रभावित करता है। यह प्रभावित नहीं करता है कि किस वस्तु के गुणकों को पाइप लाइन के नीचे से गुजारा जाता है या उन्हें कैसे पारित किया जाता है।

आपके उदाहरण के अनुसार, get-processरिटर्न System.Diagnostics.Process, जो (आउटपुट का प्रारूप) में परिभाषित किया गया है 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)

मुझे इस फ़ाइलों के साथ थोड़ा खेलना होगा। यह समाधान की तरह लग रहा है। जल्द ही रिपोर्ट करूंगा।
स्टीव बी

यह वास्तव में काम किया। एकमात्र गायब हिस्सा, आउटपुट कॉलम को स्वतः-आकार देने की क्षमता है। क्या Format-Table -Autosizeइस फाइल में कोई समकक्ष हो सकता है (यह सुपरयूज़र पर एक नया प्रश्न हो सकता है)?
स्टीव बी

1
आप यहां निर्दिष्ट किए गए <AutoSize /> का प्रयास कर सकते हैं: msdn.microsoft.com/en-us/library/windows/desktop/… । उन: blogs.msdn.com/b/powershell/archive/2006/04/30/... और blogs.msdn.com/b/powershell/archive/2006/06/21/... रूप में अच्छी तरह उपयोगी जानकारी का एक बहुत होते हैं
wmz 15

मैंने यह खो दिया। बहुत बहुत धन्यवाद, मैंने आज बहुत सारी उपयोगी चीजें सीखी हैं :)
स्टीव बी।

0

कुछ इस तरह की कोशिश करो:

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

$_कोड ब्लॉक के अंदर अनुगामी वस्तु गुजरती है।


क्या यह उत्पादन दोगुना नहीं होगा? संपत्ति और वस्तु दोनों ही?
स्टीव बी

कोशिश करो $foo = ... | % { Write-Host $_.Something; $_ }या ... | % { Write-Host $_.Something; $_ } > output.txtWrite-Hostहमेशा का आउटपुट सीधे होस्ट तक जाता है, इसे आगे प्रोसेस नहीं किया जाता है।
अंसार विचित्र 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.