(Tema bloqueado hasta finalizar el tuto) Tutorial extendido de aprendizaje Batch

Iniciado por Eleкtro, 4 Noviembre 2012, 15:25 PM

0 Miembros y 3 Visitantes están viendo este tema.

Eleкtro

#10
4. OPERADORES



Estos son los operadores de Batch:

Operadores de ejecución condicional:

&   - AND
&&  - IF
||  - OR

Operadores de ejecución condicional simulada:

&=  - AND
^=  - (Exclusive OR) XOR
|=  - OR

Operadores de exclusión:

^   - (Exclusive OR) XOR

Operadores de comparación:

==  - (EQUAL) igual

EQU - (EQUAL) igual
NEQ - (NON EQUAL) distinto
LSS - (LESS) menor que
LEQ - (LESS OR EQUAL) menor que o igual
GTR - (GRATER) mayor que
GEQ - (GREATER OR EQUAL) mayor que o igual

Operadores de agrupación:

( ) - Agrupadores

Operadores de desplazamiento lógico (o Redireccionamiento):

>   - (Right shift) RSH
>>  - (Right shift) RSH
<   - (Left shift) LSH
|   - PIPE

Operadores aritméticos y de asignación:

+   - Suma
-   - Resta
*   - Multiplicación
/   - División
%   - Módulo

=   - Asignar valor

+=  - Suma en variable
-=  - Resta en variable
*=  - Multiplicación en variable
/=  - División en variable
%=  - Módulo en variable

<<= - LSH (Left Shift)  en variable
>>= - RSH (Right Shift) en variable

Separadores de expresión:

,   - Separador

Otros operadores:

@   - AT
::
""
%
!
?
*   - Wildcard (o Comodín)
.
..
\








Eleкtro

#11
  • 4.1 Operadores de Ejecución condicional


  • & (AND)

Este operador se usa para concatenar comandos, para ejecutarlos por orden, unos seguidos de otros.

Ejemplo:
@Echo off
Pause & Pause


NOTA: Los comandos se ejecutan sin excepción.






  • && (IF)

A diferencia del operador &, al usar && el comando que le proceda a la derecha solo se ejecutará si el primer comando tiene éxito (sin errores).

Ejemplo de error:
@Echo OFF
Dir /B FAIL && Echo SUCCEED
Pause


Ejemplo de éxito:
@Echo OFF
Dir /B * >NUL && Echo SUCCEED
Pause







  • || (OR)

Al usar || el comando que le proceda a la derecha solo se ejecutará si el primer comando falla (cualquier tipo de error).

Ejemplo de error:
@Echo OFF
Dir /B SUCCEED || Echo FAIL
Pause


Ejemplo de éxito:
@Echo OFF
Dir /B * >NUL || Echo FAIL
Pause


NOTA: Un comando exitoso (sin errores) mandará un código de error %ERRORLEVEL% de "0"








Eleкtro

#12
  • 4.2 Operadores de Ejecución condicional simulada

Estos operadores no se pueden usar directamente en Batch ni escribirlos en un script, deben ser simulados, debemos imaginarnos la situación y actuar como si pusiesemos el operador en práctica.

Un ejemplo muy claro sería una comparación multi-condicional (Varías condiciones):
@Echo off
if 5 equ 5 if 3 equ 3 (Echo true) else (Echo false)
Pause >NUL




En Batch no se puede usar el operador & como operador lógico, por eso el intérprete lo simula en segundo plano.

Para que algunos puedan entenderlo mejor, el código traducido a algún otro lenguaje de programación equivaldría a esto:
if 5 == 5 & if 3 == 3 (print "true") else (print "false")








Eleкtro

#13
  • 4.3 Operador de exclusión


  • ^  (XOR)

En algunas ocasiones no querremos que Batch procese los operadores como operadores, sinó como caracteres alfabéticos.

A la acción de usar el caracter ^ se le llama escapar.

Este operador sirve entre para excluir de la interpretación a un operador especial (Incluido el mismo operador XOR).

Pongamos unos ejemplos:

@Echo off
Echo Hola ^| MORE
Pause >NUL




@Echo off
Set "VARIABLE=ABC"
Echo ^%%VARIABLE^%%
Pause >NUL




@Echo off
Echo Hola ^^
Pause >NUL




NOTA: También se puede evitar el interpretado de los operadores encerrando el string con comillas dobles, y esto es otra razón de porque són tán importantes las comillas.








Eleкtro

  • 4.4 Operadores de agrupación


  • ( )

El operador de agrupación en realidad son dos caracteres distintos pero que han de usarse combinadamente, ( y ).

Nunca se debe dejar abierta una agrupación, por lo tanto como norma general por cada caracter ( (usado como operador) debe existir la misma cantidad del caracter ) en el script, de lo contrario dará error de sintaxis.






  • Agrupación de una línea

1er Ejemplo:
@Echo off
(Echo Agrupacion 1 & pause)

Hemos agrupado (y concatenado) el comando echo y el comando pause , pero la agrupación hay que usarla con algún propósito y en este ejemplo no es necesario usar la agrupación, solo es para que aprendais a agrupar.

2º Ejemplo:
@Echo off
(Echo Agrupacion 1 & Dir /B FAIL) || (Echo Agrupacion 2 & Pause)

Hemos agrupado a la izquierda una serie de 2 comandos concatenados, y en la derecha otra agrupación de 2 comandos,
Los comandos que estén dentro de una agrupación cuentan como "un solo comando", si cualquiera de ellos da error, al usar el operador de ejecucón condicional || se procesará la segunda agrupación del ejemplo.

3er Ejemplo:
@Echo off
(Echo Agrupacion 1 & Dir /B FAIL) || (Echo Agrupacion 2) & Pause

Aquí hay una pequeña modificación, el comando pause no tiene agrupación.
Las reglas son las mismas que las de la explicación del 2º ejemplo, solo que el comando pause al no estar agrupado, se procesará sín excepción alguna (Se procesará incluso aunque no fallase la comparación del operador ||).
En este último ejemplo es donde mejor se puede apreciar la importancia de hacer correctamente una agrupación.






  • Agrupación multi-línea

Se pueden realizar agrupaciones de varias líneas.


1er ejemplo:
IF 1 EQU 1 (
    echo 1
    echo 2
    echo 3
)



2º Ejemplo:
@Echo OFF

(
  IF 1 EQU 1 (
      echo 1
      echo 2
      echo 3
  ) & (
     IF 2 EQU 2 (
               echo 4
               echo 5
               echo 6
     )
  )
) > "Archivo.txt"

Type "Archivo.txt"
Pause >NUL




(El 2º Ejemplo lo hice con mala leche, vale! xD)








Eleкtro

  • 4.5 Operadores de comparación (o Condicionales)


Este tipo de operadores son exclusivos del comando IF, sin el comando IF no se puede realizar una comparación de este tipo, solamente una comparación que séa por el método de ejecución condicional.

Véamos un ejemplo de todos estos operadores:

@Echo OFF

IF 1==1 (Echo 1 es igual que 1)
IF 1 EQU 1 (Echo 1 es igual que 1)
IF 1 NEQ 0 (Echo 1 es distinto que 0)
IF 1 LSS 2 (Echo 1 es menor que 2)
IF 1 LEQ 1 (Echo 1 es menor o igual que 1)
IF 1 GTR 0 (Echo 1 es mayor que 0)
IF 1 GEQ 1 (Echo 1 Es mayor o igual que 1)

Pause&Exit




Otro ejemplo de comparación:
@Echo OFF
IF "HOLA" EQU "ADIÓS" (Echo Es igual) ELSE (Echo No es igual)
Pause&Exit



NOTA: Los comandos deben ir siempre agrupados como en el ejemplo con los caracteres de agrupación ( ), aunque no es obligatorio, pero de lo contrario empiezan los problemas.
NOTA: Las comillas SIEMPRE, menos cuando intentemos comparar números como en este caso (Sobretodo números de 2 dígitos o más), ya que Batch ordena de una manera incorrecta los números con comillas.








Eleкtro

  • 4.6 Operadores de desplazamiento lógico (o Redireccionamiento)


  • >

Redirecciona la salida de un comando, a un archivo.

Ejemplo:
Dir /B "%WINDIR%" > "Archivo.txt"
El comando DIR oculta la salida del comando y la redirecciona al archivo de texto, reemplazando el contenido del archivo.






  • >>

Redirecciona la salida de un comando, a un archivo.

Ejemplo:
Dir /B "%SYSTEMDRIVE%" >> "Archivo.txt"
El comando DIR oculta la salida del comando y la redirecciona al archivo de texto, escribiendo debajo del archivo, sin reemplazar el contenido.






  • <

Redirecciona el contenido de un archivo de texto, a un comando.

Ejemplo:
SORT < "Archivo.txt"






  • |

Redirecciona la slaida de un comando, a otro comando.

Ejemplo:
Dir | Find "bytes"
El echo del comando DIR pasa al comando FIND el cual filtra esta salida mostrando solamente las lineas que contienen el string "bytes".






Redirección ordinaria de multiples líneas:


@Echo OFF
(
 Echo 1
 Echo 2
 Echo 3
)>"Archivo.txt"







Otros tipos de redireccionamiento ordinario:

Comando.exe 2> "Archivo"
Redirecciona cualquier error del comando al archivo.

Comando.exe 2>> "Archivo"
Redirecciona cualquier error del comando al archivo.

(Comando.exe)2>  Archivo
Redirecciona cualquier error de la CMD al archivo.

Comando.exe >NUL 2>&1
Redirecciona nula del output y cualquier error del comando (Oculta cualquier tipod e salida).

Comando.exe > "Archivo1" 2> "archivo2"
Redirecciona la salida al Archivo1 y cualquier error del comando al archivo2.


NOTA: NUL es un archivo especial de Windows que descarta toda la información que le redireccionemos, prácticamente su único uso es ocultar la salida de un comando evitando la necesidad de crear un archivo extra que nos moleste en nuestro disco duro.


TIP: También se puede redireccionar a un puerto de impresora:
Type "Archivo.txt" > PRN
Type "Archivo.txt" >LPT1






Indice de redirecciones:

0     - Entrada

1     - Salida

2     - Salida de errores

3     - Flujo de archivo de entrada

4 a 9 - Indefinido


Ejemplo:
@Echo OFF

REM Redirecciona la salida normal
Echo Ejemplo 1> "Ejemplo.txt"

REM Redirecciona una entrada
CMD 0< "Ejemplo.txt"

REM Redirecciona la salida de error
Dir /B FAIL 2> "Ejemplo.txt"

Pause&Exit










Eleкtro

#17
  • 4.7 Operadores aritmétricos y de asignación


  • =

El operador = sirve solamente para setear, para asignar un valor a una variable.

Ejemplo:
Set "Variable=Valor"

Para usar los demás operadores aritmétricos y de asignación primero hay que activar el parámetro aritmétrico /A del comando SET






  • +

Este es el operador de suma.

Ejemplo:
@Echo off
Set /A "NUM=2+2"
Echo %NUM%
REM El resultado es 4
Pause >NUL







  • +=

Este es el operador alternativo de suma.

Ejemplo:
@Echo off
SET /A "NUM+=5"
Echo %NUM%
REM El resultado es 5
Pause >NUL







  • -

Este es el operador de resta.

Ejemplo:
@Echo off
Set /A "NUM=2-2"
Echo %NUM%
REM El resultado es 0
Pause >NUL







  • -=

Este es el operador alternativo de resta.

Ejemplo:
@Echo off
Set /A "NUM-=5"
Echo %NUM%
REM El resultado es -5
Pause >NUL







  • *

Este es el operador de multiplicación.

Ejemplo:
@Echo off
Set /A "NUM=5*2"
Echo %NUM%
REM El resultado es 10
Pause >NUL







  • *=

Este es el operador alternativo de multiplicación.

Ejemplo:
@Echo off
SET /A "NUM=2"
SET /A "NUM*=5"
Echo %NUM%
REM El resultado es 10
Pause >NUL







  • /

Este es el operador de división.

Ejemplo:
@Echo off
Set /A "NUM=10/2"
Echo %NUM%
REM El resultado es 5
Pause >NUL







  • /=

Este es el operador alternativo de división.

Ejemplo:
@Echo off
Set /A "NUM=10"
Set /A "NUM/=2"
Echo %NUM%
REM El resultado es 5
Pause >NUL







  • %

Este es el operador de módulo.

Ejemplo:
@Echo off
SET /A "NUM=5%%2"
Echo %NUM%
REM El resultado es 1
REM (=1)  { 5/2 = 2 + 2 resto 1 = 1 }
Pause >NUL


NOTA: El operador de módulo hay que escribirlo 2 veces %% si no se usa directamente en la consola.






  • <<=

Este es el operador de desplazamiento aritmétrico izquierdo.

@Echo off
SET /A "NUM=2<<3"
Echo %NUM%
REM El resultado es 16
REM  (=16)   { 2 Lsh 3 = binario 10 Lsh 3 = binario 10000 = decimal 16 }
Pause >NUL







  • <<=

Este es el operador de desplazamiento aritmétrico derecho.






TIP: Se puede usar el separador de expresión con el comando Set /A:
@Echo off
Set /A "NUMA+=1", "NUMB-=1"
Echo %NUMA% y %NUMB%
REM El resultado es "1 y -1"
Pause >NUL



NOTA: Cualquier cálculo con Set /A que de como resultado un número fraccionado se redondeará automáticamente al número integro más bajo.
Por ejemplo Set /A "VAR=10/3" dará como resultado "3"










Eleкtro

  • 4.8 Otros operadores


  • @

Este operador lo vemos siempre en la primera línea de un script bat.

Al usarlo, el operador indica a la CMD que séa menos detallada y muestre solamente el output del comando.

Si no ha quedado claro vamos a ver un ejemplo:

Echo OFF
Pause




Como podeis ver en la imagen, la CMD muestra información sobre la intención de ejecutar el comando Echo,
Por eso, además de ocultar el echo en la primera línea de nuestro script, usaremos el operador AT ( @ ) simplemente para que nos oculte esa información.

Otro ejemplo:

echo comando 1
echo comando 2
@echo comando 3
echo comando 4
Pause





El operador @ se puede usar con cualquier comando, pero una vez desactivado el "echo" en la primera línea de nuestro script, es una tontería usar este operador a menos que volvamos a activar el echo (Echo ON).






  • " "

Las comillas dobles (o Quotes) sirven para definir un string y un argumento, y para que el intérprete pueda diferenciar entre una cadena o una variable.

Un ejemplo:
@Echo off
Set Variable=Valor
Echo %VARIABLE%
Echo "%%VARIABLE%%"
Pause >NUL




Como norma general TODAS las cadenas que lleven espacios en el nombre deben encerrarse usando las comillas dobles.

NOTA:  Cualquier caracter que esté dentro de las comillas será automáticamente escapado.
NOTA: Como norma general debe existir una cantidad par del operador ", si la cantidad en nuestro script es impar seguramente dará error el código, aunque hay excepciones en algunos casos.

TIP: Si tenemos un comando con una cantidad impar del operador " y estamos usando un editor de código, seguramente este nos resaltará un error de sintaxis en la línea, pero si estamos completamente seguros de que no hemos cometido un error y que la cantidad de comillas debe ser impar entonces resulta molesto que el editor nos resalte el supuesto error. Esto se puede evitar concatenando un comando de comentario seguido de una comilla para redondear la cantidad a pares, así:

@Echo off
Set Variable=Valor" " " & REM "
Pause >NUL







  • ::

Este operador en realidad es el operador : usado para definir una etiqueta, ¿Recuerdas?
Al repetir el caracter dle operador dos veces se puede usar como alternativa al comando REM

@Echo OFF
REM Soy una línea de ocmentario
:: Yo soy otra línea de comentario
Pause >NUL


Al no ser realmente un operador de comentario, puede dar errores en ciertas circunstancias (Dentro de bloques de agrupaciones como FOR) así que es recomendable usarlo fuera de los bloques.






  • %

Este operador sirve para identificar y usar las variables standard, las variables de FOR, y las variables especiales (Variables de argumento).

%0
%%A
%VARIABLE%


NOTA: Como norma general, directamente en la consola el caracter % solo se usa una vez (Incluso al escribir un FOR), pero en un script hay que duplicar el número de veces que se repite este caracter para poder identificarlo %%, y el número de veces que hay que repetir el caracter aumenta según la recursividad del código.






  • !

Este operador se usa para identificar y usar las variables expandidas.

!VARIABLE!

Más adelante explicaré como usarlas.






Los siguientes operadores son consideranos NO conflictivos ya que estos operadores solo son interpretados en ciertos comandos.


  • *

El asterisco, también llamado "comodín" o "wildcard", es un operador de argumento, al usarlo busca cualquier combinación de caracteres.

Ejemplo:
@Echo OFF
Dir /B /S "*.txt"
Pause >NUL


El script buscará cualquier archivo que empiece por cualquier combinación de caracteres y acabe en ".txt"






  • ?

Este es otro operador de argumento, al usarlo buscará cualquier caracter de 1 dígito.

Ejemplo:
@Echo OFF
Dir /B /S "?.txt"
Pause >NUL


El script buscará cualquier archivo que tenga SOLAMENTE un dígito en el nombre y acabe en ".txt", en resumen, buscará: a.txt, z.txt, A.txt, Z.txt, 0.txt, 9.txt, -.txt, etc...






  • .

Este operador representa el directorio actual, y se puede usar con comandos y aplicaciones CLI que acepten rutas como argumentos

Ejemplo:
@Echo OFF
Dir .\
REM Equivale a "DIR %CD%"
Pause >NUL







  • ..

Este operador representa el directorio anterior del actual, y se puede usar con comandos y aplicaciones CLI que acepten rutas como argumentos

Ejemplo:
@Echo OFF
Dir %WINDIR%\..\
REM Equivale a "DIR C:\"
Pause >NUL







  • \

Este operador representa el directorio raíz del disco duro, y se puede usar con comandos y aplicaciones CLI que acepten rutas como argumentos

Ejemplo:
@Echo OFF
Dir \
REM Equivale a "DIR C:\"
Pause >NUL








Eleкtro

5. SINTAXIS






Si has conseguido leer todas las explicaciones de los operadores te doy la enhorabuena porque a pesar de ser el primer tema práctico de este tutorial, en realidad es uno de los más dificiles, todo lo demás te va a parecer fácil ya que una vez domines los operadores solo será cuestión de ponerlos en práctica en los distintos comandos que veámos y con las distintas técnicas que se nos ocurran.

El conocimiento de los operadores es lo que puede diferenciar a un buen programador Batchero de uno de nivel inferior, sobre todo por que con los operadores podremos salir de la mayoría de las situaciones donde sin ellos nos encontrariamos bloqueados, y además los operadores nos aportarán una simplicidad increible a nuestros scripts.

El orden y la forma en la que se escriben y combinan los operadores, los caracteres, las cadenas, y los comandos, es muy importante a la hora de escribir un script,
Un pequeño fallo tipográfico al escribir un caracter o un operador puede darnos muchos quebraderos e cabeza, en esto consiste el concepto de la sintaxis, en el orden de las cosas.



Es hora de descansar un poco, en este tema simplemente haré un pequeño recordatorio de cúal es la manera correcta de escribir los distintos elementos de un Script Batch.






  • " "

Las comillas dobles... al principio pueden ser frustrantes, pero hay que extremar su uso PARA CASI TODO, siempre que puedas úsalas, con el tiempo te acostumbras a encerrar cada cadena, argumento, o variable importante entre comillas.


@Echo off
Dir C:\Program Files\Windows Sidebar
Pause >NUL


Ese script nos marca el siguiente error: El sistema no puede encontrar el archivo especificado.

Como el nombre de la ruta contiene espacios, tenemos que encerrar el argumento con comillas dobles:

@Echo off
Dir "C:\Program Files\Windows Sidebar"
Pause >NUL







  • ^

La exclusión de caracteres, una de las cosas que más errores puede ocasionarte...

Hay que tener en mente cuales son todos los operadores conflictivos de Batch, por conflictivos me refiero a los operadores que no se pueden usar en cadenas sin excluir dicho operador.

Un ejemplo:
@Echo off
Echo Me & You
Pause >NUL




En el ejemplo hago uso del operador & pero no lo estoy haciendo correctamente, debido a las circunstancias tenemos que excluirlo (escaparlo).

Esta es la manera correcta:

@Echo off
Echo Me ^& You
Pause >NUL









  • ( )

La agrupación... cuando veo códigos que no usan agrupación me sangran los ojos, por desgracia mucha gente aprende a programar Batch de esta manera, pero hay que corregirlo cuanto antes.

Aquí vemos algo muy típico, un claro ejemplo de una comparación sin agrupación:

@Echo off
If 2 equ 2 Echo Es igual & echo ok else echo NO
Pause >NUL




¿Ves lo que pasa? Al no agrupar ningún bloque, todo lo que hay a la derecha del comando echo se toma como una cadena.

Hay que agrupar las cosas y ordenarlas correctamente:

@Echo off
If 2 equ 2 (Echo Es igual & echo ok) else (echo NO)
Pause >NUL