314

私はいくつかのバッチ ファイルを作成しており、非常に有益なこのユーザー ガイドに出くわしました。それが私に示したことの1つは、行は だけでなく でもコメントできるということでしREM::。それは言います:

バッチ コードのコメントは、二重コロンを使用して作成できます。これは、ラベルがリダイレクト シンボルの前に処理されるため、REM コマンドを使用するよりも優れています。::<remark>問題は発生しませんがrem <remark>、エラーが発生します。

それでは、なぜ私が目にするほとんどのガイドと例でREMコマンドを使用しているのでしょうか? ::すべてのバージョンの Windows で動作しますか?

4

10 に答える 10

388

tl;dr: REMバッチ ファイルにコメントを埋め込む方法として文書化され、サポートされています。


::は本質的にジャンプできない空白のラベルですが、REMは何もしない実際のコマンドです。どちらの場合も (少なくとも Windows 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

于 2012-09-13T13:56:18.510 に答える
174

REM のコメント

AREMは、最初のトークンの終わりでない場合、行末に複数行のキャレットを付けて、完全な行を注釈することができます。

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

ただし、 のような既存のファイルの問題を回避するにはREMREM.batまたはREM;.bat変更されたバリアントのみを使用する必要があります。

REM^;<space>Comment

また、キャラクター;には次のいずれかも許可されます;,:\/=

REM は(Win7SP1 で 100000 コメント行でテスト)よりも約6 倍遅いです。 通常の使用では重要ではありません (コメント行ごとに 58µs 対 360µs)::

:: を含むコメント

A::は常に行末キャレットを実行します。

:: This is also a comment^
echo This line is also a comment

ラベルとコメント ラベル ::には、括弧ブロックに特別なロジックがあります。
それらは常に 2 行にまたがりますSO: goto command not working .
そのため、構文エラーの原因となることが多いため、括弧ブロックにはお勧めしません。

行は表示されますがECHO ONREMコメント行は表示されません::

どちらも行の残りの部分をコメントアウトすることはできないため、シンプル%~ にすると構文エラーが発生します。

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%
)

パフォーマンスREM::%= =%

要するに:

  • ::%= =%同じ性能を持っているようです
  • REM~よりも 50% 長い時間がかかる::
  • ブロックでは、特にループREMは時間を消費するだけ::ですが、ブロックが解析されるとキャッシュされたブロックから削除されるため、 時間を消費しません

詳細については、SO: Question about Comments in Batch *.bat files and speedを参照してください。

于 2012-09-13T14:02:00.030 に答える
29

もう 1 つの方法は、常に何も展開されない変数展開としてコメントを表現することです。

や など=の文書化されていない動的変数を除き、変数名に を含めることはできません。変数名の最初の位置の後に を含めることはできません。そのため、括弧で囲まれたブロック内にコメントを含めるために、次のように使用することがあります。
%=ExitCode%%=C:%=

::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

リード=は必要ありませんが、対称性のために好きです。

次の 2 つの制限があります。

1) コメントに含めることはできません%

2) コメントに含めることはできません:

于 2012-09-13T16:49:30.100 に答える
26

::labelを使用してコメントを作成し、コードをコメントアウトできることに気付いた後、私にREMは単純に醜いように見えました。前述のように、ダブルコロンはブロックされたコード内で使用すると問題を引き起こす可能性がありますが、ラベルとラベルを()交互に使用することで回避策を発見しました:::space

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

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

のように見苦しくなくREM、実際にコードにちょっとしたスタイルを追加します。

したがって、私が使用するコード ブロックの外側と内側では、 と::を交互に使用します。:::

ちなみに、バッチ ファイルのヘッダーのように大量のコメントがある場合は、gotoコメントを ing するだけで、特殊なコマンドや文字を完全に回避できます。これにより、必要な方法やスタイルのマークアップを使用できますが、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 など、任意の表記法を使用してください。

于 2012-09-17T09:43:55.713 に答える
7

このページは、「::」を使用すると、特定の制約の下でより高速になることを示しています

于 2016-01-14T13:32:15.043 に答える
4

良い質問です...私もこの機能を長い間探していました...

いくつかのテストとトリックの後、より良い解決策はより明白なものであると思われます...

--> 私が見つけた最良の方法は、パーサーの完全性が失敗するのを防ぐことで、REM を再利用することです。

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^ 
)
于 2014-03-03T21:24:50.897 に答える
3

ジェイムズ・K、私が言ったことのかなりの部分で私が間違っていたことを申し訳ありません. 私が行ったテストは次のとおりです。

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

これは、交互の説明を満たしていますが、「現時点では予想外でした」で失敗します。エラーメッセージ。

今日さらにテストを行ったところ、交互が重要ではないことがわかりましたが、キーは偶数行であり、2 つの行が 2 つのコロン (::) で始まり、2 つのコロンで終わっていません。 . 次の点を考慮してください。

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

これはうまくいきます!

しかし、これも考慮してください:

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

コマンドで終了する場合、コメントの数が偶数であるという規則は適用されないようです。

残念ながら、これは私がそれを使いたいかどうかわからないほど十分です。

本当に、最善の解決策であり、私が考えることができる最も安全な方法は、Notepad++ のようなプログラムが REM を二重コロンとして読み取り、ファイルの保存時に二重コロンを REM ステートメントとして書き戻す場合です。しかし、私はそのようなプログラムを知りませんし、それを行う Notepad++ のプラグインも知りません。

于 2013-03-26T19:39:27.823 に答える
2

このトピックに関する非常に詳細で分析的な議論は、このページで入手できます

コード例とさまざまなオプションの長所/短所があります。

于 2014-08-31T08:31:48.417 に答える