कमांड लाइन आउटपुट को दबाएं


118

मेरे पास इस तरह एक साधारण बैच फ़ाइल है:

प्रतिध्वनि

taskkill / im "test.exe" / f> nul

ठहराव

यदि "test.exe" नहीं चल रहा है, तो मुझे यह संदेश मिलता है:

त्रुटि: प्रक्रिया "test.exe" नहीं मिली।

यह त्रुटि संदेश क्यों प्रदर्शित होता है, भले ही मेरे पास NUL में आउटपुट पुनर्निर्देशित हो?

मैं उस आउटपुट को कैसे दबा सकता हूं?

जवाबों:


212

क्योंकि त्रुटि संदेश अक्सर stderrनहीं जाते हैं stdout

इसको मंगलाचरण बदलें:

taskkill /im "test.exe" /f >nul 2>&1

और सब बेहतर होगा

वह काम करता है क्योंकि stdoutफ़ाइल डिस्क्रिप्टर 1 है, और stderrकन्वेंशन द्वारा फ़ाइल डिस्क्रिप्टर 2 है। (0 stdin, संयोग से है।) 2>&1कॉप्स आउटपुट फ़ाइल डिस्क्रिप्टर 2 को 1 के नए मूल्य से, जो कि केवल नल डिवाइस पर रीडायरेक्ट किया गया था।

यह सिंटैक्स कई यूनिक्स शेल से उधार लिया गया (शिथिल) है, लेकिन आपको सावधान रहना होगा क्योंकि शेल सिंटैक्स और CMD.EXE के बीच सूक्ष्म अंतर हैं।

अद्यतन: मुझे पता है कि ओपी "फ़ाइल" की विशेष प्रकृति को समझता है जिसका नाम NULमैं यहां लिख रहा हूं, लेकिन एक टिप्पणीकार ने ऐसा नहीं किया और इसलिए मुझे उस पहलू पर थोड़ा और विस्तार से बताने की अनुमति देता हूं।

MSDOS के शुरुआती रिलीज़ पर वापस जाने से, कुछ फ़ाइल नामों को फ़ाइल सिस्टम कर्नेल द्वारा प्रीपेप्ट किया गया और डिवाइसों को संदर्भित करने के लिए उपयोग किया गया। उन नामों का जल्द से जल्द सूची शामिल NUL, PRN, CON, AUXऔर COM1के माध्यम से COM4NULnull डिवाइस है। यह हमेशा पढ़ने या लिखने के लिए खोला जा सकता है, इस पर कोई भी राशि लिखी जा सकती है, और पढ़ता है कि हमेशा सफल होता है लेकिन कोई डेटा वापस नहीं करता है। अन्य में समानांतर प्रिंटर पोर्ट, कंसोल और चार सीरियल पोर्ट शामिल हैं। MSDOS 5 के रूप में, कई और आरक्षित नाम थे, लेकिन बुनियादी सम्मेलन बहुत अच्छी तरह से स्थापित था।

जब विंडोज बनाया गया था, तो यह MSDOS कर्नेल के शीर्ष पर एक काफी पतली अनुप्रयोग स्विचिंग परत के रूप में जीवन शुरू कर दिया, और इस तरह एक ही फ़ाइल प्रतिबंध था। जब विंडोज NT को अपने आप में एक सच्चे ऑपरेटिंग सिस्टम के रूप में बनाया गया था, तो उनके उन्मूलन की अनुमति देने के लिए काम करने जैसे नामों NULऔर COM1बहुत व्यापक रूप से ग्रहण किया गया था। हालांकि, यह विचार कि नए उपकरणों को हमेशा ऐसे नाम मिलेंगे जो भविष्य के उपयोगकर्ताओं को वास्तविक फ़ाइलों के लिए ब्लॉक करेंगे, यह स्पष्ट रूप से अनुचित है।

Windows NT और सभी संस्करण जो (2K, XP, 7, और अब 8) का पालन करते हैं, सभी का पालन करते हैं कर्नेल कोड से अधिक विस्तृत NT Namespace का उपयोग करें और ध्यान से निर्मित और अत्यधिक गैर-पोर्टेबल उपयोगकर्ता अंतरिक्ष कोड का उपयोग करें। उस नाम स्थान में, डिवाइस ड्राइवर \Deviceफ़ोल्डर के माध्यम से दिखाई देते हैं । आवश्यक पिछड़े संगतता का समर्थन करने के लिए \DosDevicesफ़ोल्डर का उपयोग करने वाला एक विशेष तंत्र है जो किसी भी फ़ाइल सिस्टम फ़ोल्डर में आरक्षित फ़ाइल नामों की सूची को लागू करता है। उपयोगकर्ता कोड सामान्य Win32 API के नीचे API परत का उपयोग करके इस आंतरिक नाम स्थान को ब्राउज़ कर सकता है; कर्नेल नाम स्थान का पता लगाने के लिए एक अच्छा उपकरण है WinObj माइक्रोसॉफ्ट पर SysInternals समूह से।

विंडोज़ में फ़ाइलों (और उपकरणों) के कानूनी नामों के आसपास के नियमों का पूरा विवरण के लिए, MSDN का यह पृष्ठ सूचनात्मक और चुनौतीपूर्ण दोनों होगा। नियम उनके मुकाबले बहुत अधिक जटिल हैं, और वास्तव में कुछ सरल सवालों का जवाब देना असंभव है जैसे "कितनी लंबी कानूनी पूरी तरह से योग्य पथ नाम है?"


5
उत्तर के लिए धन्यवाद, और स्पष्टीकरण के लिए सबसे अधिक।
जोसेफ्सटन 20

एक सिफारिश: taskkill /im "test.exe" /f >%temp%\nul 2>&1 & del %temp%\nul। यह एक रिक्त नल फ़ाइल को स्थानीय निर्देशिका
Samy Bencherif

11
@SamyBencherif, NULएक आरक्षित फ़ाइल नाम और NUL डिवाइस का मानचित्र है। आप NULकिसी भी निर्देशिका में एक वास्तविक फ़ाइल नहीं बना सकते ।
RBerteig

7

इसके बजाय इस स्क्रिप्ट का उपयोग करें:

@taskkill/f /im test.exe >nul 2>&1
@pause

2>&1भाग वास्तव में क्या करता है, यह है कि यह stderrआउटपुट को पुनर्निर्देशित करता है stdout। मैं इसे नीचे बेहतर तरीके से समझाऊंगा:

@ taskkill / f / im test.exe> ​​nul 2> & 1

कार्य "test.exe" को मारें। पुन: निर्देशित stderrकरने के लिए stdout। फिर, अनुप्रेषित stdoutकरने के लिए nul

@pause

Press any key to continue . . . जब तक कोई कुंजी दबाता है तब तक रोकें संदेश दिखाएं ।

नोट: @प्रतीक प्रत्येक कमांड के लिए संकेत छिपा रहा है। आप इस तरह से 8 बाइट्स तक बचा सकते हैं।

अपनी स्क्रिप्ट का सबसे छोटा संस्करण हो सकता है: चरित्र आदेशों दूसरी बार अलग करने के लिए पहली बार पुनर्निर्देशन के लिए प्रयोग किया जाता है, और। एक वर्ण को एक पंक्ति में दो बार की आवश्यकता नहीं है। यह कोड सिर्फ 40 बाइट्स है, एक के बावजूद आपने 49 बाइट्स पोस्ट किए हैं! मैंने वास्तव में 9 बाइट्स बचाए हैं। एक क्लीनर कोड के लिए ऊपर देखो।
@taskkill/f /im test.exe >nul 2>&1&pause
&
@


हां मुझे पता है कि पोस्ट का आधा हिस्सा वास्तव में आपके कोड को छोटा करना है।
इकोन्स

3

mysqldump के साथ काम नहीं करता है: > nul 2> & 1
इसके बजाय उपयोग करें: 2> nul
यह stderr संदेश को दबाता है: "चेतावनी: कमांड लाइन इंटरफेस पर पासवर्ड का उपयोग करना असुरक्षित हो सकता है"


0

आप इसके बजाय यह भी कर सकते हैं:

tasklist | find /I "test.exe" > nul && taskkill /f /im test.exe > nul

इस बात के बावजूद कि प्रश्न का संदर्भ बैच स्क्रिप्ट था, मैंने पाया कि PowerShell में उपरोक्त सिंटैक्स " आउट-फाइल " के साथ विफल हो जाता है : फाइलस्ट्रीम को एक डिवाइस खोलने के लिए कहा गया था जो कि फ़ाइल नहीं थी। 'com1:' या 'lpt1: जैसे उपकरणों के समर्थन के लिए। ', CreateFile को कॉल करें, फिर FileStream कंस्ट्रक्टर्स का उपयोग करें जो एक IntPtr के रूप में OS हैंडल लेते हैं। "समाधान के > nulसाथ बदलना है >$null
बांध
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.