"राइट-होस्ट", "राइट-आउटपुट", या "कंसोल" :: राइटलाइन "के बीच क्या अंतर है?


192

संदेशों को आउटपुट करने के विभिन्न तरीके हैं। के माध्यम से , या Write-Host, कुछ के आउटपुट के बीच प्रभावी अंतर क्या है ?Write-Output[console]::WriteLine

मैं यह भी नोटिस करता हूं कि अगर मैं उपयोग करता हूं:

write-host "count=" + $count

+उत्पादन में शामिल हो जाता है। यही कारण है कि? क्या अभिव्यक्ति का मूल्यांकन एकल संघटित स्ट्रिंग के निर्माण के लिए नहीं किया जाना चाहिए, इससे पहले कि वह लिखी जाए?


4
Write-Outputजब आप परिणाम उत्सर्जित कर रहे हैं। Write-Hostजब आप लॉगिंग जानकारी उत्सर्जित कर रहे हों। कभी उपयोग न करें [console]::writeline()
जॉन

2
@ जॉन को हमें कभी भी [कंसोल] :: रिटलाइन () का उपयोग क्यों नहीं करना चाहिए?
डेविड क्लेम्फनर

3
@Backwards_Dave क्योंकि आपके पास राइट-होस्ट है .... ठीक है, मुझे कुछ आभास हो सकता है कि इसने एक नई कंसोल विंडो दिखाई (यह काफी समय पहले थी)। ऐसा नहीं होता है, लेकिन तथ्य यह है कि यह शक्तियां मुहावरा नहीं है और आपके साथ ऐसा कुछ भी नहीं हो सकता है [console]::writeline("hello world")जो आप नहीं कर सकते Write-Host "hello world"। एक और, बेहतर, हाल ही में लागू उत्तर है कि write-hostरैप्स write-informationइसलिए इसका डेटा एक स्ट्रीम पर डाला जाता है जैसे write-errorआप इसे कैप्चर कर सकते हैं और इसे कहीं और उपयोग कर सकते हैं। [console]::writeline()ऐसा नहीं करता है
JohnL

जवाबों:


267

Write-Outputजब आप पाइप लाइन पर डेटा भेजना चाहते हैं, तो इसका उपयोग किया जाना चाहिए, लेकिन जरूरी नहीं कि इसे स्क्रीन पर प्रदर्शित किया जाए। पाइप लाइन अंततः इसे लिखेगा out-defaultयदि कोई और पहले इसका उपयोग नहीं करता है।

Write-Host जब आप विपरीत करना चाहते हैं तो इसका उपयोग किया जाना चाहिए।

[console]::WriteLineअनिवार्य रूप Write-Hostसे पर्दे के पीछे क्या कर रहा है।

इस प्रदर्शन कोड को चलाएं और परिणाम की जांच करें।

function Test-Output {
    Write-Output "Hello World"
}

function Test-Output2 {
    Write-Host "Hello World" -foreground Green
}

function Receive-Output {
    process { Write-Host $_ -foreground Yellow }
}

#Output piped to another function, not displayed in first.
Test-Output | Receive-Output

#Output not piped to 2nd function, only displayed in first.
Test-Output2 | Receive-Output 

#Pipeline sends to Out-Default at the end.
Test-Output 

आपको कोष्ठक में संघटन संचालन को शामिल करने की आवश्यकता होगी, ताकि पॉवरशेल के लिए पैरामीटर सूची को टोकने से पहले संघनन प्रक्रिया हो Write-Hostया स्ट्रिंग प्रक्षेप का उपयोग करें

write-host ("count=" + $count)
# or
write-host "count=$count"

BTW - जेफरी स्नोवर का यह वीडियो देखें कि कैसे पाइपलाइन काम करता है। जब मैंने पॉवरशेल सीखना शुरू किया तो मैंने पाया कि यह सबसे उपयोगी स्पष्टीकरण है कि पाइपलाइन कैसे काम करती है।


एक Azure WebJob [कंसोल] में: :: WriteLine काम करता है, लेकिन राइट-होस्ट परिणाम में त्रुटि होगी: Win32 आंतरिक त्रुटि "हैंडल अमान्य है" 0x6 कंसोल आउटपुट बफर के लिए वर्ण विशेषताएँ सेट करते समय हुआ। मुझसे मत पूछो क्यों।
गिल रोइतो

अगर मैं गलत हूं तो मुझे सुधारें, लेकिन मेरा मानना Write-Outputहै कि यदि आप एक PsObject है तो आप डिफ़ॉल्ट हैं और आप बस इसे स्क्रीन पर थूक देते हैं ऐसा करने से $objectयह वास्तव में ऐसा ही करेगा Write-Output $object। गौर करने लायक हो सकता है
कोलोब कैन्यन

1
नया मार्गदर्शन है: Write-Outputजब संभव हो उपयोग करने से बचें । देखें github.com/PoshCode/PowerShellP PracticeAndStyle/issues/… > निष्पादन समाप्त करने के बाद ही वापसी का उपयोग करें। > लिखने-आउटपुट (...) से बचें। इसके बजाय, जब आप आउटपुट को स्पष्ट करना चाहते हैं, तो बस प्रासंगिक रूप से नामित चर के लिए आउटपुट असाइन करें। और स्पष्ट आउटपुट को संकेत देने के लिए उस चर को एक लाइन पर रख दिया। > राइट-आउटपुट -NoEnumerate PowerShell 6 पर टूट गया है और 16 महीने या उससे अधिक समय से है - इसे ठीक करने की कोई योजना नहीं है। सारांश में:> लिखें-आउटपुट का उपयोग न करें - कभी नहीं।
जीरोन विर्ट प्लिमर्स

28

एंडी ने जो उल्लेख किया है उसके अलावा, एक और अंतर है जो महत्वपूर्ण हो सकता है - राइट-होस्ट सीधे मेजबान को लिखता है और कुछ भी नहीं लौटाता है, जिसका अर्थ है कि आप आउटपुट को रीडायरेक्ट नहीं कर सकते हैं, उदाहरण के लिए, फ़ाइल में।

---- script a.ps1 ----
write-host "hello"

अब PowerShell में चलाएं:

PS> .\a.ps1 > someFile.txt
hello
PS> type someFile.txt
PS>

जैसा कि देखा गया है, आप उन्हें किसी फ़ाइल में पुनर्निर्देशित नहीं कर सकते। यह शायद उन लोगों के लिए आश्चर्य की बात है जो सावधान नहीं हैं।

लेकिन अगर इसके बजाय लिखने-आउटपुट का उपयोग करने के लिए स्विच किया जाता है, तो आपको उम्मीद के मुताबिक पुनर्निर्देशन काम करना होगा।


अगर आप Start-Process Powershell। \ A.ps1 -RedirectStandardOutput somefile.txt का उपयोग करते हैं, तो एन्कोडिंग के साथ परेशानी होती है, हालाँकि यह फाइल-सिस्टम आउटपुट को कैप्चर करना संभव है। हालांकि, फाइल (SystemDefaultEncoding में होगी)।
एमकेस्पर 10

16

यहाँ लिखें-आउटपुट के समकक्ष पूरा करने का एक और तरीका है। बस अपना स्ट्रिंग उद्धरणों में रखें:

"count=$count"

आप यह सुनिश्चित कर सकते हैं कि इस प्रयोग को चलाकर लिखो-आउटपुट के समान काम करें:

"blah blah" > out.txt

Write-Output "blah blah" > out.txt

Write-Host "blah blah" > out.txt

पहले दो आउट करने के लिए "ब्ला ब्ला" का उत्पादन करेंगे। लेकिन तीसरा नहीं होगा।

"हेल्प राइट-आउटपुट" इस व्यवहार का संकेत देता है:

इस cmdlet का उपयोग आमतौर पर स्क्रिप्ट में कंसोल पर स्ट्रिंग्स और अन्य ऑब्जेक्ट्स को प्रदर्शित करने के लिए किया जाता है। हालाँकि, क्योंकि डिफ़ॉल्ट व्यवहार एक पाइपलाइन के अंत में वस्तुओं को प्रदर्शित करने के लिए है, यह आमतौर पर cmdlet का उपयोग करने के लिए आवश्यक नहीं है।

इस मामले में, स्ट्रिंग स्वयं "गणना = $ गिनती" एक पाइपलाइन के अंत में वस्तु है, और प्रदर्शित की जाती है।


6

के उपयोगों के लिए Write-Host, PSScriptAnalyzerनैदानिक निम्नलिखित का उत्पादन:

उपयोग करने से बचें Write-Hostक्योंकि यह सभी होस्टों में काम नहीं कर सकता है, जब कोई मेजबान नहीं है, तो काम नहीं करता है और (पीएस 5.0 से पहले) को दबाया नहीं जा सकता है, पकड़ा या पुनर्निर्देशित नहीं किया जा सकता है। इसके बजाय, उपयोग Write-Output, Write-Verboseया Write-Information

अधिक जानकारी के लिए उस नियम के पीछे के दस्तावेज़ देखें । पोस्टर के लिए अंश:

Write-Hostजब तक Showक्रिया के साथ कमांड का उपयोग नहीं किया जाता है, तब तक इसका उपयोग बहुत हतोत्साहित किया जाता है । Showक्रिया स्पष्ट रूप से "स्क्रीन पर शो, कोई अन्य संभावनाओं के साथ" का अर्थ है।

Showक्रिया के साथ कमांड इस चेक लागू नहीं है।

जेफरी स्नोवर के पास एक ब्लॉग पोस्ट है, लिस्ट -होस्ट माना जाने वाला हानिकारक , जिसमें वह दावा करता है कि राइट-होस्ट लगभग हमेशा गलत काम करता है क्योंकि यह स्वचालन में हस्तक्षेप करता है और नैदानिक ​​के पीछे अधिक स्पष्टीकरण प्रदान करता है, हालांकि उपरोक्त एक अच्छा सारांश है।


3

मेरे परीक्षण से लिखें-आउटपुट और [कंसोल] :: राइटलाइन () राइट-होस्ट की तुलना में बहुत बेहतर प्रदर्शन करते हैं।

इस बात पर निर्भर करता है कि आपको कितना पाठ लिखना है, यह महत्वपूर्ण हो सकता है।

नीचे अगर 5 टेस्ट के परिणाम लिखें-होस्ट, राइट-आउटपुट और [कंसोल] :: राइटलाइन () के लिए।

अपने सीमित अनुभव में, मैंने पाया है कि किसी भी प्रकार के वास्तविक विश्व डेटा के साथ काम करते समय मुझे अपनी स्क्रिप्ट से कोई भी अच्छा प्रदर्शन प्राप्त करने के लिए cmdlets को छोड़ने और निचले स्तर के आदेशों के लिए सीधे जाने की आवश्यकता होती है।

measure-command {$count = 0; while ($count -lt 1000) { Write-Host "hello"; $count++ }}

1312ms
1651ms
1909ms
1685ms
1788ms


measure-command { $count = 0; while ($count -lt 1000) { Write-Output "hello"; $count++ }}

97ms
105ms
94ms
105ms
98ms


measure-command { $count = 0; while ($count -lt 1000) { [console]::WriteLine("hello"); $count++ }}

158ms
105ms
124ms
99ms
95ms

1
Write-Outputऔर Write-Hostविभिन्न उद्देश्यों की सेवा करते हैं, इसलिए उनके प्रदर्शन की तुलना करने का कोई मतलब नहीं है। हाँ, .NET प्रकारों और उनके तरीकों का प्रत्यक्ष उपयोग तेज़ है, लेकिन आप उच्च-स्तरीय सुविधाओं को याद करते हैं जो PowerShell cmdlets प्रदान कर सकती हैं। [Console]::WriteLine()जैसा है Write-Hostहाथ में मामले में, लेकिन सभी परिस्थितियों में काम नहीं करेगा, क्योंकि सभी PowerShell मेजबान हैं शान्ति
mklement0

0

[कंसोल] के बारे में :: राइटलाइन () - आपको इसका उपयोग करना चाहिए यदि आप सीएमडी में पाइपलाइनों का उपयोग करने जा रहे हैं (पावरशेल में नहीं)। कहते हैं कि आप अपने ps1 को stdout में बहुत अधिक डेटा स्ट्रीम करने के लिए चाहते हैं, और इसे उपभोग / बदलने के लिए कुछ अन्य उपयोगिता। यदि आप लिपि-होस्ट का उपयोग स्क्रिप्ट में करते हैं तो यह बहुत धीमा हो जाएगा।

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