2013-02-04 58 views
30

पीढ़ियों के लिए इस प्रश्न के रूप में पूछा गया है, लेकिन कुछ जटिल विंडोज स्क्रिप्ट लिखने के बावजूद, मुझे यह पता लगाना प्रतीत नहीं होता कि उन्हें वास्तव में चुप कैसे बनाया जाए।मैं विंडोज बैच स्क्रिप्ट को पूरी तरह से चुप कैसे बना सकता हूं?

निम्नलिखित मेरे वर्तमान लिपियों में से एक से एक अंश है:

@ECHO OFF 
SET scriptDirectory=%~dp0 
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat 
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f" 
) 
ECHO 

इस का परिणाम है:

C:\Temp> test.bat 
     1 file(s) copied. 
File Not Found 
Echo is off. 

C:\Temp> 
जबकि

"1 फ़ाइल (फ़ाइलें) की नकल की।" सिर्फ परेशान है, "फ़ाइल नहीं मिली" उपयोगकर्ता को लगता है कि कुछ गलत हो गया है (जो यह नहीं है - कोई फाइल ठीक नहीं है)।

+1

यदि आप दिए गए विकल्पों से अलग समाधान का उपयोग कर समाप्त हो गए हैं तो कृपया अपना उत्तर दें और इसे स्वीकार करें। प्रश्न के समाधान को स्वयं न जोड़ें। –

+0

मैंने वास्तव में इसे "फ़ाइल नहीं मिला" आउटपुट को किसी शर्त के साथ उपसर्ग करके निकालने में कामयाब रहा है: यदि EXIST "% scriptDirectory% *। Noext" FOR/F %% f IN ('dir/B "% scriptDirectory % *। नोक्स्ट "') डीओ (...यह मूल रूप से काम नहीं करता क्योंकि मैंने IF DO() का उपयोग करने का प्रयास किया था। –

+0

मैंने @ बॉबस्टीन-विसिबोन की बजाय [कठोर, आईएमएचओ] टिप्पणी को प्रतिबिंबित करने के लिए शीर्षक बदल दिया है। –

उत्तर

55

NUL के उत्पादन, उपयोग पुनर्निर्देशन को दबाने के लिए। stderrstdout

  • मानक आउटपुट, या,

  • मानक त्रुटि, या:

    उत्पादन के दो प्रकार है कि सांत्वना आदेशों का उपयोग कर रहे हैं।

दो के

, stdout अधिक बार, दोनों आंतरिक आदेशों द्वारा, copy की तरह प्रयोग किया जाता है, और कंसोल उपयोगिताओं, या बाहरी आदेश, find की तरह और दूसरों के द्वारा, साथ ही तीसरे पक्ष के सांत्वना कार्यक्रमों के द्वारा ।

>NUL मानक आउटपुट को दबाता है और ठीक काम करता है उदा। copy कमांड का संदेश दबाने के लिए। एक वैकल्पिक वाक्यविन्यास 1>NUL है। तो,

COPY file1file2>NUL 

या

COPY file1file21>NUL 

या

>NUL COPY file1file2 

या

1>NUL COPY file1file2 

COPY के मानक उत्पादन के सभी को रोकता है।

त्रुटि संदेशों को दबाने के लिए, जो आमतौर पर stderr पर मुद्रित होते हैं, इसके बजाय 2>NUL का उपयोग करें।

DEL file2>NUL 

या

2>NUL DEL file 
: तो, एक File Not Found संदेश यह है कि DEL प्रिंट जब, ठीक है, निर्दिष्ट फ़ाइल नहीं मिला है, बस 2>NUL या तो शुरुआत में या कमांड लाइन के अंत में जोड़ने को दबाने के लिए

हालांकि कभी-कभी यह सत्यापित करने का एक बेहतर विचार हो सकता है कि फ़ाइल इसे हटाने की कोशिश करने से पहले मौजूद है या नहीं, जैसे आप अपने स्वयं के समाधान में कर रहे हैं। नोट, हालांकि, आपको लूप का उपयोग करके फ़ाइलों को एक-एक करके हटाने की आवश्यकता नहीं है।

IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext" 
+0

धन्यवाद, @AndriyM - मेरी वास्तविक स्क्रिप्ट सिर्फ फ़ाइल को हटाने से अधिक है, लेकिन मैंने इसे प्रश्न के लिए हटा दिया। अगर मैं 1> एनयूएल का उपयोग करता हूं, तो क्या इसका मतलब है कि त्रुटि संदेश अभी भी दिखाए जाएंगे? यह एक सुधार होगा। –

+1

@ माइकसाडलर: हां, '1> एनयूएल' केवल मानक आउटपुट दबाता है। त्रुटि आउटपुट अभी भी दिखाया जाएगा। जब आपको कमांड के लिए * सभी * आउटपुट को दबाने की आवश्यकता होती है, तो इसके साथ '1> NUL' और' 2> NUL' दोनों का उपयोग करें। –

+0

यह सही है - यदि उपयोगकर्ता कोई है तो मैं त्रुटि संदेश देखने के लिए खुश हूं। –

2

आप इसे छिपाने के लिए stdout को nul पर रीडायरेक्ट कर सकते हैं।

COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >nul 

बस आदेशों आप से उत्पादन छुपाना चाहते हैं के लिए >nul जोड़ें।

Here आप std धाराओं को पुनर्निर्देशित करने के सभी अलग-अलग तरीकों को देख सकते हैं।

3

संदेश बनाने वाली लाइनों के अंत में बस >NUL जोड़ें।

उदाहरण के लिए,

COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >NUL

8

यदि आप चाहते हैं कि आपके बैच स्क्रिप्ट के सभी सामान्य उत्पादन चुप (अपने उदाहरण की तरह), कि सबसे आसान तरीका है बैच फ़ाइल को चलाने के लिए है: आप बहुत कुछ नष्ट करने के लिए एक भी आदेश का उपयोग कर सकते हैं एक पुनर्निर्देशन के साथ:

C:\Temp> test.bat >nul 

इस विधि लिपि में एक पंक्ति को संशोधित करने की आवश्यकता नहीं है और यह अभी भी स्क्रीन में त्रुटि संदेश दिखा। सभी को दबाने के लिए उत्पादन, त्रुटि संदेश सहित:

C:\Temp> test.bat >nul 2>&1 

अपनी स्क्रिप्ट लाइनों है कि उत्पादन का उत्पादन आप शायद के बजाय लिए पुनर्निर्देशन जोड़ने के लिए उन LINEAS सरल हो जाएगा स्क्रीन में दिखाना चाहते हैं, है, तो सभी लाइनों आप चुप रखना चाहते हैं:

@ECHO OFF 
SET scriptDirectory=%~dp0 
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat 
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f" 
) 
ECHO 
REM Next line DO appear in the screen 
ECHO Script completed >con 

एंटोनियो

1

प्रतियां एक नामी निर्देशिका एचटीएमएल & इसकी सभी सामग्री चुप मोड में गंतव्य निर्देशिका के लिए। यदि गंतव्य निर्देशिका मौजूद नहीं है तो यह अभी भी इसे बनाएगी।

@echo off 
TITLE Copy Folder with Contents 

set SOURCE=C:\labs 
set DESTINATION=C:\Users\MyUser\Desktop\html 

xcopy %SOURCE%\html\* %DESTINATION%\* /s /e /i /Y >NUL 

  1. /एस प्रतियां निर्देशिका और उपनिर्देशिका खाली लोगों को छोड़कर।

  2. /ई खाली निर्देशिका सहित निर्देशिकाओं और उपनिर्देशिकाओं की प्रतियां।/एस/ई के समान। संशोधित करने के लिए इस्तेमाल किया जा सकता है/टी।

  3. /I यदि गंतव्य मौजूद नहीं है और एक से अधिक फ़ाइल की प्रतिलिपि बनाते हैं, तो मान लें कि गंतव्य एक निर्देशिका होना चाहिए।

  4. /वाई Suppresses यह पुष्टि करने के लिए संकेत देता है कि आप मौजूदा गंतव्य फ़ाइल को ओवरराइट करना चाहते हैं।