IT-Swarm.Net

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

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

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

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

255
MikeFHay

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 नामक एक बचा हुआ लेबल है।.

327
Joey

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

एक 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

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

REM :: की तुलना में 6 गुना धीमा है (100000 टिप्पणी लाइनों के साथ Win7SP1 पर परीक्षण किया गया)।.
एक सामान्य उपयोग के लिए यह महत्वपूर्ण नहीं है (58 versuss बनाम 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 %~ ...

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

@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%
)
151
jeb

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

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

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

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

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

वैसे, टिप्पणियों के बड़े हिस्से के लिए, जैसे कि आपकी बैच फ़ाइल के शीर्ष लेख में, आप अपनी टिप्पणियों पर केवल gotoing द्वारा विशेष आदेशों और वर्णों से पूरी तरह से बच सकते हैं। इस बात का उपयोग करें कि आप अपने इच्छित मार्कअप की किसी भी विधि या शैली का उपयोग करते हैं, इस तथ्य के बावजूद कि यदि 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, @' s इत्यादि का प्रयोग करें।.

25
James K

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

परिवर्तनीय नाम में = शामिल नहीं हो सकता है, जैसे कि अनिर्दिष्ट गतिशील चर
%=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) टिप्पणी में : नहीं हो सकता

25
dbenham

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

7
mishal153

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

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

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

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^ 
)
4
ZEE

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

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

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

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

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

यह काम!

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

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

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

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

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

3
Darin

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

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

2
BiLaL