การแสดงความคิดเห็นหลายบรรทัดในไฟล์แบตช์ DOS


98

ฉันเขียนไฟล์ MS DOS Batch ขนาดใหญ่แล้ว ในการทดสอบไฟล์แบตช์นี้ฉันต้องดำเนินการบางบรรทัดเท่านั้นและต้องการซ่อน / แสดงความคิดเห็นที่เหลืออยู่

ฉันมีบรรทัดความคิดเห็นที่มีอยู่แล้วเริ่มต้นด้วย::เหตุนี้ฉันจึงไม่สามารถใช้งานได้::อีกต่อไปเพราะมันจะแย่งความคิดเห็นทั้งหมด

ฉันจะแก้ปัญหานี้ได้อย่างไร?

คำตอบ:


186

คุณสามารถใช้gotoเพื่อข้ามรหัส

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

11
+1: มันตลกดีที่ใช้ "goto" สำหรับสิ่งนี้และมันก็ได้ผล!
rap-2-h

1
ฉันคิดว่าสิ่งที่ตลกคือไม่มีคำจำกัดความความคิดเห็นที่แท้จริงในบรรทัดคำสั่งฉันไม่สามารถยอมรับREMบรรทัดเป็นบรรทัดความคิดเห็นได้มันทำให้เอาต์พุตไม่ชัดเจน
mkb

126

หากคุณต้องการเพิ่ม REM ที่จุดเริ่มต้นของแต่ละบรรทัดแทนที่จะใช้ GOTO คุณสามารถใช้ Notepad ++ เพื่อทำสิ่งนี้ได้ง่ายๆโดยทำตามขั้นตอนต่อไปนี้:

  1. เลือกบล็อคของเส้น
  2. กด Ctrl-Q

ทำซ้ำขั้นตอนเพื่อไม่ใส่ข้อคิดเห็น


6
เคล็ดลับที่ดี ทำให้สะอาดขึ้นมาก
Venom

1
ว้าวไม่รู้ notepad ++ มีคุณสมบัติที่ดีขนาดนี้! พลาดจริงๆเพราะฉันคุ้นเคยกับ `` Ctrl + 7 'ใน Eclipse โหวตมากถึง42 ;)
Danny Lo

1
สิ่งที่เกี่ยวกับความคิดเห็น ในนั้นทางลัดใด ๆ เพื่อยกเลิกการแสดงความคิดเห็นทั้งบล็อก
Bhaskar Singh

2
@BhaskarSingh สำหรับ Notepad ++ 7.5.6 คุณสามารถเพียงแค่เน้นข้อความที่แสดงความคิดเห็นแล้ว ทำ "Ctrl + Q" และจะยกเลิกการแสดง
ความคิดเห็น

ถ้าสมองของคุณมักจะอ่อนแอเช่นเหมืองที่ต้องจำไว้Ctrl-Qให้คลิกที่:Notepad++ Edit -> Comment/Uncomment
Timo

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

แม้ว่าgotoโซลูชันจะเป็นตัวเลือกที่ดี แต่จะไม่ทำงานในวงเล็บ (รวมถึงคำสั่ง FOR และ IF) แต่สิ่งนี้จะ แม้ว่าคุณควรระมัดระวังเกี่ยวกับการปิดวงเล็บและไวยากรณ์สำหรับFORและIFคำสั่งที่ไม่ถูกต้องเนื่องจากจะถูกแยกวิเคราะห์

อัปเดต

การอัปเดตในคำตอบของ dbenhamทำให้ฉันมีแนวคิดบางอย่าง ประการแรก - มีสองกรณีที่แตกต่างกันที่เราต้องการความคิดเห็นแบบหลายบรรทัด - ในบริบทของวงเล็บที่ไม่สามารถใช้ GOTO และภายนอกได้ บริบทภายในวงเล็บเราสามารถใช้วงเล็บอื่นได้หากมีเงื่อนไขที่ทำให้โค้ดไม่สามารถเรียกใช้งานได้แม้ว่าโค้ดจะยังคงถูกแยกวิเคราะห์และจะตรวจพบข้อผิดพลาดทางไวยากรณ์บางอย่าง ( FOR, IFวงเล็บปิดไม่ถูกต้อง, การขยายพารามิเตอร์ผิด ... ) ดังนั้น ถ้าเป็นไปได้ควรใช้ GOTO จะดีกว่า

แม้ว่าจะไม่สามารถสร้างมาโคร / ตัวแปรที่ใช้เป็นป้ายกำกับได้ แต่ก็เป็นไปได้ที่จะใช้มาโครสำหรับความคิดเห็นของวงเล็บยังสามารถใช้สองเทคนิคทำให้ความคิดเห็นของ GOTO มีความสมดุลและน่าพอใจยิ่งขึ้น (อย่างน้อยสำหรับฉัน) สำหรับสิ่งนี้ฉันจะใช้สองเทคนิค - 1)คุณสามารถใส่สัญลักษณ์เดียวไว้ด้านหน้าป้ายกำกับและ goto จะยังคงสามารถค้นหาได้ (ฉันไม่รู้ว่าทำไมถึงเป็นเช่นนี้คำแนะนำของฉันคือการค้นหาไดรฟ์) 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 และ C ( <ไม่สามารถใช้งานได้เนื่องจากการเปลี่ยนเส้นทางมีค่าปริยายสูงกว่า*ไม่สามารถใช้ได้เนื่องจาก%*):

@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 "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

@dbenham - ใช่ด้วย rem มันสั้นกว่า
npocmaka

1
Ooh รูปแบบวงเล็บเหลี่ยมและลอนนั้นเซ็กซี่ ถ้าฉันเขียนโค้ดเพื่อตัวเองเท่านั้นฉันอาจใช้มัน แต่ฉันคิดว่าผู้ใช้ทั่วไปจะเห็นและพูดว่า WTF
dbenham

@dbenham - อาจจะใช่ฉันสามารถรวม%rem:%+ %:rem%แบบฟอร์มด้วยเพื่อให้ชัดเจนยิ่งขึ้นแม้ว่ามันจะหลวมไปหรือไม่ก็แค่เฉือนให้เข้าใกล้สไตล์ C มากขึ้นเท่านั้น ...
npocmaka

1
@npocmaka นี่มันสุดยอดมาก! ฉันเพิ่งเรียนรู้ความซับซ้อนของการเขียนสคริปต์แบบกลุ่มในขณะที่หาสิ่งที่คุณทำ จากวิธีการบล็อกความคิดเห็นทั้งหมดที่ฉันทราบ (สำหรับชุดงาน) วิธีนี้ดูเหมือนจะมีประสิทธิภาพและชาญฉลาดที่สุด +1 สำหรับการรวมแฮ็กและสไตล์
Jared Gotte

10

อีกทางเลือกหนึ่งคือการใส่เส้นที่ไม่ต้องการในบล็อก IF ที่ไม่สามารถเป็นจริงได้

if 1==0 (
...
)

แน่นอนว่าจะไม่มีการดำเนินการใน if block แต่จะถูกแยกวิเคราะห์ ดังนั้นคุณจึงไม่มีไวยากรณ์ที่ไม่ถูกต้องอยู่ภายใน นอกจากนี้ความคิดเห็นไม่สามารถมีได้)เว้นแต่จะมีการหลีกเลี่ยงหรือยกมา ด้วยเหตุผลดังกล่าวโซลูชัน GOTO ที่ได้รับการยอมรับจึงมีความน่าเชื่อถือมากกว่า (โซลูชัน GOTO อาจเร็วกว่าด้วย)

อัปเดต 2017-09-19

นี่คือการเพิ่มประสิทธิภาพของเครื่องสำอางเพื่อแก้ปัญหา GOTO pdub ของ ฉันกำหนดตัวแปรสภาพแวดล้อมอย่างง่าย "มาโคร" ที่ทำให้ไวยากรณ์ข้อคิดเห็นของ 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ก็ได้ การใช้ REM แทน BREAK ทำให้เจตนาชัดเจนขึ้นเล็กน้อย

rem.||(
   remarks
   go here
)

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

1

แค่อยากบอกว่าโซลูชัน GOTO ของ pdubไม่ถูกต้องทั้งหมดในกรณี: ป้ายกำกับความคิดเห็นปรากฏขึ้นหลายครั้ง ฉันแก้ไขโค้ดจากคำถามนี้เป็นตัวอย่าง

@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 ที่นี่ที่ TD_NEXT ในบล็อกแรกถูกข้ามไป


0

@ เจ๊บ

และหลังจากใช้สิ่งนี้ดูเหมือนว่า stderr จะไม่สามารถเข้าถึงได้

ไม่ลองสิ่งนี้:

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

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

   echo hello Tunisia

  pause

แต่ทำไมมันถึงได้ผล?

ขอโทษฉันตอบคำถามด้วยความบ้าคลั่ง:

(la การเปลี่ยนเส้นทางพาร์ 3> est spécial car elle persiste, on va l'utiliser pour capturer le flux des erreurs 2> est on va le transformer en un flux persistant à l'ade de 3> ceci va nous permettre d'avoir insu gestion des erreur pour tout notre environement de script..par la suite si บน veux recuperer le flux 'stderr' il faut faire uns autre redirection du handle 2> au handle 1> qui n'est autre que la console .. )


1
ฉันอ่านภาษาฝรั่งเศสไม่ได้ แต่ดูเหมือนว่าคุณจะพูดไม่ได้ว่าทำไมสตรีม 2 (stderr) จึงยังคงถูกปิดใช้งานหลังจากการเปลี่ยนเส้นทางครั้งแรกสิ้นสุดลง ฉันมีความสามารถทำงานได้ทฤษฎีและการทดสอบกรณีใน 2 โพสต์ติดต่อกันdostips.com/forum/viewtopic.php?p=14612#p14612
dbenham

(การเปลี่ยนเส้นทางโดย 3> เป็นแบบพิเศษเพราะมันยังคงมีอยู่เราจะใช้มันเพื่อจับกระแสของข้อผิดพลาด 2> มันจะเปลี่ยนเป็นโฟลว์ต่อเนื่องไปที่ ade จาก 3> ซึ่งจะทำให้เรามีข้อผิดพลาดในการจัดการ สคริปต์สภาพแวดล้อม .. ถ้าคุณต้องการกู้คืนโฟลว์ 'stderr' เราต้องทำการเปลี่ยนทิศทางหมายเลขอ้างอิงอื่น 2> เพื่อจัดการกับ> ซึ่งไม่มีใครอื่นนอกจากคอนโซล .. )
user96403

-1

ลองสิ่งนี้:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1 แต่ทำไมมันถึงได้ผล? และหลังจากใช้สิ่งนี้ดูเหมือนว่า stderr จะไม่สามารถเข้าถึงได้
jeb

1
-1 สิ่งนี้ "ใช้งานได้" เนื่องจาก echo 2> Nul กำลังเปลี่ยนเส้นทางสตรีมข้อผิดพลาดมาตรฐานไปยัง NUL โดยฝัง (3> Nul, 4> Nul กำลังเปลี่ยนเส้นทางสตรีมเสริมโดยไม่มีเหตุผลที่แท้จริง) สิ่งนี้ไม่ได้แสดงความคิดเห็นในบรรทัดเป็นเพียงการป้องกันไม่ให้ข้อความแสดงข้อผิดพลาด ดังนั้นอะไรก็ตามที่สามารถตีความเป็นบรรทัดคำสั่งจะยังคงทำงานอยู่
pdubs

3
ความคิดเห็น pdubs ถูกต้องบางส่วนเนื่องจากคำสั่งยังคงดำเนินการอยู่ (และล้มเหลวเนื่องจากไม่ถูกต้อง) แต่คำสั่งที่ถูกต้องจะดำเนินการโดยไม่ล้มเหลว ดังนั้นนี่ไม่ใช่วิธีแก้ปัญหาที่ดีสำหรับการแสดงความคิดเห็นเกี่ยวกับโค้ด คำอธิบายสาเหตุที่สตรีม 2 (stderr) ปิดใช้งาน "ถาวร" นั้นไม่ถูกต้อง
dbenham

3
ฉันมีทฤษฎีว่าการเปลี่ยนเส้นทางทำงานอย่างไรในชุด Windows และอธิบายว่าทำไม stderr จึงปิดใช้งาน "ถาวร" ในคำตอบนี้ ทฤษฎีและการทดสอบอยู่ใน 2 โพสต์ติดต่อกันที่dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.