(此时网络是意外的

(此时网络是意外的

我试图在需要时写入批处理文件来映射驱动器,但每当我运行它时都会收到错误:

(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

另一个选项是使用CHOICESET /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 会强制输入正确的答案。

相关内容