18

バッチ ファイル (Windows 7 x64) に問題があります。私はそれを次のように減らすことができました (2 つの空のコメント行があります。実際のコメントがあるかどうかは問題ではないようです)。

@echo off

if /i [%1]==[] (
    echo A
    ::
    ::
    echo B
)

これをバッチ ファイルに入れて、パラメーターなしで実行すると、次の出力が生成されます。

A
The system cannot find the drive specified.
B

行の1つを::削除するか、周囲を削除すると、期待される出力が得られるようif修正されます。

A
B

何が起きてる?なぜドライブを探しているのですか?

編集

遠くまで回答ありがとうございます。だから私の質問は本当にこれに要約されます:

::「コメントの開始」または「ドライブ文字のコロン」を意味するかどうかを決定するためのルールは何ですか?

おそらく、コメントを追加するために元に戻す方が簡単REMなので、あいまいさの余地はありませんが、::スタイルは読みやすいと思います.

4

2 に答える 2

26

これは、バッチ コード ブロックでは目立たない効果です。

コード ブロックでは、1 行のラベルには常に、まったく異なる構文規則を持つ 2 行目が必要です ( 2行目に対して)。
SO: goto コマンドが機能しない

2 行目はコマンドまたは単純なラベルでなければなりませんが、括弧、二重コロン、または括弧が追加された内部コマンドは使用できません。

MC ND は、:ここでは通常のドライブ文字のように使用されていると説明しましたが、それは本当です!
ただし、2 行目のみで、 でエラーを抑制できてもsubst :: C:\、その行はラベルのように扱われます (何も開始できません)。

subst :: C:\
(
:label
::\windows\system32\calc.exe
)

&また、2 行目はラベルの場合でも受け付けます。

不合格サンプル

(
:Label at the end fails
)

(
:label
  ( 
    echo new Block fails
  )
echo ...
)

(
:label
:: Double colon fails
)

(
:label
echo( fails also, as now a file named "echo(" is searched for execution
)

そして今働いているもの

(
::Works
:with a "normal" label in the second line
)

(
:But this label! & echo This will not echo'd
:but & echo You can see this !
)

(
:label
echo or a simple command works too
)

コメント スタイル::として使用されることもありますが、2 行目を気にしないと、ブロック内で問題が発生する可能性があります。

編集:2番目の質問に答えるには

::が「コメントの開始」または「ドライブ文字のコロン」を意味するかどうかを判断するためのルールは何ですか?

最初の::行は常にコメントまたはラベルで、次の行は常にdrive letter colon.

于 2013-11-07T21:34:22.140 に答える
6

::は有効なドライブです。と同じように、c:またはd:しかし手紙は:

したがって、ラインは現在のドライブからドライブに変更しようとしています::

例: 試しsubst :: c:\てからdir ::\

于 2013-11-07T19:08:20.700 に答える