Powershell में मुद्रण ऑब्जेक्ट गुण


120

इंटरएक्टिव कंसोल में काम करते समय अगर मैं एक नई वस्तु को परिभाषित करता हूं और कुछ संपत्ति मूल्यों को इस तरह से असाइन करता हूं:

$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"

तब जब मैं इंटरेक्टिव विंडो में अपने वैरिएबल का नाम टाइप करता हूं Powershell मुझे ऑब्जेक्ट प्रॉपर्टीज और वैल्यूज का सारांश देता है:

PS C:\demo> $obj
SomeProperty                                                                                                                                                                                  
------------                                                                                                                                                                                  
Test

मैं मूल रूप से यह सिर्फ एक स्क्रिप्ट में एक समारोह के भीतर से करना चाहते हैं। फ़ंक्शन एक ऑब्जेक्ट बनाता है और कुछ संपत्ति मान सेट करता है और मैं चाहता हूं कि लौटने से पहले पॉवर्सशेल विंडो में ऑब्जेक्ट मानों का सारांश प्रिंट करें। मैंने फंक्शन के भीतर राइट-होस्ट का उपयोग करने की कोशिश की:

Write-Host $obj

लेकिन यह सिर्फ वस्तु के प्रकार का उत्पादन करता है सारांश का नहीं:

System.Object

मैं अपने फ़ंक्शन को ऑब्जेक्ट के गुण मानों का सारांश Powershell window में कैसे दे सकता हूं?

जवाबों:


187

इसे इस्तेमाल करे:

Write-Host ($obj | Format-Table | Out-String)

या

Write-Host ($obj | Format-List | Out-String)

4
मुझे -Forceइसे काम करने के लिए पैरामीटर पास करना था , जैसेWrite-Host ($obj | Format-List -Force | Out-String)
बार्ट वेरकोइजेन

1
ओह! यह अभी भी स्क्रीन पर क्षैतिज रूप से प्रदर्शित होता है .... अगर कोई भी आउटपुट आपके बफर के बाहर जाता है तो यह बस डालता है ...। मुझे POSH से प्यार है
कोल्ब कैन्यन

का उपयोग करना $objs = @();और $objs = $objs + $obj; मैं उपयोग कर सकते हैं ConvertTo-Html: $ cols = $ objs | ConvertTo-Html -Fragment -Property नाम, डेटा टाइप, डिफ़ॉल्ट, पहचान, InPrimaryKey, IsForeignKey, विवरण;
किकेनेट


16

Powershell में ऑब्जेक्ट के गुणों और मूल्यों को प्रिंट करने के लिए। नीचे दिए गए उदाहरण मेरे लिए अच्छी तरह से काम करते हैं।

$ पूल = गेट-आइटम "IIS: \ AppPools.NET v4.5"

$ पूल | Get-सदस्य

   TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add

Name                        MemberType            Definition
----                        ----------            ----------
Recycle                     CodeMethod            void Recycle()
Start                       CodeMethod            void Start()
Stop                        CodeMethod            void Stop()
applicationPoolSid          CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
state                       CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
ClearLocalData              Method                void ClearLocalData()
Copy                        Method                void Copy(Microsoft.IIs.PowerShell.Framework.ConfigurationElement ...
Delete                      Method                void Delete()
...

$ पूल | Select-Object -Property * # आप ऑप्रेट कर सकते हैं

name                        : .NET v4.5
queueLength                 : 1000
autoStart                   : True
enable32BitAppOnWin64       : False
managedRuntimeVersion       : v4.0
managedRuntimeLoader        : webengine4.dll
enableConfigurationOverride : True
managedPipelineMode         : Integrated
CLRConfigFile               :
passAnonymousToken          : True
startMode                   : OnDemand
state                       : Started
applicationPoolSid          : S-1-5-82-271721585-897601226-2024613209-625570482-296978595
processModel                : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
...

1
इस के अंतिम संस्करण ने मेरे लिए सबसे अच्छा काम किया - यहां तक ​​कि इसे छोटा कर सकता है $x | select *, इंटरैक्टिव के लिए महान।
डुअल

मुझे नहीं लगता कि अगर यह स्क्रिप्ट में रखना चाहता है तो यह काम करता है। यदि ऐसा है, तो मुझे लगता है कि आपको कुछ अतिरिक्त करना होगा कि वास्तव में इसे कंसोल पर प्रिंट करने के लिए क्या कहा गया है (यानी: लिखो-आउटपुट <कुछ-कुछ>)
फ्रैक्टल

11

टिप # 1

कभी भी Write-Host का उपयोग न करें।

टिप # 12

PowerShell cmdlet या फ़ंक्शन से जानकारी को आउटपुट करने का सही तरीका एक ऑब्जेक्ट बनाना है जिसमें आपका डेटा होता है, और फिर राइट-आउटपुट का उपयोग करके उस ऑब्जेक्ट को पाइपलाइन में लिखना है।

-डॉन जोन्स: पॉवरशेल मास्टर

आदर्श रूप से आपकी लिपि आपकी वस्तुओं ( $obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}) का निर्माण करेगी, फिर बस a Write-Output $objects। आप आउटपुट को पाइप करेंगे Format-Table

PS C:\> Run-MyScript.ps1 | Format-Table

वे वास्तव में PowerShell PowerObjectandPipingShell को कॉल करें।


4
धन्यवाद Bob, मैंने mjolinor के उत्तर को स्वीकार कर लिया है क्योंकि मुझे लगता है कि यह प्रश्न का अधिक सीधे उत्तर देता है, हालांकि मैंने आपके द्वारा दिए गए लिंक से बहुत कुछ सीखा है और इस बात से सहमत हूं कि ज्यादातर मामलों में राइट-होस्ट उपयुक्त नहीं है। धन्यवाद!
जॉन

1
वही तकनीक काम करेगी, और संभवतः राइट-वर्बोज़ या राइट-डीबग के साथ अधिक उपयुक्त होगी।
mjolinor

4
मुझे पता है, मुझे कई साल हो गए, लेकिन मैं Never use Write-Host.बयान से असहमत हूं । आप डेटा वापस करने वाले फ़ंक्शन के अंदर Write-Output का उपयोग नहीं कर सकते, क्योंकि यह इस फ़ंक्शन को "प्रदूषित" करेगा। सरल उदाहरण है। लगता है कि ReturnText फ़ंक्शन क्या आउटपुट देगा? यही कारण है कि मैं हमेशा फ़ंक्शन के अंदर राइट-होस्ट का उपयोग करता हूं। फ़ंक्शन रिटर्नटेक्स्ट () {लिखें-आउटपुट "कुछ यादृच्छिक संदेश" वापसी "मैं क्या वापस करना चाहता हूं"}
डेनिस मोलोड्सोव

3
@DenisMolodtsov मैं पूरी तरह से सहमत हूँ। जानकारी लॉग-इन करने के उद्देश्य से राइट-आउटपुट का उपयोग तब तक किया जाना चाहिए जब तक कि फ़ंक्शन तुच्छ न हो। एक बार जब कई फ़ंक्शन स्तर होते हैं और आपको आउटपुट वापस करने की आवश्यकता होती है, तो आपको कुछ और उपयोग करना होगा, और राइट-होस्ट बिल को पूरा करता है।
रोबग

2
राइट-होस्ट भी एक दूरस्थ सत्र से तुरंत वापस आ जाएगा, जिससे आप प्रगति देख सकते हैं, और यदि कोई दूरस्थ सत्र त्रुटि को लिखता है, तो राइट-आउटपुट जानकारी खो जाती है।
RobG

3

कुछ सामान्य नोट्स।


$obj | Select-Object $obj | Select-Object -Property *

उत्तरार्द्ध सभी गैर-आंतरिक, गैर-संकलक-उत्पन्न गुण दिखाएगा । पूर्व सभी संपत्ति प्रकारों को नहीं दिखाता (हमेशा) मेरे परीक्षणों में, यह लगातार प्रदर्शित होता है, हालांकि - यहाँ कोई गारंटी नहीं है)।CodeProperty MemberType


गेट-मेंबर के लिए जागरूक होने के लिए कुछ स्विच

  • Get-Memberकरता नहीं डिफ़ॉल्ट रूप से स्थिर सदस्यों मिलता है। आप गैर-स्थैतिक सदस्यों के साथ उन्हें (सीधे) प्राप्त नहीं कर सकते । यही है, स्विच के उपयोग से केवल स्थिर सदस्यों को लौटाया जाता है:

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name        MemberType Definition
    ----        ---------- ----------
    Equals      Method     static bool Equals(System.Object objA, System.Object objB)
    ...
  • का प्रयोग करें -Force

    Get-Memberआदेश का उपयोग करता फोर्स प्रदर्शन के लिए आंतरिक सदस्यों और वस्तुओं के संकलक उत्पन्न सदस्य जोड़ने के लिए पैरामीटर। Get-Memberइन सदस्यों को मिल जाता है, लेकिन यह उन्हें डिफ़ॉल्ट रूप से छुपाता है।

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name          MemberType     Definition
    ----          ----------     ----------
    ...
    pstypenames   CodeProperty   System.Collections.ObjectModel.Collection...
    psadapted     MemberSet      psadapted {AccessRightType, AccessRuleType,...
    ...

ConvertTo-Jsonगहराई और पठनीय "क्रमांकन" के लिए उपयोग करें

मैं JSON ( इसके बजाय उपयोग ) का उपयोग करके वस्तुओं को बचाने की सिफारिश करना आवश्यक नहीं है Export-Clixml। हालाँकि, आप इससे अधिक या कम पठनीय आउटपुट प्राप्त कर सकते हैं ConvertTo-Json, जो आपको गहराई निर्दिष्ट करने की भी अनुमति देता है।

ध्यान दें कि Depthतात्पर्य निर्दिष्ट नहीं है-Depth 2

PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
    "AllowSystemOverload":  true,
    "AllowLifeToGetInTheWay":  false,
    "CantAnyMore": true,
    "LastResortOnly": true,
...

और अगर आप इसे पढ़ने की योजना नहीं बना रहे हैं तो आप इसे कर सकते -Compressहैं (यानी स्ट्रिप व्हाट्सएप)

PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress

-InputObjectयदि आप कर सकते हैं और उपयोग करें (तैयार हैं)

PowerShell का उपयोग करते समय 99.9%: या तो प्रदर्शन कोई फर्क नहीं पड़ेगा, या आप प्रदर्शन के बारे में परवाह नहीं करते हैं। हालांकि , यह ध्यान दिया जाना चाहिए कि पाइप से बचने के लिए जब आपको इसकी आवश्यकता नहीं होती है तो कुछ ओवरहेड को बचा सकता है और कुछ गति जोड़ सकता है (पाइपिंग, सामान्य रूप से, सुपर-कुशल नहीं है)।

यानी, यदि आप सभी के पास $objमुद्रण के लिए एक ही काम है (और कभी-कभी टाइप करने के लिए मेरी तरह आलसी नहीं हैं -InputObject):

# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj

इसके लिए चेतावनी Get-Member -InputObject: यदि $ obj एक संग्रह है (उदाहरण के लिए System.Object[]), तो आप अंत में संग्रह वस्तु के बारे में जानकारी प्राप्त कर रहे हैं:

PS Y:\Power> gm -InputObject $obj,$obj2
   TypeName: System.Object[]

Name        MemberType            Definition
----        ----------            ----------
Count       AliasProperty         Count = Length
...

यदि आप संग्रह में Get-Memberप्रत्येक के लिए चाहते हैं TypeName(प्रत्येक के लिए एनबी TypeName, प्रत्येक वस्तु के लिए नहीं - सभी के साथ एन वस्तुओं का एक संग्रह TypeNameकेवल उसके लिए 1 तालिका प्रिंट करेगा TypeName, प्रत्येक वस्तु के लिए एन टेबल नहीं) ...... बस इसे सीधे में पाइपिंग के साथ रखें।


1

नीचे मेरे लिए वास्तव में अच्छा काम किया। मैंने उपरोक्त सभी उत्तरों को एक साथ पैच किया और निम्नलिखित लिंक में ऑब्जेक्ट गुण प्रदर्शित करने के बारे में पढ़ा और प्रिंटिंग ऑब्जेक्ट्स के बारे में नीचे दिए गए संक्षिप्त विवरण के साथ आया

निम्न पाठ को print_object.ps1 नामक फ़ाइल में जोड़ें:

$date = New-Object System.DateTime
Write-Output $date | Get-Member
Write-Output $date | Select-Object -Property *

खुली शक्तियां कमांड प्रॉम्प्ट, उस फ़ाइल में मौजूद डायरेक्टरी पर जाएं और निम्नलिखित टाइप करें:

powershell -ExecutionPolicy ByPass -File is_port_in_use.ps1 -Elevated

जिस भी वस्तु को आप प्रिंट करना चाहते हैं, उसके साथ बस 'System.DateTime' को स्थानापन्न करें। यदि वस्तु अशक्त है, तो कुछ भी प्रिंट नहीं होगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.