El código relevante se ve así:

cd /d %~dp0

if exist filename.txt (
    echo %date% %time% *** text... >> filename2.txt
    echo ==============================
    echo ===  text.......           ===
    echo ===  text.......           ===
    echo ===  text....... (text...) ===
    echo ===  text (text... 
    echo ===  text...).
    :loop
        set /p "varx= text: "
    if "%varx%" neq "xxxx" goto loop

 ... more script...

)

He buscado soluciones por todas partes ...

La cuestión es que esto ESTUVO funcionando durante mucho tiempo ... luego cambié lo que pensé que eran cosas inofensivas y no puedo entender dónde está el problema ...

Un problema tan oscuro que resolver ...

0
sw.smayer97 14 nov. 2017 a las 10:44

2 respuestas

La mejor respuesta

BIEN ... Estoy publicando esto como una sesión de preguntas y respuestas ... porque resolví mi propio problema (me tomó un par de días de prueba y error para reducir y solucionar el problema). Espero que esto también ayude a alguna pobre alma y les ahorre muchos dolores de cabeza y algunos mechones de cabello ...

Lo que más me hizo pensar fue la segunda viñeta con respecto al mal manejo de los bucles dentro de las declaraciones If ... PERO esa no era la razón real sino algo similar ...

Resulta que el problema fue con el uso de "('y / o') 'en las líneas ECHO ...

Pensé que esto era inofensivo ... Utilizo corchetes en las líneas ECHO en muchos lugares, y estas líneas estaban entre 10 y 15 líneas por debajo de donde se estaba generando el mensaje de error, así que, naturalmente, no estaba pensando que esto fuera en absoluto el fuente.

PERO resulta que al intérprete claramente no le gusta el uso de '(' o ')' incluso en líneas ECHO si se usan dentro de los bloques de instrucciones If . Todavía debe tratarlos como caracteres especiales en ese contexto ... claramente no los ignora ...

Solución:

O quitando el '(' y ')' de esas 3 líneas arriba O simplemente REM esas líneas resolvieron el problema y el mensaje de error desapareció ... finalmente todo está bien ...

Por cierto, es posible que algo similar también se aplique a las declaraciones FOR (recuerdo vagamente haber leído algo sobre FOR actuando de manera extraña también).

Así que hay que pensar.

2
sw.smayer97 14 nov. 2017 a las 08:11

La declaración compuesta completa desde la if exist ... ( hasta el paréntesis de cierre es una code block.

Dentro de un code block, las etiquetas no están permitidas, un ) sin escape terminará el bloque y cualquier %var% se reemplaza por el valor de esa variable cuando se encuentra el bloque .

Necesitas call la rutina :loop (la forma más fácil)

if exist filename.txt (
    echo %date% %time% *** text... >> filename2.txt
    echo ==============================
    echo ===  text.......           ===
    echo ===  text.......           ===
    echo ===  text....... (text...^) ===
    echo ===  text (text... 
    echo ===  text...^).
    call :loop

 ... more script...

)

... etc.

Ir a: eof

: loop set / p "varx = text:" if "% varx%" neq "xxxx" goto loop

Ir a: eof

Tenga en cuenta que goto :eof está definido como "ir al final del archivo" (los dos puntos son obligatorios )

Tenga en cuenta que call tiene dos puntos antes de la etiqueta; esto indica que es una rutina interna; reside en este archivo por lotes

Tenga en cuenta que cada ) ahora se escapa por un ^ que hace que ) sea un carácter ordinario, no un terminador de instrucciones.

Probablemente haya eliminado un redirector; cualquier echo dentro del procedimiento call ed se recopilará en la salida redirigida, es decir, si tiene

(
whatever...
)>filename

Luego, cualquier dato echo ed dentro de code block será redirigido al archivo - incluyendo echo es dentro de un call procedimiento ed. Puede redirigir explícitamente un echo dentro de dicho bloque o procedimiento usando echo to console>con por ejemplo.

Incluir cualquier secuencia de líneas entre paréntesis, convertirlo en un code block permite la redirección de la salida echo ed del bloque, por lo que

(
 echo this
 echo that
)>filename

Crea un nuevo filename que contiene la suma de los echo es en lugar de tener que agregar >>filename a cada línea. Obviamente, >> en lugar de > se anexará a cualquier archivo existente de la manera habitual.

2
Magoo 14 nov. 2017 a las 09:11