意外"系统无法找到指定的驱动器." 在批处理文件中

Mat*_*dge 12 windows batch-file

我的批处理文件有问题(Windows 7 x64).我已设法将其减少到以下(有两个空的注释行;似乎没有关于是否有实际的注释):

@echo off

if /i [%1]==[] (
    echo A
    ::
    ::
    echo B
)
Run Code Online (Sandbox Code Playgroud)

将它放在批处理文件中,然后在没有参数的情况下运行它会产生以下输出:

A
The system cannot find the drive specified.
B
Run Code Online (Sandbox Code Playgroud)

删除的一个::线条,或删除周围if,修复让你获得预期的输出的事情:

A
B
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么要寻找驱动器?

编辑

感谢您的回复.所以我的问题可以归结为:

确定::"评论开始"或"驱动字母冒号"​​的含义是什么规则?

也许更容易切换回REM添加注释,因此没有模棱两可的余地,但我发现::风格更容易阅读.

jeb*_*jeb 21

这在批处理代码块中是一种令人讨厌的效果.

在代码块中,一行中的标签总是需要具有完全不同语法规则的辅助行(对于辅助行).
SO:goto命令不起作用

辅助行必须是命令或简单标签,但不能是括号,也不是双冒号,也不是附加括号的内部命令.

MC ND解释说:这里使用的是普通的驱动器号,这是真的!
但只有在辅助线上,甚至你可以用a来抑制错误subst :: C:\,这条线就像标签一样处理(你无法启动任何东西).

subst :: C:\
(
:label
::\windows\system32\calc.exe
)
Run Code Online (Sandbox Code Playgroud)

&即使行是标签,辅助行也会接受.

失败的样本

(
: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
)
Run Code Online (Sandbox Code Playgroud)

现在是工作的

(
::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
)
Run Code Online (Sandbox Code Playgroud)

有时::用作注释样式,如果您不关心辅助线,这可能会导致块内部出现问题.

编辑:回答你的第二个问题

确定::表示"评论开始"或"驱动字母冒号"​​的规则是什么?

第一个::总是注释或标签,在下一行它总是一个drive letter colon.

  • 正确的。错误出现在第二个`::`中,原因如下。第一行是一个标签,第二行应该是一个有效的命令,并且因为::可以被认为是有效的,所以它被执行。是的,您可以使用“start ::\windows\system32\calc.exe”启动某些内容。正如之前所评论的,并非系统的所有部分都可以处理它。 (2认同)

MC *_* ND 6

::是有效的驱动器。就像c:d:只是字母是:

因此,您的线路正在尝试从当前驱动器更改为驱动器 ::

示例:尝试subst :: c:\然后dir ::\