意外的“系统找不到指定的驱动器。”在批处理文件中

问题描述 投票:0回答:2

我的批处理文件 (Windows 7 x64) 出现问题。我已经设法将其减少为以下内容(有两个空注释行;是否有实际注释似乎并不重要):

@echo off

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

将其放入批处理文件中,然后不带参数运行它会产生以下输出:

A
The system cannot find the drive specified.
B

删除其中一根

::
行,或删除周围的
if
修复事物,以便获得预期的输出:

A
B

这是怎么回事?为什么要寻找驱动器?

编辑

感谢您到目前为止的回复。所以我的问题实际上可以归结为:

确定

::
是否表示“注释开始”或“驱动器号冒号”的规则是什么?

也许切换回

REM
来添加注释会更容易,这样就不会有歧义,但我确实发现
::
风格更容易阅读。

windows batch-file
2个回答
31
投票

这是批处理代码块中的一个不起眼的效果。

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

第二行必须是命令或简单标签,但不能是括号、双冒号或附加括号的内部命令。

MC ND 解释说

:
在这里就像普通的驱动器盘符一样使用,确实如此!
但仅在辅助行中,即使您可以通过
subst :: C:\
抑制错误,该行也会像标签一样处理(您无法启动任何内容)。

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

即使该行是标签,辅助行也接受

&

不合格样品

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

有时

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

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

判断 :: 是否表示“评论开始”的规则是什么 或“驱动器号冒号”?

第一个

::
始终是注释或标签,下一行始终是
drive letter colon


7
投票

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

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

::

示例:尝试

subst :: c:\
,然后
dir ::\

© www.soinside.com 2019 - 2024. All rights reserved.