2010-06-09 16 views
22

पर त्रुटियों और आउटपुट लिखना मैं एक निष्पादन स्क्रिप्ट के पूरे आउटपुट (त्रुटियों को शामिल) लिखने की कोशिश कर रहा हूं और एक ही समय में एक फ़ाइल। मैं कई विभिन्न विकल्पों की कोशिश की है:एक पाठ फ़ाइल और कंसोल

.\MyScript.ps1 | tee -filePath C:\results.txt # only the output to the file 
.\MyScript.ps1 2> C:\results.txt # only the errors to the file and not the console 
.\MyScript.ps1 > C:\results.txt # only the output to the file and not the console 

मेरे आशा मैं उत्पादन/त्रुटियों की समीक्षा करने के लिए फ़ाइल इस्तेमाल कर सकते हैं कि था।

संपादित करें:

यह मेरी वर्तमान परीक्षण स्क्रिप्ट है। वांछित परिणाम यह है कि सभी तीन संदेशों को देखा जा सकता है।

function Test-Error 
{ 
    echo "echo" 
    Write-Warning "warning" 
    Write-Error "error"  
} 

Test-Error 2>&1 | tee -filePath c:\results.txt 
+0

@JasonMArcher इस प्रश्न पर टैग अपडेट करने के लिए धन्यवाद! क्या वीजा 3 में तय होने के बाद हमें कुछ भी अतिरिक्त करना चाहिए और मैं मूल रूप से वी 2 का उपयोग कर रहा था? धन्यवाद। – smaclell

+0

यह निर्भर करता है, क्या आप केवल वी 2 के उत्तर चाहते हैं? यह कोई समस्या नहीं है जो V2 के लिए विशिष्ट है। इस प्रकार सबसे अच्छा विचार PowerShell के संस्करण के साथ वास्तविक उत्तरों को प्राथमिकता देना है जिसका उद्देश्य उनके लिए है। :) – JasonMArcher

+1

मैंने पीएस संस्करण संगतता के बारे में मौजूदा उत्तरों में कुछ नोट्स जोड़े। – JasonMArcher

उत्तर

19

आप की कोशिश की है:

.\MyScript.ps1 2>&1 | tee -filePath c:\results.txt 

2>&1 क्या आप के लिए

नोट देख रहे है: यह जवाब PowerShell 1.0 और 2.0 में अच्छा काम करता है, लेकिन केवल मानक आउटपुट पर कब्जा होगा और PowerShell 3.0 और बाद में त्रुटियों।

+0

यह बहुत करीब है। मैंने स्क्रिप्ट को जोड़ा जो मैं प्रश्न के लिए अपनी वांछित कार्यक्षमता का परीक्षण करने के लिए उपयोग कर रहा हूं। यह मानक आउटपुट और त्रुटियों को प्राप्त करने में सक्षम है लेकिन चेतावनियां नहीं। कोई अन्य विचार? – smaclell

+1

आपके पास इसके लिए बहुत अच्छे विकल्प नहीं हैं। WRite-Warning और Write-Error के लिए cmdlet सहायता विषयों को पढ़ें और आप देखेंगे कि वे मूल रूप से अलग हैं। लिखने-चेतावनी होस्ट को लिखती है, त्रुटि-त्रुटि त्रुटि आउटपुट स्ट्रीम को लिखती है। आप स्ट्रीम को रीडायरेक्ट कर सकते हैं, लेकिन मेजबान को लिखना मेजबान पर जाता है। आपका एकमात्र विकल्प चेतावनी उपलब्ध है, आदि सामान्य पैरामीटर। आप इसका उपयोग कर एक चर के लिए सभी चेतावनी/त्रुटि/आउटपुट डेटा रीडायरेक्ट करने में सक्षम होना चाहिए। अधिक जानकारी के लिए about_Common पैरामीटर सहायता विषय देखें। –

+2

बीटीडब्ल्यू, ऐसा लगता है कि आप इसमें शामिल होने वाले पहले व्यक्ति नहीं हैं। मैं जिस व्यक्ति के साथ काम करता था, उसके पास समस्या का एक अच्छा विवरण है: http://keithhill.spaces.live.com/blog/cns!5A8D2641E0963A97!6926.entry –

1

मुझे एक ही फाइल में दोनों त्रुटियां और परिणाम नहीं मिल सका। का संभावित हल है कि मेरे लिए काम किया:

.\MyScript.ps1 2> C:\errors.txt | tee -filePath C:\results.txt

अद्यतन: मैं आगे काम किया है और मैं अपने मोड में Start-Transcript और Stop-Transcript इस्तेमाल किया सब कुछ कब्जा करने के लिए और यह काम किया!

+0

अन्य उत्तर फ़ाइल में stderr और stdout सही ढंग से लिखता है। मूल समस्या चेतावनियों को भी शामिल करने में सक्षम नहीं थी। 'स्टार्ट-ट्रांसक्रिप्ट' और 'स्टॉप-ट्रांसक्रिप्ट' बहुत उपयोगी हैं और अभी भी सीखने लायक हैं। – smaclell

2

मैं किसी भी सवाल का जवाब मैं खोजने गया था से संतुष्ट नहीं था, इसलिए मैं कुछ मिलाया गया और ऊपर (में PowerShell 3.0+) इस के साथ आया था:

$output = try{your_command *>&1}catch{$_} 

इस के साथ आप सभी त्रुटियों पर कब्जा कर सकते हैं और आउटपुट जो your_command का उपयोग करने की कोशिश कर उत्पन्न होते हैं।

यह अपवाद पकड़ता है जब आप एक गैर-मौजूद आदेश का उपयोग करें:

PS C:\Users\jdgregson> $output = try{your_command *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
your_command : The term 'your_command' is not recognized as the name of a 
cmdlet, function, script file, or operable program. Check the spelling of the 
name, or if a path was included, verify that the path is correct and try again. 
At line:1 char:15 
+ $output = try{your_command 2>&1}catch{$_} 
+    ~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (your_command:String) [], Comman 
    dNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

PS C:\Users\jdgregson> 

यह अपवाद पकड़ता है जब आप एक मौजूदा आदेश को अमान्य तर्क पारित:

PS C:\Users\jdgregson> $output = try{cat C:\invalid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
cat : Cannot find path 'C:\invalid-path.txt' because it does not exist. 
At line:1 char:15 
+ $output = try{cat C:\invalid-path.txt 2>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (C:\invalid-path.txt:String) [Ge 
    t-Content], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetCo 
    ntentCommand 

और यह उत्पादन करता है, तो फैल जाती है वहाँ आपके आदेश के साथ कोई समस्या नहीं थी:

PS C:\Users\jdgregson> $output = try{cat C:\valid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
this file is really here 

यह आपके लिए काम करता है उदाहरण भी:

PS C:\Users\jdgregson> $output = try{Test-Error *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
echo 
WARNING: warning 
Test-Error : error 
At line:1 char:15 
+ $output = try{Test-Error *>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorExcep 
    tion 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio 
    n,Test-Error 
+0

यह मजेदार है! साझा करने के लिए धन्यवाद। – smaclell

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