डॉस बैच फ़ाइल में कई पंक्तियों पर टिप्पणी करना


98

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

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

इस समस्या का समाधान किस प्रकार से किया जा सकता है?

जवाबों:


184

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

goto comment
...skip this...
:comment

11
+1: इसके लिए "गोटो" का प्रयोग करना मज़ेदार है और यह काम करता है!
रेप -2-एच-

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

126

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

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

पुनरावृत्ति के चरणों को दोहराएं


6
अच्छी टिप। यह बहुत क्लीनर बनाता है।
व्योम

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

1
असहजता का क्या। पूरे ब्लॉक को अनट्रेंड करने के लिए किसी भी शॉर्टकट में।
भास्कर सिंह 18

2
@ भास्करसिंह नोटपैड ++ 7.5.6 के रूप में, आप बस पहले से ही टिप्पणी किए गए पाठ को उजागर कर सकते हैं; "Ctrl + Q" करें, और यह इसे अनलॉक्ड कर देगा
CreativiTimothy

यदि आपका मस्तिष्क अक्सर कमजोर की तरह मेरा याद करने के लिए है Ctrl-Q, में क्लिक करें Notepad++: Edit -> Comment/Uncomment
तिमो

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

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

अपडेट करें

डेंभम के जवाब में अपडेट ने मुझे कुछ विचार दिए। पहला - दो अलग-अलग मामले हैं जहां हमें मल्टी लाइन टिप्पणियों की आवश्यकता हो सकती है - एक ब्रैकेट के संदर्भ में जहां GOTO का उपयोग नहीं किया जा सकता है और इसके बाहर। ब्रैकेट्स के संदर्भ में हम एक और कोष्ठक का उपयोग कर सकते हैं यदि कोई ऐसी स्थिति है जो कोड को निष्पादित करने से रोकती है। तब भी कोड थ्रेड को पार्स किया जाएगा और कुछ सिंटैक्स त्रुटियों का पता लगाया जाएगा ( 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
)

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

@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 - हाँ रेम के साथ यह छोटा है।
npocmaka

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

@dbenham - आप सही हो सकते हैं। मैं %rem:%+ %:rem%रूप को भी शामिल कर सकता हूं इसे और अधिक स्पष्ट बनाने के लिए हालांकि यह ढीली हो जाएगी। केवल सी-स्टाइल के करीब होने के लिए स्लैश ...
npocmaka

1
@npocmaka यह कमाल है! मैंने अभी-अभी बैच स्क्रिप्टिंग पेचीदगियों का एक समूह सीखा, जो आपने किया था। सभी ब्लॉक टिप्पणी विधियों से मैं (बैच के लिए) अवगत हूं, यह सबसे मजबूत और चतुर प्रतीत होता है। हैक और शैली के संयोजन के लिए +1
जेरेड गोटे

10

एक अन्य विकल्प एक IF ब्लॉक में अवांछित लाइनों को घेरना है जो कभी भी सच नहीं हो सकता है

if 1==0 (
...
)

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

अद्यतन 2017-09-19

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

@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 के समाधान के इन प्रकारों में से एक का उपयोग कर सकते हैं । BREAK के बजाय REM का उपयोग इरादे को थोड़ा साफ करता है।

rem.||(
   remarks
   go here
)

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

1

केवल यह उल्लेख करना चाहते हैं कि pdub का GOTO समाधान पूरी तरह से सही नहीं है: कई बार टिप्पणी लेबल दिखाई देता है। मैं उदाहरण के रूप में इस प्रश्न से कोड को संशोधित करता हूं ।

@ECHO OFF
SET FLAG=1
IF [%FLAG%]==[1] (
    ECHO IN THE FIRST IF...
    GOTO comment
    ECHO "COMMENT PART 1"
:comment
    ECHO HERE AT TD_NEXT IN THE FIRST BLOCK
)

IF [%FLAG%]==[1] (
    ECHO IN THE SECOND IF...
    GOTO comment
    ECHO "COMMENT PART"
:comment
    ECHO HERE AT TD_NEXT IN THE SECOND BLOCK
)

आउटपुट होगा

IN THE FIRST IF...
HERE AT TD_NEXT IN THE SECOND BLOCK

कमांड ECHO यहाँ FIRST ब्लॉक में TD_NEXT पर छोड़ दी गई है।


0

@jeb

और इसे इस्तेमाल करने के बाद, स्टाडर दुर्गम होने लगता है

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

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

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

   echo hello Tunisia

  pause

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

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

(la redirection par 3> est spécial car elle persiste, va l'utiliser pour capturer le flux des erreurs 2> est on va le ट्रांसफार्मर en un flux persistant à l'ade 3> ceci va nous permettre d'avoir une gestion des erreur pour tout notre environement de script ..par la Suite si on veux recuperer le flux 'stderr' il faut faire une autre redirection du handle 2> au handle 1 - qui n'est autre que la कंसोल ..)


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

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

-1

इसे इस्तेमाल करे:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1, लेकिन यह क्यों काम करता है? और इसके इस्तेमाल के बाद, स्टैडर दुर्गम लगता है
jeb

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

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

3
मेरे पास एक सिद्धांत है कि विंडोज बैच में पुनर्निर्देशन कैसे काम करता है, और यह बताता है कि इस उत्तर में स्टेडर "स्थायी रूप से" अक्षम क्यों हो जाता है। सिद्धांत और परीक्षण dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.