2013-08-02 7 views
5

1.ps1 में 2 ऑब्जेक्ट्स बनाए और मुद्रित हैं। लेकिन आउटपुट में केवल एक ही दिखाया गया है। दोनों वस्तुओं निम्नलिखित मामलों में दिखाई देते हैं:
(1) लिखने-आउटपुट स्वरूप-सूची
(2) object1 4 से अधिक गुण है (और इसलिए यह खड़ी स्वचालित रूप से स्वरूपित हो जाता है)
साथ किया जाता है समझने की कोशिश कर इस व्यवहार के पीछे तर्क।पावरशेल लिखने-आउटपुट अनुपलब्ध जानकारी - प्रिंट केवल प्रथम ऑब्जेक्ट

PS C:\> cat .\1.ps1 
$object1 = New-Object PSObject 
$object1 | add-member NoteProperty -name pn1 -value pv1 
$object1 | add-member NoteProperty -name pn2 -value pv2 
$object1 | add-member NoteProperty -name pn3 -value pv3 
write-output $object1 

$object2 = New-Object PSObject 
$object2 | add-member NoteProperty -name npn1 -value npv1 
$object2 | add-member NoteProperty -name npn2 -value npv2 
$object2 | add-member NoteProperty -name npn3 -value npv3 
$object2 | add-member NoteProperty -name npn4 -value npv4 
$object2 | add-member NoteProperty -name npn5 -value npv5 
$object2 | add-member NoteProperty -name npn6 -value npv6 
write-output $object2 
PS C:\> 
PS C:\> .\1.ps1 

pn1          pn2          pn3 
---          ---          --- 
pv1          pv2          pv3 


PS C:\> 
+0

आप क्या देखना चाहते हैं? –

+0

@StanleyDeBoer दूसरी वस्तु, जाहिर है। –

+0

मुझे यह मिलता है, 'प्रारूप-तालिका' में कॉलम बदलने के लिए मुझे यह स्पष्ट नहीं है कि यह बदलना उचित है। –

उत्तर

2

यदि आप केवल जानकारी प्रदर्शित करने की कोशिश कर रहे हैं, तो आपको Write-Output के बजाय Write-Host का उपयोग करना चाहिए। जब आप पाइपलाइन में डेटा भेज रहे हों तो आप Write-Output का उपयोग करना चाहते हैं, और डेटा को बस प्रदर्शित करने के लिए उपयोग नहीं किया जाना चाहिए। ,

लिखें-आउटपुट इस्तेमाल किया जाना चाहिए जब आप पाइप लाइन में पर डेटा भेजने के लिए चाहते हैं: Which should I use: "Write-Host", "Write-Output", or "[console]::WriteLine"?

लिंक से:

यहाँ एक पोस्ट है कि एक अधिक गहराई से उत्तर प्राप्त होता है लेकिन यह स्क्रीन पर इसे प्रदर्शित नहीं करना चाहते हैं। पाइपलाइन अंततः इसे डिफ़ॉल्ट रूप से लिख देगी यदि कुछ भी पहले इसका उपयोग नहीं करता है। जब आप विपरीत करना चाहते हैं तो लिखें-होस्ट का उपयोग किया जाना चाहिए। [कंसोल] :: WriteLine अनिवार्य रूप से क्या है- दृश्य-दृश्य दृश्यों के पीछे क्या कर रहा है।

+0

हां लिखता है, जो व्यवहार को बताता है। खैर, असली उपयोग केस जिसमें मुझे इस स्थिति का सामना करना पड़ा - हमें वास्तव में इसे पाइपलाइन की आवश्यकता है, ताकि अन्य cmdlets पाइपलाइन को पारित वस्तु के प्रोप/मानों का उपयोग कर सकें। मेरी राय में, लेखन-होस्ट में आउटपुट स्वरूपण ग्राहकों के परिप्रेक्ष्य से दृष्टि से प्रसन्न नहीं है। – v2b

+0

आप इसे अभी भी अधिक आकर्षक दृष्टि से बनाने के लिए 'लिखें-होस्ट' प्रारूपित कर सकते हैं :) – BlackHatSamurai

2

मैं इस व्यवहार की व्याख्या नहीं कर सकते, लेकिन आप पहले उत्पादन के लिए एक स्पष्ट फ़ॉर्मेटर का उपयोग कर, जैसे द्वारा यह कम कर सकते हैं: स्पष्ट प्रारूपण के बिना PowerShell याद है की तरह एक परोक्ष लागू किया

Write-Output $object1 | Format-Table 

ऐसा लगता है तालिका प्रारूप और आउटपुट को छोड़ देता है जो इस प्रारूप से मेल नहीं खाता है। उदाहरण के लिए, आप स्क्रिप्ट के अंत में एक और Write-Output $object1 जोड़ते हैं:

$object1 = New-Object PSObject 
... 
write-output $object1 

$object2 = New-Object PSObject 
... 
write-output $object2 
write-output $object1

आप इस उत्पादन प्राप्त होगा:

PS C:\> .\test.ps1 

pn1         pn2         pn3 
---         ---         --- 
pv1         pv2         pv3 

pv1         pv2         pv3

Wat?!

O_o ​​क्यों किसी को भी विचार किया जाएगा यह एक अच्छा विचार है मेरे पार।

+0

हां, जैसा कि मैंने अपने मूल प्रश्न में उल्लेख किया था, प्रारूप-सूची काम करता है। बस समझना चाहता था कि क्यों कंसोल को लिखना इतना कठिन है। यदि अगले ऑब्जेक्ट में समान प्रो नाम नहीं पाए जाते हैं, तो उन्होंने दूसरी ऑब्जेक्ट की गुणों को मुद्रित क्यों नहीं किया, मूल्य भी? – v2b

+0

शायद क्योंकि यह पहली वस्तु की तुलना में गुणों का एक अलग सेट है। यदि आप गुणों के उसी सेट के साथ 'ऑब्जेक्ट 1' (यानी समान नाम, लेकिन अलग-अलग मान) के रूप में एक और ऑब्जेक्ट बनाते हैं, तो यह ठीक दिखाया जाएगा। –

+0

क्या यह ऑब्जेक्ट को पूरी तरह से छोड़ने का औचित्य देता है? आदर्श रूप में मैंने ओबी 1 के प्रोप/वैल मुद्रित होने की उम्मीद की होगी .. इसके बाद ओबीजे 2 के प्रोप/वैल .. और obj1 की गुणों के साथ ओबीजे 2 को कोशिश न करें। क्योंकि वे सिर्फ मेल नहीं खाते हैं - इसलिए यह एक अलग वस्तु है। – v2b

2

मुझे लगता है कि इसे Format-Table कार्यों के साथ करना है। मुझे लगता है कि डिफ़ॉल्ट रूप से PowerShell कंसोल पर ऑब्जेक्ट्स प्रदर्शित करने के लिए Format-Table या Format-List चुन देगा, मुझे यकीन नहीं है कि निर्णय कैसे बनाया जाता है लेकिन स्पष्ट रूप से Format-Table चुना गया था।

Format-Table पहली वस्तु लेने और उस से गुणों को चुनकर काम करता है। किसी भी ऑब्जेक्ट के लिए जो पहले व्यक्ति का पालन करता है, यह केवल पहले ऑब्जेक्ट से गुणों के लिए स्तंभों को पॉप्युलेट करेगा।

आप

.\1.ps1 | % { $_ | ft } 

कोशिश करने के लिए और देखते हैं कि हो तुम हो कि आप क्या देख रहे हैं चाहते हो सकता है।

+0

<5 गुण, यह स्वरूप-तालिका का उपयोग करता है। के लिए> 5 प्रारूप-सूची का उपयोग किया जाता है। लेकिन मुझे आश्चर्य है, वे इतने गूंगा क्यों होंगे कि यह पता लगाने के लिए कि पहले और दूसरे लेखन-आउटपुट में अलग-अलग गुण_नाम हैं - इसलिए वे विभिन्न प्रकार की वस्तुओं को/कर सकते हैं। – v2b

+0

क्योंकि अधिकांश समय एक समय में एक प्रकार की आउटपुट ऑब्जेक्ट्स को आदेश देता है (मैं किसी भी अंतर्निहित कमांड के बारे में नहीं सोच सकता जो एक समय में एक से अधिक प्रकार की ऑब्जेक्ट आउटपुट करता है), तो आप किनारे के मामले के बारे में बात कर रहे हैं। एज मामलों को अक्सर अलग-अलग संभाला जाता है, तो आप बस उम्मीद कर सकते हैं क्योंकि एक स्थिति में सही व्यवहार दूसरे में गलत व्यवहार हो सकता है। –

+0

आह !! - हो सकता है कि वे स्क्रिप्ट से चलते समय स्वरूपण को मिश्रित न करें। तो यहां, ऑब्जेक्ट 1 डिफ़ॉल्ट रूप से स्वरूप-तालिका (<5 प्रोप) होगा, लेकिन ऑब्जेक्ट 2 प्रारूप-सूची (> 5 प्रोप) होना चाहिए। यदि cmdlets खोल पर चलाए जाते हैं, तो यह 1 के लिए प्रारूप-तालिका है, और प्रारूप 2 के लिए प्रारूप-सूची है। मुझे एक स्क्रिप्ट से इसे चलाने के दौरान एक ही व्यवहार की उम्मीद है – v2b

संबंधित मुद्दे