2012-03-21 9 views
11

estoy usando la secuencia de comandos por lotes a continuación y obtener un error(fue inesperado en este momento - escritura de la hornada

(era inesperada en este momento

Sé que el problema está en. la primera línea, pero no entiendo lo que está mal Cualquier idea

guión:.?

IF [%1]==[] (
    :LOOP1 
    SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local  Area Connection 2]?[y/n] 
    IF %isDefault%==y (
     SET from=1 
     SET step=1 
     SET to=10 
     SET lan="Local Area Connection 2" 
     GOTO :USERLOOP 
    ) 
    IF %isDefault%==n GOTO :END 
    GOTO :LOOP1 
) 

Respuesta

15

En realidad, el problema es no en la primera línea.

El problema es que cmd realiza la sustitución de variables inmediatamente cuando analiza la instrucción IF, incluido su cuerpo. Por lo tanto la línea:

IF %isDefault%==y (

es problemático porque isDefault no se establece cuando se analiza la IF instrucción externa, por lo que se convierte en:

IF ==y (

y por lo tanto se obtiene el error sobre ( ser inesperado. Puede solucionar esto habilitando la extensión de comando (SETLOCAL ENABLEDELAYEDEXPANSION) para expansión de variable de entorno demorado (consulte set /? para obtener más información). También puede reescribir su guión:

@ECHO OFF 
IF NOT "%1"=="" GOTO :EOF 

:LOOP1 
SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local Area Connection 2]?[y/n] 
IF "%isDefault%"=="y" (
    SET from=1 
    SET step=1 
    SET to=10 
    SET lan="Local Area Connection 2" 
    GOTO :USERLOOP 
) 
IF "%isDefault%"=="n" GOTO :EOF 
GOTO :LOOP1 

(. Hice algunos otros cambios, tales como el uso de la incorporada en el :EOF etiqueta en vez de :END)

+0

Quiere decir 'SETLOCAL ENABLEDELAYEDEXPANSION', por supuesto. –

+0

@AndriyM: Argh. Sí, por supuesto. Fijo. – jamesdlin

+0

Cambió drásticamente el comportamiento previsto con su primera instrucción IF. No puedo estar seguro, pero probablemente debería leer 'IF NOT"% ~ 1 "==" "GOTO: USERLOOP'.Está asumiendo que no hay código después de la etiqueta ': END '- quizás haya un código de limpieza al final que deba ejecutarse, por lo que' GOTO: EOF' puede no ser correcto. – dbenham

4

Como dijo jamesdlin, que es un problema con las variables vacías y también con retrasoExpansión.
Entonces la solución es simple al reemplazar %isDefault% con !isDefault!, esto funciona incluso si isDefault está vacío.

setlocal EnableDelayedExpansion 
IF [%1]==[] (
    :LOOP1 
    SET /P isDefault=Value Missing, do you want to use default values [1,1,10,Local  Area Connection 2]?[y/n] 
    IF !isDefault!==y (
     SET from=1 
     SET step=1 
     SET to=10 
     SET lan="Local Area Connection 2" 
     GOTO :USERLOOP 
    ) 
    IF !isDefault!==n GOTO :END 
    GOTO :LOOP1 
) 
+0

Jeb: qué malo que hayas conservado esa etiqueta goto dentro de un bloque IF :) Me doy cuenta de que el código funcionará bien tal como está escrito. Pero entrecortado obtendrá una sorpresa grosera si él/ella piensa que esto está bien, y luego hace lo mismo cuando hay una cláusula ELSE. @choppy: lea esta pregunta y mi respuesta para ver a qué me refiero: [(Windows batch) Ir a dentro si el bloque se comporta de manera muy extraña] (http://stackoverflow.com/questions/8481558/windows-batch-goto-within -si-bloquea-se comporta-muy-extrañamente) – dbenham

0

Tuve un problema muy similar y una construcción de código que me causaba mucho dolor por resolver. Mi mensaje de error era ". Fue inesperado en este momento" ...

Me tomó un par de días para encontrar otra consideración similar debido a este problema ... Consulte el siguiente problema y solución posterior aquí: ". was unexpected at this time" generated from batch script line 'if exist [file] (...

La solución fue simplemente el tratamiento de '(' y ')' en las líneas ECHO dentro de un bloque de instrucciones IF.

El punto es, considere el tratamiento de caracteres especiales como una posible fuente de problemas al solucionar problemas de declaraciones IF (y posiblemente FOR).

HTH alguien ...

Cuestiones relacionadas