DOSバッチファイルの複数の行にコメントを付ける


98

巨大なMS DOSバッチファイルを作成しました。このバッチファイルをテストするには、いくつかの行のみを実行する必要があり、残りの行を非表示/コメントアウトします。

私はいくつかの既存のコメント行で始まる::ので、::すべてのコメントをスクランブルするため、これ以上使用できません。

この問題を解決するにはどうすればよいですか?

回答:


182

a gotoを使用してコードをスキップできます。

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

11
+1:これに "goto"を使用するのはおもしろいし、うまくいく!
rap-2-h

1
面白いのは、コマンドラインに実際のコメント定義がないことです。REMコメント行として行を受け入れることができません。出力が不明瞭になります
mkb

125

GOTOを使用する代わりに各行の先頭にREMを追加する場合は、Notepad ++を使用して、次の手順に従って簡単にこれを行うことができます。

  1. 行のブロックを選択します
  2. Ctrl-Qを押す

コメントを外す手順を繰り返します


6
いいヒント。とてもきれいになります。
Venom

1
うわー、notepad ++にこんな素晴らしい機能があることを知りませんでした!私はEclipseで「Ctrl + 7」に慣れているため、実際には本当にそれを逃しました。42まで投票;)
ダニーLo

1
コメント解除についてはどうですか。ブロック全体のコメントを解除するショートカットがあります。
Bhaskar Singh 2017

2
@BhaskarSingh Notepad ++ 7.5.6以降、コメント済みのテキストを単に強調表示することができます。「Ctrl + Q」を実行すると、コメントが解除されます
CreativiTimothy

覚えるのが私の脳のように弱いことが多い場合はCtrl-Q、クリックしてNotepad++くださいEdit -> Comment/Uncomment
Timo

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

gotoソリューションは優れたオプションですが、括弧内では機能しません(FORおよびIFコマンドを含む)。しかし、これは機能します。ただし、閉じ括弧FORIFコマンドの構文が無効になるので注意してください。これらは解析されます。

更新

dbenhamの回答の更新により、いくつかのアイデアが得られました。まず、複数行のコメントが必要になる2つの異なるケースがあります-GOTOを使用できないブラケットのコンテキストとその外側。インサイド括弧コンテキストthedeはまだ解析されますと、いくつかの構文エラーが検出されexecuted.Thoughコード(するコード防止の条件があるかどう我々は別のブラケットを使用することができFORIF不適切閉じ括弧、間違ったパラメータ展開が...)。だから、を可能であれば、GOTOを使用することをお勧めします。

ラベルとして使用されるマクロ/変数を作成することはできませんが、ブラケットのコメントにマクロを使用することは可能です。それでも、2つのトリックを使用して、GOTOコメントをより対称的で楽しいものにすることができます(少なくとも私にとって)。このために2つのトリックを使用します-1)ラベルの前に単一のシンボルを置くことができ、gotoはそれを見つけることができます(これがなぜなのか私にはわかりません。2): 変数名の最後にシングルを置くことができ、置換/サブトリング機能はトリガーされません(有効な拡張機能の下でも)。ブラケットコメントのマクロと組み合わせてWichを使用すると、どちらの場合もほとんど同じように見えます。

だからここに例があります(私がそれらを最も好きな順に):

長方形のブラケット

@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スタイルの混合(<リダイレクトがより高い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
)

それがコメントであることを強調するために(それほど短くないと思います):

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

@dbenham-はい、remの方が短いです。
npocmaka 2017

1
ああ、四角と中括弧の形はセクシーです。自分専用のコードを書いているのなら、それを使うかもしれません。しかし、私は平均的なユーザーがそれを見てWTFを言うと想像します。
dbenham 2017年

@dbenham-あなたは正しいかもしれません。魅力を失うことになりますが、%rem:%+ %:rem%フォームも含めてより明確にすることができます。または、Cスタイルに近づくためにスラッシュのみ...
npocmaka

1
@npocmakaこれはすごい!私は、あなたが何をしたのかを理解している間に、バッチスクリプトの複雑な要素を学びました。私が知っているすべてのブロックコメントメソッド(バッチ用)から、これは最も堅牢で賢いようです。ハックとスタイルを組み合わせるための+1
Jared Gotte 2017年

10

別のオプションは、真になることのない不要な行をIFブロックで囲むことです。

if 1==0 (
...
)

もちろん、ifブロック内では何も実行されませんが、解析されます。したがって、内部に無効な構文を含めることはできません。また、)エスケープまたは引用符で囲まない限り、コメントを含めることはできません。これらの理由により、受け入れられたGOTOソリューションはより信頼性が高くなります。(GOTOソリューションの方が速い場合もあります)

アップデート2017-09-19

これは、pdubのGOTOソリューションの外観を強化したものです。GOTOコメント構文を少し自己文書化する単純な環境変数「マクロ」を定義します。:labelsはバッチスクリプト内で一意にすることをお勧めしますが、同じバッチスクリプト内にこのような複数のコメントを埋め込むことは本当に問題ありません。

@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

:commentラベルが複数回出現する場合、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

最初のブロックのTD_NEXTにあるECHO HEREコマンドはスキップされます。


0

@jeb

これを使用した後、stderrにアクセスできないようです

いいえ、これを試してください:

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

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

   echo hello Tunisia

  pause

しかし、なぜそれが機能するのですか?

申し訳ありませんが、私はフレンチで質問に答えます:

(la redirection par 3> estspécialcar elle persiste、on va l'utiliser pour capturer leflux des erreurs 2> est on va le transform en unflux persistantàl'ade de 3> ceci va nous permettre d'avoir une gestion des erreur pour tout notre environement de script..par la suite si on veux recuperer leflux 'stderr' il faut faire une autre redirection du handle 2> au handle 1> qui n'est autre que la console ..)


1
私はフランス語を読むことはできませんが、最初のリダイレクトが終わった後、ストリーム2(stderr)が引き続き無効になっている理由に対処していないようです。dostips.com/forum/viewtopic.php?p=14612#p14612の 2つの連続した投稿に、実行可能な理論とテストケースがあります。
dbenham 2012年

(3>によるリダイレクトは永続的であるため特別です。エラーのフローをキャプチャするために使用します2>永続的なフローに変換します3>これにより、すべての管理エラーが発生します。環境スクリプト..フロー 'stderr'を回復する場合は、別のハンドルリダイレクト2>を処理して、a>をコンソール以外の何物でもないようにする必要があります..)
user96403

-1

これを試して:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1、しかしなぜそれが機能するのですか?これを使用した後、stderrにアクセスできないようです
jeb

1
-1エコー2> Nulが標準エラーストリームをNULにリダイレクトして埋め込んでいるため、これは「機能します」(3> Nul、4> Nulは実際の理由なしに補助ストリームをリダイレクトしています)。これは行をコメントアウトするのではなく、単にエラーメッセージが表示されるのを防ぎます。したがって、コマンドラインとして解釈できるものはすべて実行されます。
pdubs 2011

3
pdubsコメントは、コマンドがまだ実行されている(そして無効であるため失敗する)という点で部分的に正しいです。しかし、有効なコマンドは失敗することなく実行されます。したがって、これはコード行をコメント化するための良い解決策ではありません。ストリーム2(stderr)が「永久に」無効になる理由についての説明は正しくありません。
dbenham 2012年

3
Windowsバッチでリダイレクトがどのように機能するかについての理論があり、この回答でstderrが「永続的に」無効になる理由が説明されています。理論とテストは、dostips.com
forum / viewtopic.php?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.