2012-06-23 24 views
15

नीचे दिए गए उदाहरण में, मैं nmake निष्पादित करता हूं और फिर टीटी को STDOUT/STDERR को रीडायरेक्ट करता हूं, जो उसे स्क्रीन पर भेजता है, और लॉग फ़ाइल में भी भेजता है। समस्या यह है कि मैं nmake के लिए निकास कोड को पकड़ने की कोशिश कर रहा हूं और टी नहीं। मुझे जो चाहिए वह एनएमके से निकास कोड है, और टी नहीं।विंडोज कमांड दुभाषिया: पहले पाइप किए गए कमांड के बाहर निकलने के कोड को कैसे प्राप्त करें

nmake | tee output.txt 

उत्तर

22

आपको लगता है कि आप निम्न की तरह कुछ कर सकते हैं, लेकिन यह काम नहीं करेगा।

(nmake & call set myError=%%errorlevel%%) | tee output.txt 

समस्या उस तंत्र में निहित है जिसके द्वारा विंडोज पाइप काम करते हैं। पाइप के प्रत्येक पक्ष को अपने स्वयं के सीएमडी खोल में निष्पादित किया जाता है। तो आपके द्वारा सेट किए गए किसी भी पर्यावरण चर को आदेश समाप्त होने के बाद गायब हो जाएगा। इसके अलावा% errorlevel% का देरी विस्तार पार्सिंग के अतिरिक्त स्तर की वजह से अधिक जटिल है, और क्योंकि सीएमडी खोल में बैच संदर्भ के बजाय कमांड लाइन संदर्भ है।

आप कुछ इस तरह कर सकता है:

(nmake & call echo %%^^errorlevel%% ^>myError.txt) | tee output.txt 
for /f %%A in (myError.txt) do echo nmake returned %%A 
del myError.txt 

या फिर आप अपने output.txt में errorlevel एम्बेड कर सकता है:

(nmake & call echo nmakeReturnCode: %%^^errorlevel%%) | tee output.txt 
for /f "tokens=2" %%A in ('findstr /b "nmakeReturnCode:" output.txt') do echo nmake returned %%A 

लेकिन सबसे सरल समाधान हो रहा है

nmake >output.txt 
set myError=%errorlevel% 
type output.txt 
echo nmake returned %myError% 


नोट - विंडोज पाइप के साथ काम करते समय कई सूक्ष्म जटिलताओं हैं। एक अच्छा संदर्भ Why does delayed expansion fail when inside a piped block of code? है। मैं सवाल और सभी उत्तरों को पढ़ने की सलाह देते हैं। चयनित उत्तर में सबसे अच्छी जानकारी है, लेकिन अन्य उत्तरों संदर्भ प्रदान करने में मदद करते हैं।

संपादित 2015-06-02

मैं हाल ही में पता चला है कि आप DOSKEY मैक्रो का उपयोग कर सकते हैं एक का सहारा के बिना सफाई से की दुकान और एक पाइप के दोनों (या दोनों) पक्षों से ERRORLEVEL पुनः प्राप्त करने, अस्थायी फ़ाइल। मुझे http://www.dostips.com/forum/viewtopic.php?p=41409#p41409 पर डॉसटिप्स उपयोगकर्ता एड डायरिन से विचार मिला। डॉस्की मैक्रोज़ बैच के माध्यम से निष्पादित नहीं किया जा सकता है, लेकिन परिभाषाएं एंडलोकल और सीएमडी/सी निकास के बाद जारी रहती हैं!

यहाँ कैसे आप अपनी स्थिति में इसका इस्तेमाल होता है:

(nmake & call doskey /exename=err err=%%^^errorlevel%%) | tee output.txt 
for /f "tokens=2 delims==" %%A in ('doskey /m:err') do echo nmake returned %%A 

आप चाहते हैं, तो आप अंत में एक और आदेश में जोड़ सकते हैं अं "मैक्रो" की परिभाषा स्पष्ट करने के बाद आप पुनः प्राप्त है मूल्य।

doskey /exename=err err= 
+0

सरल समाधान टी (एक साथ आउटपुट) का उपयोग करने के लिए प्रमुख कारण को हरा देता है। इसके अलावा पहले समाधान के लिए आप "set/p MY_ERROR =

+0

का उपयोग कर सकते हैं 'कॉल सेट', 'कॉल इको' और आगे के साथ क्या सौदा है? मैंने पहले कभी इस वाक्यविन्यास को नहीं देखा है। – alecov

+1

@ एलेक - प्रारंभिक पार्स के बाद परिवर्तनीय विस्तार के दूसरे दौर को प्राप्त करने के लिए यह एक पुराना हैक है। यह देरी विस्तार का उपयोग करने का एक विकल्प है। 'echo! var!' 'echo %% var %% 'के समान है। विलंबित विस्तार आमतौर पर पसंद किया जाता है, लेकिन कई बार जब कॉल हैक की आवश्यकता होती है। – dbenham