Ms-Dos - Problema con declaración de variables

 
Vista:

Problema con declaración de variables

Publicado por Alfredo San Martín (8 intervenciones) el 23/02/2007 13:46:57
Hola a toda la comunidad LWP:

Estoy haciendo un scrip (o bash) en DOS bajo Windows 2000.

El cuerpo de mi código tiene dos FOR y un IF. Pero necesito integrarle un segundo IF el cual quiero que funcione de acuerdo a un valor booleano.

Para ello se me ocurrió declarar una variable cualquiera, ejemplo:

set b=true

Y luego de acuerdo al resultado que me entregue un IF, cambio el valor de b a "false".

El problema es que no me cambia el valor de "b"

Hice la siguiente prueba:

set b=true
echo %b%
pause

set b=false
echo %b%
pause

==================SALIDA==================
true
Presione qualquier tecla para continuar...
true
Presione qualquier tecla para continuar...
==========================================

Como se ve, la variable "b" no cambia su valor.

Encontré información con respecto a este problema:

=======================HELP SET DOS==========================
Finalmente, se ha añadido compatibilidad para la expansión de la variable
retardada.

Se hace a través del modificador de línea de comandos /V

cmd /v

La expansión de la variable de entorno es útil para tratar con las
limitaciones de la expansión actual, las cuales ocurren cuando una línea de
texto es leída, y no cuando se ejecuta. El siguiente ejemplo demuestra el
problema con la expansión de la variable inmediata:

establecer VAR=antes
si "%VAR%" == "antes" (
establecer VAR=después;
si "%VAR%" == "después" @echo Si esto se ve, significa que funcionó
)

nunca mostrará el mensaje, dado que %VAR% en las opciones BOTH IF es
substituido cuando la primera opción IF es leída, y dado que
lógicamente incluye el cuerpo de IF, que es una opción compuesta. De esta
manera,IF, dentro de la opción compuesta está realmente comparando "antes"
con "después" lo cuál nunca será igual.
===============================================================

Ingresé el comando cmd /v [ENTER]

Luego probé, pero de igual manera no me permite cambiar el valor de una variable.

Alguna sugerencia?

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con declaración de variables

Publicado por Alfredo San Martín (8 intervenciones) el 23/02/2007 14:07:05
Recalco que esto me ocurre solo dentro de Iteraciones o Condiciones.

Fuera de los FOR o IF el comando SET funciona perfectamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con declaración de variables

Publicado por Antoni Masana (295 intervenciones) el 26/02/2007 07:10:50
El SET dentro de un FOR o un IF no acaba de estar muy bien resuelto, da bastantes problemas. La solucion que encontre es volver a los origenes, es decir en lugar de esto:

IF %VAR% == BIEN (
SET VAR_2=PASO-1
ECHO "Texto - 1"
) ELSE (
SET VAR_2=PASO-2
ECHO "Texto - 2"
)


Esto siembre funciona:

IF not %VAR% == BIEN goto ELSE
SET VAR_2=PASO-1
ECHO "Texto - 1"
GOTO ENDIF
:ELSE
SET VAR_2=PASO-2
ECHO "Texto - 2"
:ENDIF

El lugar de esto:

FOR %%a IN (1 2 3 4 5 ) do SET VAR=%VAR% %%a

Esto siempre funciona

@echo off

IF "%1" == "/@" goto Bucle

FOR %%a in (1 2 3 4 5) do call %0 /@ %a
goto Fin

:Bucle
SET VAR=%VAR% %2

:Fin

Segun que se desea hacer con un FOR o un IF no acaba de ir bien sobre todo la asignación de variables mediante el comando SET, estos ejemplos solo pretenden ser una forma de mostrar una solución alternativa.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con declaración de variables

Publicado por Alfredo San Martín (8 intervenciones) el 27/02/2007 20:36:23
Muchas gracias por el apoyo amigo Antoni Masana.

Además, el archivo cmd.exe biene con un patch (o parche) que repara este bug tan molesto.

Según lo que postié en el primer mensaje, puse que con el modificador /v se soluciona este problema, el cual no me funcionó inicialmente. Pero si funciona, solo que había que seguir leyendo el documento. :P

El funcionamiento de este "patch" es así:

1) Abres o ejecutas el CMD así...

cmd /v: on

2) Se abrirá un aventana de Intérprete de Comandos pero con la opción /V actibada. Pero para usar esta nueva característica, uno debe usar un símbolo distinto al % para llamar a las variables declaradas, entonces se hace así:

@echo off

set bool=true
echo !bool!
pause

if "!bool!" == "true" (
set bool=false
echo !bool!
pause
)

==========SALIDA==========
true
Presione una tecla para continuar . . .
false
Presione una tecla para continuar . . .
========FIN SALIDA=========

A diferencia de antes, que las variables se llamaban con los signos %, lo cual porducía que el valor de la variable a la que se llama no cambie y siga con el valor inicial...

@echo off

set bool=true
echo %bool%
pause

if "%bool%" == "true" (
set bool=false
echo %bool%
pause
)

==========SALIDA==========
true
Presione una tecla para continuar . . .
true
Presione una tecla para continuar . . .
========FIN SALIDA=========

Como verán, el problema de la modificación de las variables (o declaración en tiempo de ejecución) fue solucionado.

Esta información la obtuve desde el mismo comando set /?
A este problema Microsoft le llama "Expansión de variable inmediata".
Y a la solución o mejora de Microsoft es llamada "Expansión de variable retardada".

Salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar