Bug batch.

Iniciado por 0x0309, 1 Octubre 2009, 08:33 AM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

Yo había leído en un sitio que para asignar con el comando set es lo mismo:

set "variable=valor"

que

(set variable=valor)

Sin embargo, he encontrado un bug de cmd.exe.

Cuando cmd.exe reconoce una sola comilla dentro de paréntesis termina el archivo por lotes.

Por eso si se hace:

(")
el archivo por lotes termina.

Por eso si tenemos el siguiene código:

test.cmd
@echo off
(set var=%1)
echo.El texto se muestra.


y ejecutamos:

test.cmd "
el texto no se muestra porque el archivo por lotes concluyó antes por el bug.

Pero si hacemos:

test.cmd

@echo off
set "var=%1"
echo.El texto se muestra.


el texto si es mostrado.

Entonces no es lo mismo:
(set variable=valor)
que contiene el bug.

que:

set "variable=valor"


xassiz_

:o esta interesante, muy buen aporte :o



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

Guerrerohgp

bueno, no sabia, nisiquiera me ha interesado hacer el set con parentesis, pero es bueno saber gracias. ;-) ;-) ;-)

leogtz

Qué bueno que siempre he usado las variables entre dobles comillas.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

0x0309

ah, sobre lo de usar paréntesis o comillas ... sirve para cuando publicas un código en foros que agregan espacios al final de cada línea, entonces evitas que el código produzca resultados erróneos.

Por ejemplo, supongamos que haces un código algo similar a esto:

set /p t=Texto:
set v=%texto%
if "%v%"=="" (echo.Vacio.)

Entonces como un foro o por ejemplo google groups añade un espacio te queda:

set v=%texto%[Espacio]

y cuando haces:

if "%v%"=="" (echo.Vacio.)

se te cierra el archivo por lotes, pues con expansión simple no puedes tener espacios en el texto del if.

Pero todo se evita así:

set "v=%texto%"

aunque haga:

set "v=%texto%"[Espacio]

el espacio o cualquier cosa que venga después de la comilla final es ignorado.