Tutorial comando Set!!! [batch]

Iniciado por Tempestinfinit, 17 Octubre 2009, 04:46 AM

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

Tempestinfinit

Buenas!

Hoy les traigo un tutorial sobre el comando set con algunos descubrimientos. Luego publicaré algunas cosillas más. Espero que les guste!

Autor: Tempestinfinit
Fecha: 13/10/2009
Tema: Comando Set

Separador de expresiones mediante el comando set (set /a): Se puede utilizar el separador de expresiones o la (,) como se encuentra explicado en la ayuda del comando Set, para declarar varias variables (siempre que sean numéricas), utilizando el comando set y el modificador /a (set /a) una sola vez y en una sola línea.

   ()                                - agrupar
   ! ~ -                            - operadores unarios
   * / %                           - operadores aritméticos
   + -                              - operadores aritméticos
   << >>                          - desplazamiento lógico
   &                                 - bit a bit y
   ^                                - bit a bit exclusivo o
   |                                 - bit a bit
   = *= /= %= += -=          - asignación
     &= ^= |= <<= >>=
  ,                                 - separador de expresiones

Cualquier cadena de la expresión que no sea numérica, se tratará como variable de entorno cuyo valor se convertirá a tipo numérico antes de usarse. Si se especifica una variable que no está definida en el entorno actual, se usará el valor cero.

Ejemplos:

1) Declarar a=1, b=1, c=1, d=1

 a) set /a a=1,b=1,c=1,d=1 (esto generalmente se usa cuando tenemos varios valores, pero también sirve)
 b) set /a a=b=c=d=1
 c) set/aa=b=c=d=1 (también funciona de esta manera para los que quieran ahorrarse 2 bytes)

2) Declarar a=1, b=2, c=3, d=4

 a) set /a a=1,b=2,c=3,d=4

3)   También podemos incluir variables no declaradas anteriormente (siempre y cuando las variables sean declaradas mientras se realiza la operación con ellas sino se tomarán como 0).

 a) set /a a=1,b=a+1,c=b+1,d=c+1

4) Declarar a=(b=2 y c=4)  y luego a=(b+c). Nota: a, b y c no fueron declaradas antes.

 a) set /a a=(b=2)+(c=4)

5) Declarar b=2*a , c=2*b , d=2*c  (No conocemos a pero suponemos que está declarada, además queremos que b sea 2 veces a y así. Esto generalmente lo vamos a usar en un fichero BAT).

a) set /a b=2*a,c=2*b,d=2*c

6) Podemos utilizar variables declaradas anteriormente para asignarlas a otras variables.
   Declaramos a=1, b=2 y c=3.

 a) set /a abc=(%a%%b%%c%) ,(recuerden que a, b y c tienen que estar declaradas).

7) Declaramos a=1, b=2, c=3 y asignamos a, b y c a abc. Esto es puramente matemático y no hay otra manera al menos de declarar 3 variables y luego asignar a una cuarta (al menos no en una línea). Esto conlleva a la complicación de que, si no sabemos cuantas cifras tiene el número en la variable que queremos asignar, no se puede hacer (al menos no sin obtener un error).

 a) set /a abc=(a=1,b=2,c=3,a*100+b*10+c)
 b) set /a a=1,b=2,c=3,abc=a*100+b*10+c

Subcadenas: Declaramos ABC=abcdefghijklmnñopqrstuvwxyz

   %ABC:~desplazamiento,longitud%
   %ABC:~6,5% (desplaza  6 caracteres y muestra 5 a partir del 6to)
   ghijk
   %ABC:~10% (desplaza 10 y sino se especifica la longitud utiliza el resto de la cadena como longitud)
   klmnñopqrstuvwxyz

Si algún número (desplazamiento o longitud) es
negativo, entonces el número usado es la longitud del valor de la variable
de entorno agregado al desplazamiento o longitud especificados.

   %ABC:~-10% (extrae los 10 últimos)
   qrstuvwxyz
   %ABC:~0,-10% (extrae los 10 primeros, o sea, se ubica al principio de la cadena y muestra 10)
   abcdefghij
   %ABC:~0,-2% (muestra todos menos los últimos 2)
   abcdefghijklmnñopqrstuvwx
   %ABC:~-2% (desplaza 0 muestra los últimos 2)
   yz

Anteriormente si queríamos obtener la fecha o la hora en 3 variables utilizando una sola línea debíamos hacer esto:
set dia=%date:~0,2% & set mes=%date:~3,-5% & set año=%date:~-4%

Ahora:

8 ) Obtener la fecha en 3 variables utilizando un solo set /a.

     a) set /a dia=%date:~0,2%,mes=%date:~3,-5%,año=%date:~-4%

9) Obtener la hora en 3 variables utilizando un solo set /a (se complica un poco más).

 a) set /a hora=%time:~0,2%,min=%time:~3,-6%,a=%time:~6%,b=%time:~-2%,seg=a*100+b

10) Incluso si queremos combinar la 8 y la 9 para ahorrarnos un set /a podemos.

a) set /a dia=%date:~0,2%,mes=%date:~3,-5%,año=%date:~-4%,
hora=%time:~0,2%,min=%time:~3,-6%,a=%time:~6%,b=%time:~-2%,seg=a*100+b

Sustitución de variables: Con el comando set y el modificador /a (set /a) podemos realizar sustituciones simples y compuestas(con algunas excepciones) de subcadenas y recuerden que siempre con el modificador /a hablamos de números.  Algunos ejemplos:

a) Declaramos a=123456789

set /a a=%a:123=999% (Sustituímos la subcadena numérica 123 por 999)
999456789

b) set /a a=(%a:123=456%),(%a:456=789%),(%a:789=8910%) (Sustituímos 123 por 456, 456 por 789 y 789 por 8910)
4564568910

Sumando variables con espacios o guiones: Si queremos sumar variables con espacios o con guiones no se podría.
Ejemplo:

set /a trata de aprender+=1 (esto da error)
set /a trata-de-aprender+=1 (esto da error)

Entonces se me ocurrió utilizar los caracteres ð(representa al guión) y ÿ( representa al espacio en blanco) para sustituirlas por el espacio en blanco tradicional y el guión, de manera de poder sumar una variable que contengan espacios en blanco y guiones.

Ejemplos:

Declarando variables...
1) set "tempest=ÿ"
2) set "varnula=^"

Resultado:
1) a a (se encuentra en medio de las dos a)
2) aa (variable nula, no existe? :XD se supone que esta en el medio de las dos a)

Ahora viene lo interesante!
Declaramos las siguientes variables:
1) set /a "ð+=1"
2) set /a "ÿ+=1"
3) set /a "HolaÿaÿtodosÿsoyÿTempestBP+=1"

Resultado:
1) 1
2) 1
3) 1

Conclusión: Obviamente el espacio en blanco no existe, ya que no tiene sentido pensar en nada, en fin, los dos caracteres que utilicé al mostrarse con el comando echo representan el espacio y el guión, de manera que pueden utilizarse para trabajar en memoria. Sin embargo al redireccionarlos a un archivo de texto, los muestra como ÿ y ð, realmente como lo que son.

Incluyendo comandos entre las sustituciones....
Ejemplos:

Declaramos a=123456789

a) set /a a=(%a:123=456%)&echo 1-OK,(%a:456=789%)2-OK,(%a:789=7890%)3-OK
1-OK,(123789789)2-OK,(123456789)3-ok

b) set /a a=(%a:123=456%)&pause,(%a:456=789%)&pause,(%a:789=7890%)&pause (Incluimos una pausa entre cada sustitución)

c)set /a a=(%a:123=456%)&set b=,(%a:456=789%),(%a:789=7890%) (También podemos incluir el comando set)

Llamadas a etiquetas: Esta técnica nos permite hacer una llamada a una etiqueta y luego al finalizar continuar declarando el resto de las variables.
Ejemplo:

@echo off
set a=123456789
set /a a=(%a:123=456%)&call:C1,(%a:456=789%)&call:C2,(%a:789=0%)&call:C3

:C1
echo Trata de
goto :eof
:C2
echo aprender todo
goto :eof
:C3
echo lo que puedas

Trata de
aprender todo
lo que puedas

Errores: Se produce un error con algunos números que creo empiezan con 0, la ayuda del DOS nos dice:

Los valores numéricos son números decimales, a no ser
que lleven el prefijo 0x delante para los números hexadecimales, y 0 para los
números octales. De esta manera 0x12 es lo mismo que 18, y lo mismo que 022.
Nota: la notación octal puede ser confusa: 08 y 09 no son números válidos
porque 8 y 9 no son dígitos octales válidos.

lmarza

Hola, yo quiero asignar una fecha con el formato dd/mm/aaaa, pero no hay manera, si le pongo el modificador /a las barras las tomara como divisores (y devuelve 0), si no se lo pongo, no me asigna nada ¿como puedo hacerlo?
gracias

Eleкtro

@lmarza
No revivas posts de hace 4 años, gracias.

Ya dispones de una variable con ese formato:
Echo %DATE%