我试图在需要时写入批处理文件来映射驱动器,但每当我运行它时都会收到错误:
(net was unexpected at this time
@echo off
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% == BPT ( SET /P Drive= C B G?
IF %Driv% == C (net use * \\test1\common)
IF %Driv% == G (net use * \\test1\global)
IF %Drive% == B (net use * \\test1\common && net use * \\test1\global))
答案1
除了拼写错误的 DRIV(与 DRIVE 不同)之外,您还遇到了扩展延迟的问题。
整个 IF 结构将被视为单个复合语句,在执行任何代码之前会一次性解析。对于任何带括号的代码块都是如此。
百分比扩展发生在语句完全解析之前,因此 DRIVE 尚未定义,并且您的第二个 IF 语句被读为
IF == C (net use * \\test1\common)
您应该能够看到这是如何导致语法错误的。
一种解决方案是启用延迟扩展并使用!drive!
而不是%drive%
。这样,整个语句被解析,然后在执行每个命令之前扩展变量。
@echo off
setlocal enableDelayedExpansion
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% == BPT (
SET /P Drive= C B G?
IF !Drive! == C net use * \\test1\common
IF !Drive! == G net use * \\test1\global
IF !Drive! == B net use * \\test1\common && net use * \\test1\global
)
另一个选择是使用 GOTO 或 CALL 来消除大括号块,然后您可以安全地使用百分比扩展
@echo off
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% neq BPT goto NotBPT
SET /P Drive= C B G?
IF %Drive% == C net use * \\test1\common
IF %Drive% == G net use * \\test1\global
IF %Drive% == B net use * \\test1\common && net use * \\test1\global
:NotBPT
另一个选项是使用CHOICE
而SET /P
不是 然后使用IF ERRORLEVEL
来测试返回的错误级别,而无需变量扩展。请注意,if errorlevel 3
如果错误级别大于或等于 3,则为 TRUE。因此,IF 测试必须按降序数字顺序进行。
@echo off
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% == BPT (
choice /c CBG
if errorlevel 3 (
net use * \\test1\global
) else if errorlevel 2 (
net use * \\test1\common
net use * \\test1\global
) else if errorlevel 1 (
net use * \\test1\common
)
)
CHOICE 相对于 SET /P 的一个优点是您不必担心用户输入错误的答案 - CHOICE 会强制输入正确的答案。