Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: 0x0309 en 1 Octubre 2009, 08:33 am



Título: Bug batch.
Publicado por: 0x0309 en 1 Octubre 2009, 08:33 am
Yo había leído en un sitio que para asignar con el comando set es lo mismo:

Código:
set "variable=valor"

que

Código:
(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:

Código:
(")
el archivo por lotes termina.

Por eso si tenemos el siguiene código:

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

y ejecutamos:

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

Pero si hacemos:

test.cmd
Código:
@echo off
set "var=%1"
echo.El texto se muestra.

el texto si es mostrado.

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

que:

Código:
set "variable=valor"



Título: Re: Bug batch.
Publicado por: xassiz_ en 1 Octubre 2009, 18:25 pm
:o esta interesante, muy buen aporte :o


Título: Re: Bug batch.
Publicado por: Guerrerohgp en 1 Octubre 2009, 19:17 pm
bueno, no sabia, nisiquiera me ha interesado hacer el set con parentesis, pero es bueno saber gracias. ;-) ;-) ;-)


Título: Re: Bug batch.
Publicado por: leogtz en 2 Octubre 2009, 03:55 am
Qué bueno que siempre he usado las variables entre dobles comillas.


Título: Re: Bug batch.
Publicado por: 0x0309 en 2 Octubre 2009, 08:30 am
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.