2011-12-15 12 views
66

में एकाधिक लाइनों पर टिप्पणी करते हुए मैंने विशाल एमएस डॉस बैच फ़ाइल लिखी है। इस बैच फ़ाइल का परीक्षण करने के लिए मुझे केवल कुछ पंक्तियों को निष्पादित करने की आवश्यकता है और शेष को छिपाना/टिप्पणी करना चाहते हैं।डॉस बैच फ़ाइल

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

इस संबंध में किसी भी मदद की सराहना की जाएगी। अग्रिम धन्यवाद, जे

उत्तर

129

आप कोड पर छोड़ एक goto उपयोग कर सकते हैं।

goto comment 
...skip this... 
:comment 
+0

धन्यवाद महोदय! – user219628

+5

+1: इसके लिए "गोटो" का उपयोग करना मजेदार है और यह काम करता है! –

+0

मुझे लगता है कि मजाकिया बात यह है कि कमांड लाइन में कोई वास्तविक टिप्पणी परिभाषा नहीं है, मैं टिप्पणी पंक्तियों के रूप में 'आरईएम' लाइनों को स्वीकार नहीं कर सकता, यह आउटपुट अस्पष्ट – mkb

-1

इस प्रयास करें:

@echo off 2>Nul 3>Nul 4>Nul 

    ben ali 
    mubarak 
    gadeffi 
    ..next ? 

    echo hello Tunisia 

    pause 
+0

+1 बनाता है, लेकिन यह क्यों काम करता है? और इसका उपयोग करने के बाद, stderr अप्राप्य – jeb

+1

-1 लगता है, यह "काम करता है" क्योंकि गूंज 2> नूल मानक त्रुटि स्ट्रीम को एनयूएल पर रीडायरेक्ट कर रहा है, इसे दफन कर रहा है (3> नूल, 4> नूल सहायक धाराओं को पुनर्निर्देशित कर रहा है असली कारण)। यह लाइनों पर टिप्पणी नहीं करता है, यह केवल त्रुटि संदेशों को दिखने से रोकता है। तो कमांड लाइन के रूप में व्याख्या की जा सकती है कि कुछ भी अभी भी चला जाएगा। – pdubs

+3

pdubs टिप्पणी आंशिक रूप से सही है कि आदेश अभी भी निष्पादित कर रहे हैं (और विफल क्योंकि वैध नहीं है)। लेकिन वैध आदेश विफलता के बिना निष्पादित होगा। इसलिए कोड की लाइनों पर टिप्पणी करने के लिए यह एक अच्छा समाधान नहीं है। स्पष्टीकरण क्यों धारा 2 (stderr) "स्थायी रूप से" अक्षम है, सही नहीं है। – dbenham

0

@jeb

और यह उपयोग करने के बाद, stderr दुर्गम प्रतीत हो रहा है

नहीं, इस प्रयास करें:

@echo off 2>Nul 3>Nul 4>Nul 

    ben ali 
    mubarak 2>&1 
    gadeffi 
    ..next ? 

    echo hello Tunisia 

    pause 

लेकिन यह क्यों काम करता है?

क्षमा करें, मैं frensh में सवाल का जवाब:,

(ला पुनर्निर्देशन सममूल्य 3> स्था विशेष कार एली persiste VA के ल utiliser डालना बंदी बनानेवाला le प्रवाह des va le ट्रांसफार्मर एन संयुक्त राष्ट्र पर erreurs 2> स्था पर फ्लक्स persistant à l'ade de 3> ceci va nous permettre d'avoir une gestion des erreur pour tout notre वातावरण de script..par la suite si veux recuperer le flux 'stderr' il faut faire une autre redirection du handle 2 > एयू हैंडल 1> क्यू एन'एस्ट ऑट्रे क्यू ला कंसोल ..)

+1

पर लगातार 2 पदों में हैं I फ्रेंच पढ़ नहीं सकते हैं, लेकिन ऐसा लगता है कि स्ट्रीम क्यों नहीं है शुरुआती पुनर्निर्देशन समाप्त होने के बाद 2 (stderr) अक्षम होना जारी है। मेरे पास http://www.dostips.com/forum/viewtopic.php?p=14612#p14612 पर लगातार 2 पदों में एक व्यावहारिक सिद्धांत और परीक्षण के मामले हैं। – dbenham

+0

(3 द्वारा पुनर्निर्देशन> विशेष है क्योंकि यह बनी रहती है, हम इसका उपयोग त्रुटियों के प्रवाह को पकड़ने के लिए करेंगे 2> क्या यह इसे 3 के एडी के लिए लगातार प्रवाह में बदल देगा> इससे हमें किसी भी के लिए प्रबंधन त्रुटि मिल जाएगी हमारी पर्यावरण स्क्रिप्ट .. फिर यदि आप प्रवाह 'stderr' को पुनर्प्राप्त करना चाहते हैं तो हमें एक और हैंडल रीडायरेक्शन 2> को संभालना होगा> जो कंसोल के अलावा कोई नहीं है ..) – user96403

9

एक और विकल्प आईएफ ब्लॉक में अनचाहे लाइनों को संलग्न करना है जो कभी भी सच नहीं हो सकता

if 1==0 (
... 
) 

निश्चित रूप से अगर ब्लॉक के भीतर कुछ भी निष्पादित नहीं किया जाएगा, लेकिन इसे पार्स किया जाएगा। तो आपके भीतर कोई अमान्य वाक्यविन्यास नहीं हो सकता है। साथ ही, टिप्पणी में ) शामिल नहीं हो सकता है जब तक कि यह बच निकला या उद्धृत न हो। उन कारणों से स्वीकृत गोटो समाधान अधिक विश्वसनीय है। (गोटो समाधान भी तेजी से किया जा सकता है)

अद्यतन 2017-09-19

यहाँ pdub's GOTO solution को एक कॉस्मेटिक वृद्धि है। मैं एक साधारण पर्यावरण चर "मैक्रो" परिभाषित करता हूं जो गोटो टिप्पणी वाक्यविन्यास को थोड़ा बेहतर स्वयं दस्तावेज़िंग बनाता है। यद्यपि यह आमतौर पर अनुशंसा की जाती है कि: बैच स्क्रिप्ट के भीतर लेबल अनूठे होते हैं, वही बैच स्क्रिप्ट के भीतर इस तरह की कई टिप्पणियां एम्बेड करना ठीक है।

@echo off 
setlocal 

set "beginComment=goto :endComment" 

%beginComment% 
Multi-line comment 1 
goes here 
:endComment 

echo This code executes 

%beginComment% 
Multi-line comment 2 
goes here 
:endComment 

echo Done 

या आप npocmaka's solution के इन प्रकार को इस्तेमाल कर सकते हैं। BREAK के बजाय आरईएम का उपयोग इरादा थोड़ा स्पष्ट बनाता है।

rem.||(
    remarks 
    go here 
) 

rem^ ||(
    The space after the caret 
    is critical 
) 
90

आप गोटो उपयोग करने के बजाय प्रत्येक पंक्ति के आरंभ में रेम जोड़ना चाहते हैं, तो आप ऐसा करने के लिए नोटपैड ++ उपयोग कर सकते हैं आसानी से इन चरणों का पालन:

  1. लाइनों के ब्लॉक का चयन करें
  2. uncomment के लिए Ctrl-क्यू मारा

चरणों को दोहराएँ

+3

अच्छी टिप। यह बहुत साफ बनाता है। – Venom

+0

वाह, पता नहीं था नोटपैड ++ में ऐसी अच्छी सुविधा है! असल में वास्तव में इसे याद किया क्योंकि मुझे ग्रहण में 'Ctrl + 7' के लिए उपयोग किया जाता है। ** 42 ** तक मतदान किया गया;) –

+0

अपूर्णता के बारे में क्या। पूरे ब्लॉक को अपनाने के लिए वहां कोई शॉर्टकट है। –

9
break||(
code that cannot contain non paired closing bracket 
) 

जबकि goto समाधान एक अच्छा विकल्प है, यह within brackets (FOR और IF आदेशों सहित) काम नहीं करेगा। लेकिन यह होगा। हालांकि आपको FOR और IF आदेशों के लिए बंद ब्रैकेट और अमान्य वाक्यविन्यास के बारे में सावधान रहना चाहिए क्योंकि उन्हें पार्स किया जाएगा।

अद्यतन

dbenham's जवाब में अद्यतन मुझे कुछ विचार दे दी है। पहला - दो अलग-अलग मामले हैं जहां हमें बहु रेखा टिप्पणियों की आवश्यकता हो सकती है - एक ब्रैकेट के संदर्भ में जहां गोटो का उपयोग नहीं किया जा सकता है और इसके बाहर। ब्रैकेट संदर्भ के अंदर हम एक और शर्त का उपयोग कर सकते हैं यदि कोई ऐसी स्थिति है जो कोड को निष्पादित करने से रोकती है। कोड कोड को अभी भी पर पार्स किया जाएगा और कुछ वाक्यविन्यास त्रुटियों का पता लगाया जाएगा (FOR, IF, अनुचित रूप से बंद ब्रैकेट, गलत पैरामीटर विस्तार।)। तो यदि यह संभव है तो गोटो का उपयोग करना बेहतर है।

हालांकि लेबल के रूप में उपयोग किए जाने वाले मैक्रो/वेरिएबल को बनाना संभव नहीं है - लेकिन ब्रैकेट की टिप्पणियों के लिए मैक्रोज़ का उपयोग करना संभव है। फिर भी दो चालों का उपयोग किया जा सकता है GOTO टिप्पणियां अधिक सममित और अधिक सुखदायक (कम से कम मुझे)। इसके लिए मैं दो चाल का उपयोग करूंगा - 1) आप एक लेबल के सामने एक ही प्रतीक डाल सकते हैं और गेटो अभी भी को खोजने में सक्षम होगा (मुझे नहीं पता कि यह क्यों है। मेरे संकेत यह एक ड्राइव की तलाश में है)। 2) आप एक परिवर्तनीय नाम के अंत में एक : डाल सकते हैं और एक प्रतिस्थापन/सबट्रिंग सुविधा ट्रिगर नहीं की जाएगी (यहां तक ​​कि सक्षम एक्सटेंशन के तहत भी)। ब्रैकेट टिप्पणियों के लिए मैक्रोज़ के साथ संयुक्त जो दोनों मामलों को लगभग समान दिखने के लिए बना सकता है।

तो यहाँ उदाहरण हैं (क्रम में मैं उन्हें सबसे अधिक पसंद):

@echo off 

::GOTO comment macro 
set "[:=goto :]%%" 
::brackets comment macros 
set "[=rem/||(" & set "]=)" 

::testing 
echo not commented 1 

%[:% 
    multi 
    line 
    comment outside of brackets 
%:]% 

echo not commented 2 

%[:% 
    second multi 
    line 
    comment outside of brackets 
%:]% 

::GOTO macro cannot be used inside for 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %[% 
     multi line 
     comment 
    %]% 
    echo second not commented line of the %%a execution 
) 

कर्ली कोष्ठक के साथ:

@echo off 

::GOTO comment macro 
set "{:=goto :}%%" 
::brackets comment macros 
set "{=rem/||(" & set "}=)" 

::testing 
echo not commented 1 

%{:% 
    multi 
    line 
    comment outside of brackets 
%:}% 

echo not commented 2 

%{:% 
    second multi 
    line 
    comment outside of brackets 
%:}% 

::GOTO macro cannot be used inside for loop 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %{% 
     multi line 
     comment 
    %}% 
    echo second not commented line of the %%a execution 
) 

साथ

आयताकार कोष्ठक साथ

ब्रांड्स:

@echo off 

::GOTO comment macro 
set "(:=goto :)%%" 
::brackets comment macros 
set "(=rem/||(" & set ")=)" 

::testing 
echo not commented 1 

%(:% 
    multi 
    line 
    comment outside of brackets 
%:)% 

echo not commented 2 

%(:% 
    second multi 
    line 
    comment outside of brackets 
%:)% 

::GOTO macro cannot be used inside for loop 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %(% 
     multi line 
     comment 
    %)% 
    echo second not commented line of the %%a execution 
) 

मिश्रण powershell के बीच और सी शैलियों (< क्योंकि पुनर्निर्देशन उच्च prio साथ है नहीं किया जा सकता।*%* की वजह से) का इस्तेमाल किया नहीं किया जा सकता:

@echo off 

::GOTO comment macro 
set "/#:=goto :#/%%" 
::brackets comment macros 
set "/#=rem/||(" & set "#/=)" 

::testing 
echo not commented 1 

%/#:% 
    multi 
    line 
    comment outside of brackets 
%:#/% 

echo not commented 2 

%/#:% 
    second multi 
    line 
    comment outside of brackets 
%:#/% 

::GOTO macro cannot be used inside for loop 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %/#% 
     multi line 
     comment 
    %#/% 
    echo second not commented line of the %%a execution 
) 

करने के लिए emphase एक टिप्पणी है कि (सोचा था कि यह इतना कम नहीं है):

@echo off 

::GOTO comment macro 
set "REM{:=goto :}REM%%" 
::brackets comment macros 
set "REM{=rem/||(" & set "}REM=)" 

::testing 
echo not commented 1 

%REM{:% 
    multi 
    line 
    comment outside of brackets 
%:}REM% 

echo not commented 2 

%REM{:% 
    second multi 
    line 
    comment outside of brackets 
%:}REM% 

::GOTO macro cannot be used inside for 
for %%a in (first second) do (
    echo first not commented line of the %%a execution 
    %REM{% 
     multi line 
     comment 
    %}REM% 
    echo second not commented line of the %%a execution 
) 
+1

आप 'rem। || (' या 'rem^(' इसके बजाय। इरादा थोड़ा स्पष्ट है। मेरा अद्यतन उत्तर देखें। – dbenham

+0

@ डीबेनहम - हाँ इसे रीम के साथ छोटा करें। – npocmaka

+1

ओह, वर्ग और घुंघराले ब्रैकेट रूप सेक्सी हैं। अगर मैं केवल अपने लिए कोड लिख रहा था तो मैं इसका इस्तेमाल कर सकता हूं। लेकिन मुझे लगता है कि औसत उपयोगकर्ता इसे देखेगा और डब्ल्यूटीएफ कहेंगे। – dbenham