बैच फ़ाइलों में मुझे कौन सी टिप्पणी शैली का उपयोग करना चाहिए?


284

मैं कुछ बैच फ़ाइलों को लिख रहा हूं, और मैं इस उपयोगकर्ता गाइड में चला गया , जो काफी जानकारीपूर्ण रहा है। एक बात यह है कि मुझे पता था कि लाइनों के साथ न केवल टिप्पणी की जा सकती है REM, बल्कि इसके साथ भी ::। इसे कहते हैं:

बैच कोड में टिप्पणियाँ एक डबल-कोलोन का उपयोग करके बनाई जा सकती हैं, यह आरईएम कमांड का उपयोग करने से बेहतर है क्योंकि लेबल को पुनर्निर्देशन प्रतीकों से पहले संसाधित किया जाता है। ::<remark>कोई समस्या नहीं है लेकिन rem <remark>त्रुटियों का उत्पादन करता है।

फिर, अधिकांश मार्गदर्शक और उदाहरण जो मैं देख रहा हूं, REMकमांड का उपयोग क्यों करते हैं ? ::विंडोज के सभी संस्करणों पर काम करता है ?


3
सिर्फ रिकॉर्ड के लिए, मैंने समस्याओं को देखा है जब "रिम" का उपयोग विंडोज 98 के तहत पुनर्निर्देशन के साथ एक लाइन पर टिप्पणी करने के लिए किया जाता है।
डिगर

6
एक तरफ के रूप में, @ डिगर की टिप्पणी के अनुसार: लिंक किया गया गाइड डॉस ( command.exe) के लिए है, न कि cmd.exe, NT कमांड प्रोसेसर जैसा कि विंडोज 2000 पर पाया गया है। rem <remark>उत्तरार्द्ध में ठीक से काम करता है ( कम से कम विंडोज एक्सपी के बाद से ), और REMसमग्र रूप से आधिकारिक बाधा और सबसे सुरक्षित विकल्प है; जबकि ::इसके फायदे हैं, यह अंततः एक हैक है जो (…)ब्लॉकों के अंदर समस्याग्रस्त है (जैसा कि यहां कई उत्तरों में चर्चा की गई है)।
mklement0


1
तो, REM के साथ किस स्थिति में त्रुटियां होती हैं?
टीएस

जवाबों:


360

tl; dr: REM बैच फ़ाइलों में टिप्पणियों को एम्बेड करने के लिए प्रलेखित और समर्थित तरीका है।


::अनिवार्य रूप से एक खाली लेबल है जिसे कभी भी नहीं जोड़ा जा सकता है, जबकि REMएक वास्तविक आदेश है जो सिर्फ कुछ नहीं करता है। न तो मामले में (कम से कम विंडोज 7 पर) पुनर्निर्देशन ऑपरेटरों की उपस्थिति एक समस्या का कारण बनती है।

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


यहां एक उदाहरण है जहां ::एक FORलूप में एक समस्या पैदा होती है ।

यह उदाहरण आपके डेस्कटॉप पर कॉल की गई फ़ाइल में काम नहीं करेगा test.bat:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    ::echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

जबकि यह उदाहरण एक टिप्पणी के रूप में सही ढंग से काम करेगा:

@echo off
for /F "delims=" %%A in ('type C:\Users\%username%\Desktop\test.bat') do (
    REM echo hello>C:\Users\%username%\Desktop\text.txt
)
pause

फ़ाइल में आउटपुट पुनर्निर्देशित करने का प्रयास करते समय समस्या प्रतीत होती है। मेरा सबसे अच्छा अनुमान है कि यह ::एक पलायन लेबल के रूप में व्याख्या कर रहा है :echo


1
@ वायर्ड: क्या बैच फ़ाइल और उसके स्थान का नाम प्रासंगिक है (फ़ाइल के नाम और स्थान के साथ रीडायरेक्ट करने के लिए?)। अन्यथा उदाहरण को सरल बनाना अच्छा होगा।
जॉय

15
टीएल को जोड़ने वाला अच्छा स्पर्श;
ड्र

2
यदि लाइन में चर उपयोग में देरी हो रही है, :: कुछ त्रुटि संदेशों का कारण होगा, उदाहरण के लिए विशिष्ट डिस्क ड्राइवर नहीं मिल सकता है ..... तो बेहतर तो REM का उपयोग करें।
स्कॉट चू

2
:: टिप्पणियाँ पार्स की जाती हैं, और विशेष वर्ण> | टिप्पणी समाप्त करें, और निम्न पाठ टिप्पणी नहीं है।
मॉस

4
@ संतोष सही है। उदाहरण के लिए, %VAR%चर का विस्तार किया जाता है। मान लें कि आपके पास (गलत तरीके से) है set TARGET=C:\Program Files (x86)\"foo.exe", और DO(..)आपके पास एक अभिव्यक्ति के अंदर आपको :: echo %TARGET%एक त्रुटि मिलेगी क्योंकि पूरी अभिव्यक्ति का मूल्यांकन होने से पहले(x86) विस्तारित हो जाता है, जिससे एक अमान्य अभिव्यक्ति और बहुत ही अकथनीय त्रुटियां हो जाती हैं (इस मामले में "Microsoft इस समय अप्रत्याशित था" ” )। तुम भी जरूरत नहीं है या अपनी अभिव्यक्ति में। A वास्तविक टिप्पणी नहीं है, हालांकि है। DO(..)|>::REM
हाबिल

161

रेम के साथ टिप्पणियाँ

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

REM This is a comment, the caret is ignored^
echo This line is printed

REM This_is_a_comment_the_caret_appends_the_next_line^
echo This line is part of the remark

कुछ वर्णों के बाद REM कुछ .:\/=अलग काम करता है, यह किसी एम्परसेंड पर टिप्पणी नहीं करता है, इसलिए आप इसे इनलाइन टिप्पणी के रूप में उपयोग कर सकते हैं।

echo First & REM. This is a comment & echo second

लेकिन मौजूदा फ़ाइलों के साथ समस्याओं से बचने के लिए REM, REM.batया REM;.batकेवल एक संशोधित संस्करण का उपयोग किया जाना चाहिए।

REM^;<space>Comment

और चरित्र के ;लिए भी अनुमति दी जाती है;,:\/=

आरईएम लगभग 6 गुना धीमी है ::(100000 टिप्पणी लाइनों के साथ Win7SP1 पर परीक्षण किया गया)।
एक सामान्य उपयोग के लिए यह महत्वपूर्ण नहीं है (58µs बनाम 360 pers प्रति टिप्पणी लाइन)

टिप्पणियाँ के साथ ::

एक ::हमेशा कार्यान्वित एक लाइन अंत कैरट।

:: This is also a comment^
echo This line is also a comment

लेबल और भी टिप्पणी लेबल :: कोष्ठक ब्लॉक में एक विशेष तर्क है।
वे हमेशा दो पंक्तियाँ SO: गोटो कमांड काम नहीं करते हैं
इसलिए उन्हें कोष्ठक खंडों के लिए अनुशंसित नहीं किया जाता है, क्योंकि वे अक्सर वाक्यविन्यास त्रुटियों का कारण होते हैं।

ECHO ONएक REMरेखा के साथ दिखाया गया है, लेकिन एक पंक्ति के साथ टिप्पणी नहीं की गई है::

दोनों वास्तव में शेष पंक्ति पर टिप्पणी नहीं कर सकते हैं, इसलिए एक सरल %~एक वाक्यविन्यास त्रुटि का कारण होगा।

REM This comment will result in an error %~ ...

लेकिन आरईएम एक विशेष चरण में बैच पार्सर को रोकने में सक्षम है, विशेष चरित्र चरण पूरा होने से पहले ही।

@echo ON
REM This caret ^ is visible

आप कमांड लाइन के अंत में एक टिप्पणी जोड़ने के लिए & REM या & :: का उपयोग कर सकते हैं । यह दृष्टिकोण काम करता है क्योंकि 'और' एक ही लाइन पर एक नया कमांड पेश करता है।

प्रतिशत के साथ टिप्पणियाँ% = टिप्पणी =%

प्रतिशत संकेतों के साथ एक टिप्पणी शैली मौजूद है।

वास्तव में ये परिवर्तनशील हैं लेकिन इनका विस्तार कुछ भी नहीं है।
लेकिन लाभ यह है कि उन्हें एक ही पंक्ति में रखा जा सकता है, यहां तक ​​कि बिना &
समान संकेत सुनिश्चित करता है, कि ऐसा कोई चर मौजूद नहीं हो सकता है।

echo Mytest
set "var=3"     %= This is a comment in the same line=%

बैच मैक्रोज़ के लिए प्रतिशत शैली की सिफारिश की जाती है, क्योंकि यह रनटाइम व्यवहार को नहीं बदलता है, क्योंकि मैक्रो परिभाषित होने पर टिप्पणी को हटा दिया जाएगा।

set $test=(%\n%
%=Start of code=% ^
echo myMacro%\n%
)

2
यह ध्यान दिया जाना चाहिए कि %=टिप्पणियां उद्धरण चिह्नों के साथ बारीक हैं, अर्थात विस्तार करने set foo=bar %=bazमें परिणाम , जैसा कि करता है , जबकि केवल परिणाम के रूप में विस्तार करना है। foobar %=bazset foo="bar" %=bazset "foo=bar" %=bazfoobar
लास्टस्टार 007

3
@ LastStar007: हमेशा उद्धरण शैली set "foo=bar"का उपयोग करना सामान्य रूप से सिफारिश करने योग्य है, क्योंकि यह सबसे मजबूत रूप है जो स्पष्ट रूप से मूल्य को चित्रित करता है। मुद्दा आप का वर्णन कर रहे हैं में निहित है setके व्यवहार, और के लिए विशिष्ट नहीं %= … =%टिप्पणियाँ: जब तक आप उपयोग "var=val"के हवाले से, setसब कुछ इस प्रकार है कि मानता है =(पंक्ति के अंत के माध्यम से खाली स्थान के अनुगामी या, यदि लागू हो सहित मूल्य,, की शुरुआत अगले इनलाइन कमांड)।
mklement0

28

एक अन्य विकल्प टिप्पणी को एक चर विस्तार के रूप में व्यक्त करना है जो हमेशा कुछ भी नहीं फैलता है।

वैरिएबल नाम शामिल नहीं हो सकते हैं =, जैसे कि अनिर्दिष्ट गतिशील चर
%=ExitCode%और %=C:%। कोई चर नाम कभी भी =1 स्थिति के बाद नहीं हो सकता है । इसलिए मैं कभी-कभी एक कोष्ठक के भीतर टिप्पणियों को शामिल करने के लिए निम्नलिखित का उपयोग करता हूं:

::This comment hack is not always safe within parentheses.
(
  %= This comment hack is always safe, even within parentheses =%
)

इन-लाइन टिप्पणियों को शामिल करने के लिए भी यह एक अच्छी विधि है

dir junk >nul 2>&1 && %= If found =% echo found || %= else =% echo not found

अग्रणी =आवश्यक नहीं है, लेकिन मुझे पसंद है अगर समरूपता के लिए।

दो प्रतिबंध हैं:

1) टिप्पणी में नहीं हो सकता %

2) टिप्पणी में नहीं हो सकता :


जबरदस्त हंसी! इसे एक ओवरसाइज़्ड वेरिएबल बनाएं! प्रतिभाशाली! %=ExitCode%? साफ। प्रति दिन कुछ नया सीखें!
जेम्स के

आप का मतलब है कि अनुगामी =आवश्यक है। लेकिन ऐसा होता नहीं दिख रहा है।
जेम्स के

4
@JamesK - मैं अनुगामी का उपयोग करता हूं =ताकि% = ExitCode =% जैसी कोई चीज "टिप्पणी" हो और न कि कोई गतिशील चर। मैं एक शैली का उपयोग करना पसंद करता हूं जो हमेशा काम करती है (पाठ्यक्रम के उत्तर के तल पर उल्लिखित सीमाओं को छोड़कर)।
डेबनहम

डायनामिक चर की खोज के लिए stackoverflow.com/a/20169219/1689714 देखें (जैसे% = ExitCode%% = ExitCodeAscii%% = C:%% = D:%% __ CD___% आदि), उनका क्या मतलब है, वे कैसे हैं सेट हैं, आदि ..
कीरोन हार्डी

25

के बाद मुझे एहसास हुआ कि मैं ::टिप्पणी करने के लिए लेबल का उपयोग कर सकता हूं और कोड बाहर टिप्पणी कर सकता हूं REMबस मुझे सादे बदसूरत लग रहा था। जैसा कि उल्लेख किया गया है कि डबल-कोलोन ()अवरुद्ध कोड के अंदर उपयोग किए जाने पर समस्याएं पैदा कर सकता है , लेकिन मैंने लेबल ::और के बीच बारी-बारी से एक काम की खोज की है:space

:: This, of course, does
:: not cause errors.

(
  :: But
   : neither
  :: does
   : this.
)

यह बदसूरत की तरह नहीं है REM, और वास्तव में आपके कोड में एक छोटी शैली जोड़ता है।

इसलिए मेरे द्वारा उपयोग किए जाने वाले कोड ब्लॉक के बाहर ::और उनके बीच मैं वैकल्पिक रूप से ::और :

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

@echo off
goto :TopOfCode

=======================================================================
COOLCODE.BAT

Useage:
  COOLCODE [/?] | [ [/a][/c:[##][a][b][c]] INPUTFILE OUTPUTFILE ]

Switches:
       /?    - This menu
       /a    - Some option
       /c:## - Where ## is which line number to begin the processing at.
         :a  - Some optional method of processing
         :b  - A third option for processing
         :c  - A forth option
  INPUTFILE  - The file to process.
  OUTPUTFILE - Store results here.

 Notes:
   Bla bla bla.

:TopOfCode
CODE
.
.
.

का उपयोग कभी क्या आप चाहते हैं अंकन *, @'s आदि।


आप /?इस मेनू को प्रिंट करने के लिए स्विच को कैसे संभालेंगे ?
होंग

1
@hoang सेटलोकल ENABLEDELAYEDEXPANSION <NEWLINE> सेट var =% ~ 1 <NEWLINE> इको फर्स्ट परम%% 1 <NEWLINE> IF! VAR! == "/?" (गोटो उपयोग) <NEWLINE>: USAGE <NEWLINE> इको ब्ला ब्ला .. <NEWLINE>
GL2014

16
जब आप कोई पंक्ति सम्मिलित करते हैं या हटाते हैं, तो एकल और डबल कॉलोन को वैकल्पिक करना एक सिरदर्द होना चाहिए।

@ GL2014 मूल रूप से आप कह रहे हैं "आप इस मेनू को प्रिंट नहीं करते हैं "। आपके उदाहरण कोड को उपयोग नोटों की प्रत्येक पंक्ति के लिए प्रतिध्वनि की आवश्यकता होती है। जेम्स के का जवाब इस हद तक भ्रामक है कि यह सुझाव देता है कि उपयोग किए गए नोटों को लिखित रूप में मुद्रित करने का कोई तरीका है।
टिम्बो

1
@ टिंबो मैंने इस जवाब के:PrintHelp लिए एक सबरूटीन ( ) लिखा है जो वास्तव में @hoang क्या मांगता है। मैं मार्कर के रूप में <HELP> और </ HELP> का उपयोग करता हूं लेकिन आप जो भी सूट करते हैं उसका उपयोग कर सकते हैं।
cdlvcdlv

21

यह उत्तर इस पृष्ठ पर कई महान उत्तरों के व्यावहारिक सारांश का प्रयास करता है :

जेब का शानदार जवाब विशेष उल्लेख के योग्य है, क्योंकि यह वास्तव में गहराई में जाता है और कई धार मामलों को कवर करता है।
विशेष रूप से, वह बताते हैं कि एक गलत चर / पैरामीटर संदर्भ जैसे नीचे दिए गए किसी भी समाधान %~को तोड़ सकता है - जिसमें लाइनें भी शामिल हैंREM


संपूर्ण-पंक्ति टिप्पणियाँ - केवल सीधे समर्थित शैली:

  • REM(या उसके मामले में विविधता) केवल आधिकारिक टिप्पणी निर्माण है , और सबसे सुरक्षित विकल्प है - जॉय का सहायक उत्तर देखें

  • ::एक (व्यापक रूप से इस्तेमाल किया गया) हैक है , जिसमें पेशेवरों और विपक्ष हैं :


यदि आप उपयोग करना चाहते हैं:: , तो आपके पास ये विकल्प हैं:

  • या तो : सुरक्षित होने के लिए, (...)ब्लॉकों के अंदर एक अपवाद बनाएं और REMवहां का उपयोग करें , या पूरी तरह से टिप्पणियों को अंदर न रखें (...)
  • या : अंदर के सुरक्षित उपयोग के लिए दर्द निवारक नियमों को::(...) याद करें , जिन्हें निम्नलिखित स्निपेट में संक्षेप में प्रस्तुत किया गया है:
@echo off

for %%i in ("dummy loop") do (

  :: This works: ONE comment line only, followed by a DIFFERENT, NONBLANK line.
  date /t

  REM If you followed a :: line directly with another one, the *2nd* one
  REM would generate a spurious "The system cannot find the drive specified."
  REM error message and potentially execute commands inside the comment.
  REM In the following - commented-out - example, file "out.txt" would be
  REM created (as an empty file), and the ECHO command would execute.
  REM   :: 1st line
  REM   :: 2nd line > out.txt & echo HERE

  REM NOTE: If :: were used in the 2 cases explained below, the FOR statement
  REM would *break altogether*, reporting:
  REM  1st case: "The syntax of the command is incorrect."
  REM  2nd case: ") was unexpected at this time."

  REM Because the next line is *blank*, :: would NOT work here.

  REM Because this is the *last line* in the block, :: would NOT work here.
)

अन्य टिप्पणी शैलियों का अनुकरण - इनलाइन और मल्टी-लाइन:

ध्यान दें कि इन शैलियों में से कोई भी सीधे बैच भाषा द्वारा समर्थित नहीं है , लेकिन अनुकरण किया जा सकता है ।


इनलाइन टिप्पणियाँ :

* नीचे दिए गए कोड स्निपेट verएक मनमाना आदेश के लिए स्टैंड-इन के रूप में उपयोग करते हैं , ताकि प्रयोग को सुविधाजनक बनाया जा सके।
* SETइनलाइन टिप्पणियों के साथ कमांड को सही ढंग से काम करने के लिए , name=valueभाग को डबल-कोट करें ; जैसे, SET "foo=bar"[1]

इस संदर्भ में हम दो उपप्रकारों को अलग कर सकते हैं:

  • ईओएल टिप्पणियां ([टू-द-एंड-ऑफ-लाइन), जिसे एक कमांड के बाद रखा जा सकता है, और हमेशा लाइन के अंत तक फैल सकता है (फिर से, जेब के जवाब के सौजन्य से ):

    • ver & REM <comment>इस तथ्य का लाभ उठाता है कि REMएक मान्य कमांड है और &इसका उपयोग मौजूदा के बाद एक अतिरिक्त कमांड को रखने के लिए किया जा सकता है।
    • ver & :: <comment>काम करता है, लेकिन वास्तव में केवल (...)ब्लॉकों के बाहर प्रयोग करने योग्य है , क्योंकि इसका सुरक्षित उपयोग ::स्टैंडअलोन का उपयोग करने से भी अधिक सीमित है ।
  • इंट्रा-लाइन टिप्पणियां , जिन्हें एक लाइन पर कई कमांड के बीच या आदर्श रूप से दिए गए कमांड के अंदर भी रखा जाता है।
    इंट्रा-लाइन टिप्पणियां सबसे अधिक लचीला (एकल-पंक्ति) रूप हैं और परिभाषा के अनुसार ईओएल टिप्पणियों के रूप में भी इस्तेमाल किया जा सकता है।

    • ver & REM^. ^<comment^> & verआदेशों के बीच एक टिप्पणी डालने की अनुमति देता है (फिर से, जेब के जवाब के सौजन्य से ), लेकिन ध्यान दें कि कैसे <और कैसे -की >जरूरत है ^, क्योंकि निम्नलिखित वर्ण। : इस्तेमाल किया नहीं जा सकता है के रूप में है< > | (जबकि छोड़ा जाएगा &या &&या ||शुरू अगले आदेश)।

    • %= <comment> =%, जैसा कि डेंभम के महान जवाब में विस्तृत है, सबसे लचीला रूप है , क्योंकि इसे एक कमांड के अंदर रखा जा सकता है (तर्कों के बीच)
      यह चर-विस्तार वाक्यविन्यास का लाभ उठाता है जो यह सुनिश्चित करता है कि अभिव्यक्ति हमेशा खाली स्ट्रिंग तक फैलती है - जब तक कि टिप्पणी पाठ में न तो %और न ही:
      जैसे हों REM, %= <comment> =%बाहर और अंदर दोनों (...)ब्लॉकों में अच्छी तरह से काम करता है , लेकिन यह अधिक नेत्रहीन विशिष्ट है; एकमात्र डाउन-साइड्स यह है कि टाइप करना कठिन है, गलत तरीके से वाक्यविन्यास प्राप्त करना आसान है, और व्यापक रूप से ज्ञात नहीं है, जो तकनीक का उपयोग करने वाले स्रोत कोड की समझ में बाधा डाल सकता है।


मल्टी-लाइन (पूरी-लाइन ब्लॉक) टिप्पणियाँ :

  • जेम्स के का उत्तर बताता है कि एक gotoबयान का उपयोग कैसे करें और एक लेबल को मनमाने ढंग से लंबाई और सामग्री की बहु-पंक्ति टिप्पणी को हटाने के लिए (जो कि उनके मामले में वह उपयोग की जानकारी को संग्रहीत करने के लिए उपयोग करता है)।

  • ज़ी का जवाब दिखाता है कि मल्टी-लाइन टिप्पणी बनाने के लिए "नल लेबल" का उपयोग कैसे किया जाता है , हालांकि सभी आंतरिक लाइनों को समाप्त करने के लिए देखभाल की जानी चाहिए ^

  • Rob van der Woude के ब्लॉग पोस्ट में एक और कुछ अस्पष्ट विकल्प का उल्लेख किया गया है जो आपको एक फ़ाइल को अनियंत्रित टिप्पणी लाइनों के साथ समाप्त करने की अनुमति देता है : एक उद्घाटन (केवल उस सब कुछ का कारण बनता है जिसे नजरअंदाज करने के बाद आता है , जब तक कि इसमें एक गैर शामिल नहीं है (गैर-) ^-escaped) ), यानी, जब तक कि ब्लॉक बंदहो


[1] का उपयोग करना SET "foo=bar", यानी नाम और को दोहरे उद्धरण चिह्नों डाल - चर निर्धारित करने =और मूल्य संयुक्त - जैसे आदेशों में आवश्यक है SET "foo=bar" & REM Set foo to bar., ताकि यह सुनिश्चित करने के लिए कि क्या इस प्रकार अगले आदेश के लिए चर मूल्य (अप इरादा, इस मामले में एक एकल स्थान) गलती से इसका हिस्सा नहीं बनता है।
(एक तरफ के रूप में: SET foo="bar"न केवल समस्या से बचना होगा, यह दोहरे उद्धरण मूल्य का हिस्सा बना देगा )।
ध्यान दें कि यह समस्या अंतर्निहित है SETऔर यहां तक कि मूल्य के बाद आकस्मिक अनुगामी व्हाट्सएप पर लागू होती है , इसलिए यह हमेशाSET "foo=bar" दृष्टिकोण का उपयोग करने की सलाह दी जाती है ।


7

यह पृष्ठ बताता है कि "::" का उपयोग कुछ बाधाओं के तहत तेज हो जाएगा। चुनने पर विचार करने के लिए बस एक चीज


2
यह सच है, कम से कम Win7SP1 के लिए, इससे ::अधिक से अधिक 6 गुना तेज हो सकता हैREM
जेब

4

अच्छा सवाल ... मैं भी लंबे समय के लिए इस कार्यक्षमता के लिए देख रहा हूँ ...

कई परीक्षणों और चालों के बाद ऐसा लगता है कि बेहतर समाधान अधिक स्पष्ट है ...

-> मुझे ऐसा करने का सबसे अच्छा तरीका मिला, पार्सर अखंडता को रोकने में विफल रहा, रेम का पुन: उपयोग कर रहा है:

echo this will show until the next REM &REM this will not show

आप "NULL LABEL" ट्रिक के साथ मल्टीलाइन का भी उपयोग कर सकते हैं ... (निरंतरता के लिए लाइन के अंत में ^ मत भूलना)

::(^
this is a multiline^
comment... inside a null label!^
dont forget the ^caret at the end-of-line^
to assure continuity of text^ 
)

3

जेम्स के, मुझे खेद है कि मैंने जो कहा था, उसके उचित हिस्से में मैं गलत था। मैंने जो परीक्षण किया वह निम्नलिखित था:

@ECHO OFF
(
  :: But
   : neither
  :: does
   : this
  :: also.
)

यह बारी-बारी से आपके वर्णन से मिलता है, लेकिन इस समय ") के साथ असफल था।" त्रुटि संदेश।

मैंने आज कुछ परीक्षण किया और पाया कि बारी-बारी से चाबी नहीं है, लेकिन ऐसा प्रतीत होता है कि कुंजी में समान संख्या में रेखाएं हैं, दोहरी कॉलन से शुरू होने वाली पंक्ति में कोई भी दो लाइनें नहीं हैं: (:) :) और दोहरे कॉलनों में समाप्त नहीं होता है । निम्नलिखित को धयान मे रखते हुए:

@ECHO OFF
(
   : But
   : neither
   : does
   : this
   : cause
   : problems.
)

यह काम!

लेकिन इस पर भी विचार करें:

@ECHO OFF
(
   : Test1
   : Test2
   : Test3
   : Test4
   : Test5
   ECHO.
)

कमांड में समाप्त होने पर टिप्पणियों की एक समान संख्या होने का नियम लागू नहीं होता है।

दुर्भाग्य से यह सिर्फ गिलहरी पर्याप्त है कि मुझे यकीन नहीं है कि मैं इसका उपयोग करना चाहता हूं।

वास्तव में, सबसे अच्छा समाधान, और सबसे सुरक्षित जिसके बारे में मैं सोच सकता हूं, वह यह है कि अगर नोटपैड ++ जैसे कार्यक्रम आरईएम को डबल कॉलन के रूप में पढ़ेंगे और फिर फाइल को सहेजे जाने पर आरईएम बयानों के रूप में डबल कॉलन वापस लिखेंगे। लेकिन मुझे इस तरह के कार्यक्रम की जानकारी नहीं है और मैं नोटपैड ++ के लिए किसी भी प्लगइन्स के बारे में नहीं जानता।


2

विषय पर एक बहुत विस्तृत और विश्लेषणात्मक चर्चा THIS पृष्ठ पर उपलब्ध है

इसके उदाहरण कोड और विभिन्न विकल्पों के पक्ष / विपक्ष हैं।


1
आपको उत्तर में दिए गए लिंक की सामग्री को संक्षेप में प्रस्तुत करना चाहिए। अन्यथा इसे "लिंक ओनली उत्तर" कहा जाता है, और यदि लिंक गायब हो जाता है तो यह पूरी तरह से बेकार है। इस मामले में, जिस पृष्ठ को इंगित किया गया है वह इसमें हास्यप्रद है कि यह धीमी फ्लॉपी डिस्क से बैच फ़ाइलों की पठन गति को अनुकूलित करने के आधार पर अपनी पसंद बनाता है :)
GreenAsJade

0

बैच फ़ाइल में टिप्पणी करने के कई तरीके हैं

1) रेम का उपयोग करना

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

2) लेबल :, ::या :;आदि का उपयोग करना ।

के लिए :: comment, ': टिप्पणी' एक अमान्य लेबल नाम है क्योंकि यह एक अमान्य चरित्र से शुरू होता है । हालांकि एक लेबल के बीच में एक बृहदान्त्र का उपयोग करना ठीक है। यदि कोई स्थान लेबल के प्रारंभ में शुरू होता है, तो उसे हटा दिया : labelजाता है :label। यदि लेबल के बीच में कोई स्थान या कोई कॉलन दिखाई देता है, तो शेष नाम का अर्थ यह नहीं है कि यदि दो लेबल हैं :f:ooऔर :f rr, दोनों की व्याख्या की जाएगी :fऔर फ़ाइल में केवल बाद में परिभाषित लेबल के लिए कूद जाएगा। बाकी लेबल प्रभावी रूप से एक टिप्पणी है। यहां ::सूचीबद्ध कई विकल्प हैं । आप कभी भी gotoया callएक ::fooलेबल नहीं कर सकते । goto :fooऔर goto ::fooकाम नहीं करेगा।

वे कोड ब्लॉक के बाहर ठीक काम करते हैं लेकिन कोड ब्लॉक में लेबल के बाद, अमान्य या नहीं, एक मान्य कमांड लाइन होनी चाहिए। :: commentवास्तव में एक और वैध कमांड है। यह एक कमांड के रूप में व्याख्या करता है, न कि लेबल के रूप में; आदेश में पूर्वता है। ::वॉल्यूम पर सीडी लगाने के लिए कौन सी कमांड है , जो आपके द्वारा निष्पादित किए जाने पर काम करेगी subst :: C:\, अन्यथा आपको वॉल्यूम त्रुटि नहीं मिल सकती है। इसीलिए :;यकीनन बेहतर है क्योंकि इसे इस तरह से व्याख्यायित नहीं किया जा सकता है, और इसलिए इसकी जगह एक लेबल के रूप में व्याख्या की जाती है, जो मान्य कमांड के रूप में कार्य करता है। यह पुनरावर्ती नहीं है, अर्थात, अगले लेबल को इसके बाद कमांड की आवश्यकता नहीं है। इसलिए वे दोहों में आते हैं।

आपको लेबल जैसे उदाहरण के बाद एक मान्य कमांड प्रदान करने की आवश्यकता है echo something। कोड ब्लॉक में एक लेबल को कम से कम एक वैध कमांड के साथ आना होता है, इसलिए लाइनें दो के जोड़े में आती हैं। )अगली पंक्ति में एक स्थान या समापन कोष्ठक होने पर आपको एक अप्रत्याशित त्रुटि मिलेगी । यदि दो ::पंक्तियों के बीच एक स्थान है तो आपको एक अवैध वाक्यविन्यास त्रुटि मिलेगी।

आप इस ::तरह से टिप्पणी में कैरट ऑपरेटर का उपयोग कर सकते हैं :

@echo off

echo hello
(
   :;(^
   this^
   is^
   a^
   comment^
   )
   :;
)
   :;^
   this^
   is^
   a^
   comment
   :;
) 

लेकिन आपको :;ऊपर बताए गए कारण के लिए अनुगामी की आवश्यकता है।

@echo off

(
echo hello
:;
:; comment
:; comment
:;
)
echo hello

यह तब तक ठीक है जब तक एक समान संख्या है। यह निस्संदेह टिप्पणी करने का सबसे अच्छा तरीका है - 4 लाइनों के साथ और :;। आपके साथ ऐसी :;कोई भी त्रुटि नहीं है जिसका उपयोग करके 2> nulया दबाए जाने की आवश्यकता है subst :: C:\। आप subst :: C:\वॉल्यूम का उपयोग नहीं कर पाए त्रुटि को दूर जाने के लिए, लेकिन इसका मतलब है कि आपको अपनी कार्यशील निर्देशिका को बनने से रोकने के लिए C: कोड में भी रखना होगा ::\

एक पंक्ति के अंत में टिप्पणी करने के लिए जिसे आप कर सकते हैं command &::या कर सकते हैं command & rem comment, लेकिन फिर भी एक सम संख्या होनी चाहिए, जैसे:

@echo off

(
echo hello & :;yes
echo hello & :;yes
:;
)

echo hello

पहले echo hello & :;yesकी अगली पंक्ति पर एक वैध कमांड है लेकिन दूसरा & :;yesनहीं है, इसलिए इसे एक यानी की आवश्यकता है :;

3) एक अमान्य पर्यावरण चर का उपयोग करना

%= comment =%। एक बैच फ़ाइल में, पर्यावरण चर जो परिभाषित नहीं होते हैं उन्हें स्क्रिप्ट से हटा दिया जाता है। यह उन्हें बिना उपयोग के एक पंक्ति के अंत में उपयोग करना संभव बनाता है &। यह एक अमान्य पर्यावरण चर का उपयोग करने के लिए कस्टम है अर्थात एक जिसमें एक समान चिह्न होता है। अतिरिक्त समान की आवश्यकता नहीं है, लेकिन यह सममित दिखता है। इसके अलावा, "=" से शुरू होने वाले चर नाम अनिर्धारित गतिशील चर के लिए आरक्षित हैं। वे गतिशील चर "=" के साथ कभी समाप्त नहीं होते हैं, इसलिए टिप्पणी के शुरू और अंत दोनों में "=" का उपयोग करके, नाम संघर्ष की कोई संभावना नहीं है। टिप्पणी में %या नहीं हो सकता है :

@echo off 
echo This is an example of an %= Inline Comment =% in the middle of a line.

4) एक आदेश के रूप में, nul को stderr को पुनर्निर्देशित करना

@echo off
(
echo hello
;this is a comment 2> nul
;this is another comment  2> nul
)

5) एक फ़ाइल के अंत में, एक अप्रकाशित कोष्ठक के बाद सब कुछ एक टिप्पणी है

@echo off
(
echo hello
)

(this is a comment
this is a comment
this is a comment
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.