巨大なMS DOSバッチファイルを作成しました。このバッチファイルをテストするには、いくつかの行のみを実行する必要があり、残りの行を非表示/コメントアウトします。
私はいくつかの既存のコメント行で始まる::
ので、::
すべてのコメントをスクランブルするため、これ以上使用できません。
この問題を解決するにはどうすればよいですか?
巨大なMS DOSバッチファイルを作成しました。このバッチファイルをテストするには、いくつかの行のみを実行する必要があり、残りの行を非表示/コメントアウトします。
私はいくつかの既存のコメント行で始まる::
ので、::
すべてのコメントをスクランブルするため、これ以上使用できません。
この問題を解決するにはどうすればよいですか?
回答:
GOTOを使用する代わりに各行の先頭にREMを追加する場合は、Notepad ++を使用して、次の手順に従って簡単にこれを行うことができます。
コメントを外す手順を繰り返します
Ctrl-Q
、クリックしてNotepad++
くださいEdit -> Comment/Uncomment
。
break||(
code that cannot contain non paired closing bracket
)
goto
ソリューションは優れたオプションですが、括弧内では機能しません(FORおよびIFコマンドを含む)。しかし、これは機能します。ただし、閉じ括弧FOR
とIF
コマンドの構文が無効になるので注意してください。これらは解析されます。
更新
dbenhamの回答の更新により、いくつかのアイデアが得られました。まず、複数行のコメントが必要になる2つの異なるケースがあります-GOTOを使用できないブラケットのコンテキストとその外側。インサイド括弧コンテキストthedeはまだ解析されますと、いくつかの構文エラーが検出されexecuted.Thoughコード(するコード防止の条件があるかどう我々は別のブラケットを使用することができFOR
、IF
不適切閉じ括弧、間違ったパラメータ展開が...)。だから、を可能であれば、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
)
rem.||(
またはrem^ (
代わりに使用できます。その意図は少し明確です。私の更新された答えを見てください。
%rem:%
+ %:rem%
フォームも含めてより明確にすることができます。または、Cスタイルに近づくためにスラッシュのみ...
別のオプションは、真になることのない不要な行を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
)
: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コマンドはスキップされます。
@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 ..)
これを試して:
@echo off 2>Nul 3>Nul 4>Nul
ben ali
mubarak
gadeffi
..next ?
echo hello Tunisia
pause