2012-01-19 12 views
31

में संलग्न मानक और त्रुटि आउटपुट का पुनर्निर्देशन मुझे कई प्रक्रियाओं से एक एकल लॉगफाइल में मानक आउटपुट और त्रुटि लॉग एकत्र करने की आवश्यकता है।एक ही लॉग-फ़ाइल

इसलिए प्रत्येक आउटपुट को इस लॉगफाइल में जोड़ना चाहिए।

मैं इस तरह लाइनों के साथ सभी नौकरियों कॉल करना चाहते हैं:

$p=start-process myjob.bat -redirectstandardoutput $logfile -redirecterroroutput $logfile -wait 

मैं कहां से संलग्न करने के लिए जानकारी डाल करने के लिए है?

उत्तर

52

फ़ाइल में शामिल करने के लिए आपको थोड़ा अलग दृष्टिकोण उपयोग करने की आवश्यकता होगी। Start-Process द्वारा बनाई

  1. पढ़ें stdout/stderr फ़ाइल सामग्री: आप अभी भी एक व्यक्ति की प्रक्रिया मानक त्रुटि और मानक उत्पादन फाइल करने के लिए, लेकिन आदेश में एक फ़ाइल से संलग्न करने के लिए आप इन चीजों में से एक करने की आवश्यकता होगी में अनुप्रेषित कर सकते हैं
  2. प्रारंभ-प्रक्रिया का उपयोग करें और कॉल ऑपरेटर &
  3. उपयोग नहीं होने प्रारंभ-प्रक्रिया और प्रक्रिया शुरू नेट के साथ वस्तुओं

पहला तरीका इस प्रकार दिखाई देगा नहीं:

$myLog = "C:\File.log" 
$stdErrLog = "C:\stderr.log" 
$stdOutLog = "C:\stdout.log" 
Start-Process -File myjob.bat -RedirectStandardOutput $stdOutLog -RedirectStandardError $stdErrLog -wait 
Get-Content $stdErrLog, $stdOutLog | Out-File $myLog -Append 

दूसरा तरीका इस प्रकार दिखाई देगा:

& myjob.bat 2>&1 >> C:\MyLog.txt 

या इस:

& myjob.bat 2>&1 | Out-File C:\MyLog.txt -Append 

तीसरा रास्ता:

$pinfo = New-Object System.Diagnostics.ProcessStartInfo 
$pinfo.FileName = "myjob.bat" 
$pinfo.RedirectStandardError = $true 
$pinfo.RedirectStandardOutput = $true 
$pinfo.UseShellExecute = $false 
$pinfo.Arguments = "" 
$p = New-Object System.Diagnostics.Process 
$p.StartInfo = $pinfo 
$p.Start() | Out-Null 
$p.WaitForExit() 
$output = $p.StandardOutput.ReadToEnd() 
$output += $p.StandardError.ReadToEnd() 
$output | Out-File $myLog -Append 
+2

महान जवाब। लेकिन मुझे ऐसा लगता है कि पहले तरीके से एक त्रुटि है। अप्रत्यक्ष आतंकवाद के बजाय मुझे लगता है कि यह होना चाहिए- रीडायरेक्ट मानक Irror। – Grigory

+3

अच्छा पकड़ो! फिक्स्ड :-) –

+0

क्या यह पावरहेल रिमोटिंग के लिए काम करता है? मेरे पास परीक्षण है, मुझे लगता है कि पीएस रिमोटिंग के लिए दूसरा तरीका काम करता है। – Kiquenet

0

हो सकता है कि काफी के रूप में सुंदर नहीं। लेकिन क्या यह भी काम करेगा? मुझे असीमित रूप से संदेह है कि यह एक अच्छा समाधान नहीं होगा।

$p=start-process myjob.bat -redirectstandardoutput $logtempfile -redirecterroroutput $logtempfile -wait 
add-content $logfile (get-content $logtempfile) 
+0

यह वास्तव में काम नहीं करता है क्योंकि पावरहेल आपको मानक मानक को रीडायरेक्ट करने और उसी फ़ाइल पर आतंकवाद को रीडायरेक्ट करने की अनुमति नहीं देता है। "स्टार्ट-प्रोसेस: यह कमांड नहीं चलाया जा सकता है क्योंकि" रीडायरेक्ट मानक मानक "और" रीडायरेक्ट मानक Irror "समान हैं। अलग-अलग इनपुट दें और अपना कमांड फिर से चलाएं।" जब मैंने कोशिश की तो मुझे मिली त्रुटि है। – Bob

14

एंडी ने मुझे कुछ अच्छे पॉइंटर्स दिए, लेकिन मैं इसे एक साफ तरीके से भी करना चाहता था। उल्लेख नहीं है कि 2>&1 >> विधि के साथ PowerShell ने मुझे किसी अन्य प्रक्रिया द्वारा लॉग फ़ाइल के उपयोग के बारे में शिकायत की है, यानी, दोनों stderr और stdout फ़ाइल को एक्सेस के लिए लॉक करने का प्रयास कर रहा है, मुझे लगता है। तो यहां मैंने इसे कैसे काम किया है।

पहले के एक अच्छा फ़ाइल नाम उत्पन्न करते हैं, लेकिन यह वास्तव में सिर्फ पंडिताऊ होने के लिए है:

$name = "sync_common" 
$currdate = get-date -f yyyy-MM-dd 
$logfile = "c:\scripts\$name\log\$name-$currdate.txt" 

और यहाँ है जहां चाल शुरू होता है:

start-transcript -append -path $logfile 

write-output "starting sync" 
robocopy /mir /copyall S:\common \\10.0.0.2\common 2>&1 | Write-Output 
some_other.exe /exeparams 2>&1 | Write-Output 
... 
write-output "ending sync" 

stop-transcript 
start-transcript साथ

और stop-transcript आप सभी उत्पादन अनुप्रेषित कर सकते हैं PowerShell एक फ़ाइल को आदेश देता है, लेकिन it doesn't work correctly with external commands। तो आइए बस उन सभी आउटपुट को पीएस के स्टडआउट पर रीडायरेक्ट करें और बाकी को ट्रांसक्रिप्ट करने दें।

वास्तव में, मुझे नहीं पता कि एमएस इंजीनियरों का कहना है कि उन्होंने अभी तक "उच्च लागत और तकनीकी जटिलताओं के कारण" इसे ठीक नहीं किया है, जब इसे इस तरह के सरल तरीके से काम किया जा सकता है।

किसी भी तरह से, start-process के साथ प्रत्येक एकल कमांड चलाने के लिए एक बड़ा अव्यवस्था IMHO है, लेकिन इस विधि के साथ, आपको बस इतना करना होगा कि प्रत्येक पंक्ति में 2>&1 | Write-Output कोड संलग्न है जो बाह्य आदेश चलाता है।

+0

समस्या का सबसे अच्छा जवाब। धन्यवाद! –

12

यूनिक्स की तरह के गोले, Powershell > यूनिक्स से जाना जाता अधिकांश विविधताएं साथ पुनर्निर्देश, सहित का समर्थन करता है 2>&1 (हालांकि अजीब तरह से, क्रम में कोई फर्क नहीं पड़ता - 2>&1 > file बस सामान्य > file 2>&1 की तरह काम करता है)।

अधिकांश आधुनिक यूनिक्स शैल की तरह, पावरहेल के पास एक ही डिवाइस पर स्टीडर और स्टडआउट दोनों को पुनर्निर्देशित करने के लिए एक शॉर्टकट होता है, हालांकि यूनिक्स सम्मेलन का पालन करने वाले अन्य पुनर्निर्देशन शॉर्टकट के विपरीत, सभी शॉर्टकट कैप्चर करते हैं और एक नया सिगिल उपयोग करते हैं जैसे: *>

तो अपने कार्यान्वयन हो सकता है:

& myjob.bat *>> $logfile