
Estoy intentando escribir un archivo por lotes en la unidad de mapa cuando es necesario, pero cada vez que lo ejecuto aparece un error:
(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))
Respuesta1
Aparte de su DRIV mal escrito (frente a DRIVE), tiene un problema de expansión retrasada.
Toda su construcción IF se trata como una única declaración compuesta que se analiza de una vez antes de ejecutar cualquier código. Esto es válido para cualquier bloque de código entre paréntesis.
La expansión porcentual ocurre antes de que la declaración se analice por completo, por lo que DRIVE aún no está definido y su segunda declaración IF se lee como
IF == C (net use * \\test1\common)
Debería poder ver cómo eso resulta en un error de sintaxis.
Una solución es permitir la expansión retrasada y el uso !drive!
en lugar de %drive%
. De esa manera se analiza toda la declaración y luego la variable se expande justo antes de ejecutar cada comando.
@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
)
Otra opción es usar GOTO o CALL para eliminar el bloque grande entre paréntesis y luego podrá usar de manera segura el porcentaje de expansión.
@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
Otra opción es usar CHOICE
en lugar de SET /P
y luego usar IF ERRORLEVEL
para probar el nivel de error devuelto sin necesidad de expansión variable. Tenga en cuenta que if errorlevel 3
es VERDADERO si el nivel de error es mayor o igual a 3. Por lo tanto, las pruebas IF deben realizarse en orden numérico descendente.
@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
)
)
Una ventaja de CHOICE sobre SET /P es que no tiene que preocuparse de que los usuarios ingresen una respuesta incorrecta: CHOICE fuerza una respuesta correcta.