web-dev-qa-db-ja.com

DOSバッチファイルの複数行のコメント

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

::で始まる既存のコメント行があります。したがって、すべてのコメントをスクランブルするため、::は使用できなくなりました。

この点で助けていただければ幸いです。事前に感謝、ジェイ

87
user219628

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

goto comment
...skip this...
:comment
158
pdubs

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

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

コメントを解除する手順を繰り返します

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

gotoソリューションは良いオプションですが、動作しません 括弧内 (FORおよびIFコマンドを含む)。しかし、これは動作します。ただし、FORおよびIFコマンドは、解析されるため、閉じ括弧と無効な構文には注意する必要があります。

Update

dbenham's 回答の更新により、いくつかのアイデアが得られました。まず、複数行のコメントが必要な2つの異なるケースがあります。GOTOを使用できないブラケットのコンテキストとその外側です。ブラケットコンテキスト内では、コードの実行を妨げる条件がある場合、別のブラケットを使用できます。コードは引き続き解析され、いくつかの構文エラーが検出されます(FORIF、improperly closed括弧、間違ったパラメーター展開..)。したがって、可能であればGOTOを使用することをお勧めします。

ラベルとして使用されるマクロ/変数を作成することはできませんが、ブラケットのコメントにマクロを使用することは可能ですが、さらに2つのトリックを使用して、GOTOコメントをより対称的で楽しいものにします(少なくとも私にとっては)。このために、2つのトリックを使用します-1)ラベルの前に1つのシンボルを置くと、gotoはそれを見つけることができます(Iなぜこれなのかわからない。ドライブを探しているのだと思う)。 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
)

Toemphaseこれはコメントです(それほど短くないと思います):

@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
)
12
npocmaka

別のオプションは、決して成り立たない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
)
10
dbenham

pdubのGOTOソリューション は、:commentラベルが複数回出現する場合には完全に正しくないことに言及したいだけです。例として this question のコードを変更します。

@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 HERE AT TD_NEXT IN THE FIRST BLOCKはスキップされます。

1
Charles Chiou

@jeb

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

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

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

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

   echo hello Tunisia

  pause

しかし、なぜ機能するのか?

ごめんなさい、私はフランス語で質問に答えます:

2スクリプトを使用して環境を整える.. veuxレキュペラールフラックス 'stderr' il faut faire une autre redirection du handle 2> au handle 1> qui n'est autre que la console ..)

0
walid2mi