
Я пытаюсь записать пакетный файл для отображения диска, когда это необходимо, но всякий раз при запуске я получаю ошибку:
(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
TRUE, если уровень ошибки больше или равен 3. Поэтому тесты 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 заставляет дать правильный ответ.