2011-05-27 20 views
13

में नई लाइन से बचें, मैं अपनी स्क्रिप्ट से लॉग फ़ाइल में सभी आउटपुट एकत्र करना चाहता हूं और लिखने-होस्ट के इंस्टॉलेशन लिखने के लिए उपयोग करना चाहिए।लेखन-आउटपुट

Write-Output "Server:" $a

Server:
foo
तरह दिखता है।

मैं एक जवाब शुरू मैं वास्तव में
write-output $("sfdghk:" + $a) पाने के लिए Server:Foo

धन्यवाद -jt

+8

'राईट-आउटपुट" सर्वर: $ एक "' –

+1

@empo: आप एक जवाब के रूप में इस प्रस्तुत करना चाहिए। मेरी राय में, यह अभी तक एकमात्र उत्तर से अधिक प्रत्यक्ष और प्रासंगिक है। –

उत्तर

6

9 घंटे लिखने के लिए लिखने के लिए है ...।

पावरहेल में जो कुछ भी आप जोड़ते हैं वह एक वस्तु है।

तो "सर्वर:" एक वस्तु, $ एक एक वस्तु

PS> "server :".gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

Write-output है एक cmdlet उस सूची (एक पाइप) का एक प्रकार अन्य cmdlets या स्क्रिप्ट द्वारा इस्तेमाल किया जा करने के लिए वस्तु डाल है। तो "सर्वर:" और "foo" के बीच वास्तव में एक नई लाइन नहीं है। कंसोल आपको ऑब्जेक्ट्स की एक सूची (एक सरणी) दिखाता है। आप यहाँ के तहत देख सकते हैं:

PS> $a = "foo" 
PS> (Write-Output "Server :" $a).gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

जाहिर है इसे यहाँ एक सार है, लेकिन मुझे आशा है कि यह आप समझ कर सकते हैं।

15

इंटरनेट पर कहीं न कहीं मिल गया:

Write-Output "Server: $($a)" 

मेरी कोड में महान काम करता है।

+4

इस उदाहरण के लिए, '$ (...) 'निर्माण अनावश्यक है, क्योंकि यह पाठ के बजाय कोष्ठक के अंदर सबकुछ के रूप में व्यवहार करने के लिए कहता है। चूंकि '$ a' पहले से ही उद्धृत तारों में व्याख्या और डाला गया है, इसलिए रैपर को जोड़ने की आवश्यकता नहीं है। 'लिखें-आउटपुट "सर्वर: $ a" ' ... ठीक काम करेगा। जब आप विधियों या चर के गुणों तक पहुंचने का प्रयास कर रहे हैं तो रैपर '$()' का उपयोग करें। '$ ए =" मुझे अंडे पसंद हैं। " लिखें-आउटपुट "कैरेक्टर गिनती: $ ($ a.length)" '' ($) 'रैपर के बिना' मुझे अंडे .. लम्बाई 'पसंद है। – HipCzeck

+0

धन्यवाद, आप मुझे एक दिन बचाओ! मुझे लगता है कि यह शक्तिशक्ति डिजाइन समस्या है, इसे एक और स्क्रिप्ट लैंग के रास्ते को अलग नहीं करना चाहिए। – ariso

4
Write-Output "Server: $a" 
Write-Output ("Server: {0}" -f $a) 
Write-Output ("Server: " + $a) 

आप एक लॉग फ़ाइल में एक स्क्रिप्ट से उत्पादन इकट्ठा करने के लिए चाहते हैं, Start-Transcript उपयोग करने पर विचार। यह प्रत्येक कमांड और सभी PowerShell आउटपुट को फ़ाइल में लॉग करता है। यह stdout के लिए भेजा लेकिन कुछ भी प्रवेश नहीं करता है, तो आप किसी भी विरासत आदेशों का उपयोग कर रहे हैं, तो आप पाइप को Write-Host करने के लिए अपने उत्पादन होगा:

Start-Transcript C:\logs\mylog.txt 
Write-Host "Server: " $a 
ping | Write-Host 
+1

पावरशेल का _equivalent_ stdout पर है _success output stream_ और वहां भेजे गए चीजें _do_ लॉग इन हो गई हैं। 'लिखने वाला होस्ट' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ पीएसवी 5 + में, हालांकि, 'लिखें-होस्ट'/'आउट-होस्ट' अब नए पेश किए गए _ सूचना स्ट्रीम_ (जैसा कि नया 'लिखें-सूचना' cmdlet) लिखता है, जो अब _does_ लॉग हो जाता है। आप या तो आउटपुट को पूरी तरह से दबाने के लिए '$ null = ...' का उपयोग कर सकते हैं, या इस संदर्भ में पीएसवी 4- 'लिखें-होस्ट' व्यवहार का अनुकरण करने के लिए, '$ host.ui.WriteLine() 'का उपयोग करें। – mklement0

0

मौजूदा जवाब में अच्छी जानकारी नहीं है, लेकिन जाने मुझे एक व्यावहारिक सारांश का प्रयास:

  • सांत्वना या एक फ़ाइल पर रीडायरेक्ट Write-Output एक से अलग करती है कई तर्कों को मुद्रण जब प्रत्येक की नई लाइन।

  • इसलिए, एकल लाइन उत्पादन का उत्पादन करने के लिए , आप एक एकल स्ट्रिंग है कि आप एक एकल तर्क के रूप में पारित में "पूर्व इकट्ठा" चाहिए उत्पादन के लिए भागों।

    • Aaron Jensen's helpful answer आपको लगता है कि ऐसा करने का 3 वैकल्पिक तरीकों को दर्शाता है।
  • संग्रह, आप आम तौर पर स्पष्ट रूप से Write-Output उपयोग करने के लिए की जरूरत नहीं है की गणना को दबाने के लिए छोड़कर, क्योंकि PowerShell डिफ़ॉल्ट से कुछ भी है कि एक चर में कब्जा नहीं कर रहा है या कहीं और पुनः निर्देशित या करने के लिए पाइप लाइन के माध्यम से भेजा भेजता है [सफलता] आउटपुट स्ट्रीम (जो Write-Output भी लिखता है); इस प्रकार, हाथ में मामले में, निम्नलिखित के लिए पर्याप्त है:

"Server: $a" # what this expandable string expands to is *implicitly* output 

क्या भ्रमित किया जा सकता है कि Write-Host cmdlet अलग तरह से काम करता है है, लेकिन यह यह है कि ध्यान देना महत्वपूर्ण है अलग-अलग उद्देश्य

# IMPORTANT: Do not use Write-Host to output *data*; only use it to write 
#   directly to the host (console). 
> Write-Host "Server:"  $a # multiple spaces used on purpose 
Server: srv1 

Write-Host, Write-Output के विपरीत, एक सिंगल स्पेस प्रत्येक द्वारा कई तर्क अलग करती है।
अन्य महत्वपूर्ण अंतर हैं, जिनका सारांश this answer में मेरा सारांश है।


प्रश्न के जेनेरिक शीर्षक को देखते हुए, यह भी को संबोधित एक न्यू लाइन अनुगामी को दबाने के लिए कैसे करते हैं:

  • कंसोल केवल को मुद्रण के लिए, आप उपयोग कर सकते हैं Write-Host -NoNewline

  • डेटा उत्पादन साथ , Write-Output, निहित उत्पादन, या किसी अन्य आदेश से के माध्यम से यह हो:

    • आप पीछे न्यू लाइन नहीं रोका जा सकता उत्पादन कंसोल के लिए भेजा जाता है जबthis GitHub issue देखते हैं -

    • दुर्भाग्य से, विंडोज PowerShell v5.1/PowerShell कोर v6.0.0 के रूप में, आप पीछे न्यू लाइन जब पाइपलाइन के माध्यम से बाहरी कार्यक्रमों के लिए पाठ संदेश भेजने नहीं रोका जा सकता।

    • में PSv5 +, हालांकि, आप एक अनुगामी न्यू लाइन को रोका जा सकता जब एक फ़ाइल में कब्जा उत्पादन, Out-File -NoNewline या Set-Content -NoNewline का उपयोग कर (PSv4- में, आप .नेट फ्रेमवर्क सीधे उपयोग करना चाहिए) द्वारा ; इसके विपरीत, > वाली फ़ाइल पर रीडायरेक्ट करने से पिछली नई लाइन संलग्न होती है।

      • चेतावनी: आप कई वस्तुओं, outputting रहे हैं -NoNewline न केवल एक न्यू लाइन अनुगामी, लेकिन यह भी के बीच इन वस्तुओं नई-पंक्तियों को रोकता है।
      • Out-File और Set-Content और जब चुनने के लिए अंतर के लिए, this answer मेरा चयन करें।

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

  • कोई संबंधित समस्या नहीं^_^