Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Eleкtro en 4 Noviembre 2012, 15:25 pm



Título: (Tema bloqueado hasta finalizar el tuto) Tutorial extendido de aprendizaje Batch
Publicado por: Eleкtro en 4 Noviembre 2012, 15:25 pm
    EL TUTORIAL Y EL ÍNDICE ESTÁN EN PROCESO...





    ÍNDICE

    Pincha en un tema para ir directamente.

    • Página 1

    • 1. DEFINICIONES

                   Lenguaje de programación
                   Procesamiento por lotes
                   Script
                   Comando
                   CMD (o Consola) (o Shell) (o DOS) (o Símbolo de sistema)
                   BATCH
                   Archivo BAT
                   CLI (CommandLineInterface)
                   Subrutina
                   Argumento (o Parámetro)
                   Variable
                   Variable de entorno de Windows
                   PATH (Variable de entorno de Windows)
                   String (o Cadena)
                   Concatenación
                   Expresión
                   Expresión regular (o REGEXP, o Patrón)
                   Operador
                   Pseudocódigo

    • 2. CONSEJOS ANTES DE COMENZAR

                   Defínemelo otra vez
                   Pregúntaselo a la CMD (Help, /?, -h, -help)
                   En busca del error
                   Productividad 1 (Editores de código)
                   Productividad 2 (Plantillas)
                   Práctica (Retos)
                   Ética

    • 3. LOS PRIMEROS PASOS

                   3.1 Una identidad (Title)[/li][/list]
                   3.2 La voz (Echo, Echo:, Echo+)
                   3.3 El silencio (@, Echo OFF, >NUL)
                   3.4 La escritura ("")
                   3.5 La lectura (REM)
                   3.6 Caminar (GOTO, Pause)
                   3.7 Memorizar (Set)

    • 4. OPERADORES

                   4.1 Operadores de Ejecución condicional   (& && ||)
                   4.2 Operadores de Ejecución condicional simulada  (&= ^= |=)
                   4.3 Operadores de Exclusión (^)
                   4.4 Operadores de Agrupación  ( () )
                   4.5 Operadores de comparación (o Condicionales) (== EQU NEQ LSS LEQ GTR GEQ)
                   4.6 Operadores de desplazamiento lógico (o Redireccionamiento) (> >> < |)
                   4.7 Operadores aritmétricos y de asignación (+ - * / % = += -= *= /= %= >>= <<=)
                   4.8 Otros operadores (@ :: "" % ! ? * . .. \)



    • 6. VARIABLES

                   6.1 Variables especiales (o variables de parámetro) (o variables de argumento)  (%0 %*)
                   6.2 Variables Standard (%%)  (SET, SET /A, SET /P)
                   6.3 Variables expandidas (!!)   (SETLOCAL ENABLEDELAYEDEXPANSION)
                   6.4 Variables de entorno (%%)
                   6.5 Variables de FOR  (%%a)


    compmaraciones
    búcles
    subrutinas
    • 5. SINTAXIS

    comandos


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:28 pm
    1. DEFINICIONES



    • Lenguaje de programación

    Cita de: WIKIPEDIA
    Un lenguaje de programación es un idioma artificial diseñado para expresar procesos que pueden ser llevadas a cabo por máquinas como las computadoras.
    Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana.
    Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones.

    También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos.





    • Procesamiento por lotes

    Cita de: WIKIPEDIA
    Se conoce como sistema por lotes (batch processing), o modo batch, a la ejecución de un programa sin el control o supervisión directa del usuario (que se denomina procesamiento interactivo). Este tipo de programas se caracterizan porque su ejecución no precisa ningún tipo de interacción con el usuario.

    Generalmente, este tipo de ejecución se utiliza en tareas repetitivas sobre grandes conjuntos de información, ya que sería tedioso y propenso a errores realizarlo manualmente. Un ejemplo sería el renderizado de los fotogramas de una película.





    • Script

    Cita de: WIKIPEDIA
    Un script es un programa que por lo regular se almacena en un archivo de texto plano.
    Los scripts son casi siempre interpretados, pero no todo programa interpretado es considerado un script.
    El uso habitual de los scripts es realizar diversas tareas como combinar componentes, interactuar con el sistema operativo o con el usuario. Por este uso es frecuente que los shells sean a la vez intérpretes de este tipo de programas





    • Comando

    Cita de: WIKIPEDIA
    Un comando (calco del inglés command, «orden, instrucción» o mandato) es una instrucción u orden que el usuario proporciona a un sistema informático, desde la línea de comandos (como una shell) o desde una llamada de programación. Puede ser interno (contenido en el propio intérprete) o externo (contenido en un archivo ejecutable).

    Suele admitir parámetros (argumentos) de entrada, lo que permite modificar su comportamiento predeterminado.





    • CMD (o Consola) (o Shell) (o DOS) (o Símbolo de sistema)

    Cita de: WIKIPEDIA
    El símbolo del sistema (en inglés Command prompt) es el intérprete de comandos.
    Es el equivalente de command.com en MS-DOS y sistemas de la familia Windows 9x.

    Muchas funciones que se realizan desde la interfaz gráfica de Windows son enviadas al CMD que es el encargado de ejecutarlas.

    NOTA: La CMD se encuentra en la ruta: C:\Windows\System32\CMD.exe





    • BATCH

    Batch es un lenguaje secuencial (procesamiento por lotes) por comandos que proviene de la familia de comandos "MS-DOS", el cual puede interactuar perfectamente con Windows,
    Batch sirve entre otras cosas para realizar scripts que automaticen taréas comunes del sistema, taréas que nos resultarían dificil hacer a mano como por ejemplo organizar una carpeta usando "reglas" cada X tiempo, automatizar un procedimiento virtual parecido a un "BOT" como sería abrir una página web y clickar cada X tiempo en un lugar, etc, etc, etc...





    • Archivo BAT

    "BAT" no es más que la extensión de un archivo, para que la CMD identifique un script escrito en Batch, deberemos añadirle la extensión .BAT, o .CMD al archivo.

    Cita de: WIKIPEDIA
    un archivo batch es un archivo de procesamiento por lotes. Se trata de archivos de texto sin formato, guardados con la extensión BAT que contienen un conjunto de comandos MS-DOS. Cuando se ejecuta este archivo, —mediante CMD— los comandos contenidos son ejecutados en grupo, de forma secuencial, permitiendo automatizar diversas tareas. Cualquier comando MS-DOS puede ser utilizado en un archivo batch.

    Ésta es la forma de automatizar procesos (copiar, pegar, renombrar y enviar datos) en MS-DOS. De este modo, evitamos procesos rutinarios y monótonos, acelerando los mismos. Tiene la funcionalidad de conectarse con otras interfaces por línea de comandos.

    Un tipo batch es un archivo de texto que contiene comandos a ejecutar en un intérprete de comandos propio de DOS o OS/2. Cuando es iniciado, un programa shell —típicamente command.com o cmd.exe— lo lee y ejecuta, generalmente línea a línea. De este modo, se emplea para ejecutar series de comandos automáticamente. El hecho de que funcione sólo para MS-DOS lo hace muy limitado. Su extensión es .bat o .cmd.





    • CLI (CommandLineInterface)

    CLI es un término que se refiere a las aplicaciones sin interfaz gráfica.

    Una "Aplicación CLI" equivale a decir "Aplicación por línea de comandos", estas aplicaciones son programadas para usarse exclusivamente desde la consola.

    Normalmente estas aplicaciones están programadas para que actuen al pasarle un argumento mediante la consola, y suelen especificar su funcionamiento mediante una opción de ayuda en la consola, en los que se indica qué se quiere ejecutar y que hace cada cosa.

    Cita de: WIKIPEDIA
    Interfaz de Línea de Comandos (CLI), por su acrónimo en inglés de Command Line Interface (CLI), es un método que permite a las personas dar instrucciones a algún programa informático por medio de una línea de texto simple. Debe notarse que los conceptos de CLI, Shell y Emulador de Terminal no son lo mismo, aunque suelen utilizarse como sinónimos.

    Las CLI pueden emplearse interactivamente, escribiendo instrucciones en alguna especie de entrada de texto, o pueden utilizarse de una forma mucho más automatizada (archivo batch), leyendo comandos desde un archivo de scripts.





    • Subrutina

    Cita de: WIKIPEDIA
    una subrutina o subprograma (también llamada procedimiento, función o rutina), como idea general, se presenta como un subalgoritmo que forma parte del algoritmo principal, el cual permite resolver una tarea específica.

    Una subrutina al ser llamada dentro de un programa hace que el código principal se detenga y se dirija a ejecutar el código de la subrutina.





    • Argumento (o Parámetro)

    Un argumento es un valor que podemos enviarle a una aplicación CLI o a una Subrutina de nuestro archivo bat para que interactuen con dicho valor.

    Citar
    Un argumento o parámetro es una variable que puede ser recibida por una rutina o subrutina.
    Una subrutina usa los valores asignados a sus argumentos para alterar su comportamiento en tiempo de ejecución.





    • Variable

    Una variable (En Batch) es un espacio virtual donde podemos guardar información en forma de texto alfabético, numérico, y alfanumérico.
    Las variables son uno de los elementos más usados en cualquier lenguaje de programación/scripting, y en Batch las necesitaremos usar casi siempre.

    Cita de: WIKIPEDIA
    espacio de memoria de un ordenador, necesario para la ejecución de «programas».





    • Variable de entorno de Windows
    Son variables predefinidas del sistema.

    Cita de: WIKIPEDIA
    Es posible acceder al valor de una variable de entorno, ya sea para consultarlo como para modificarlo, tanto dentro de scripts como desde la línea de comandos.

    NOTA: Podemos consultar nuestras variables de entorno escribiendo en la CMD:
    Código:
    Set /?
    También podemos crear una variable de entorno con el comando SETX.





    • PATH (Variable de entorno de Windows)

    Posiblemente la variable de entorno más importante del sistema, en ella se almacenan las rutas de búsqueda de las aplicaciones y por eso hay que aprender su nombre y su definición.

    NOTA: Se pueden añadir más rutas a la variable PATH.





    • String (o Cadena)

    Cita de: WIKIPDIA
    En programación, una cadena de caracteres, palabra, ristra de caracteres o frase (string en inglés) es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto lenguaje formal o alfabeto análogas a una frase o a una oración. En general, una cadena de caracteres es una sucesión de caracteres (letras, números u otros signos o símbolos).

    Desde un punto de vista de la programación, si no se ponen restricciones al alfabeto, una cadena podrá estar formada por cualquier combinación finita de todo el juego de caracteres disponibles (las letras de la 'a' a la 'z' y de la 'A' a la 'Z', los números del '0' al '9', el espacio en blanco ' ', símbolos diversos '!', '@', '%', etc). En este mismo ámbito (el de la programación), se utilizan normalmente como un tipo de dato predefinido, para palabras, frases o cualquier otra sucesión de caracteres.





    • Concatenación

    Cita de: WIKIPEDIA
    Es la operación por la cual dos caracteres se unen para formar una cadena de caracteres (o string).
    También se puede concatenar dos cadenas de caracteres o un carácter con una cadena para formar una cadena de mayor tamaño.

    NOTA: También se pueden concatenar comandos.





    • Expresión

    Cita de: WIKIPEDIA
    En programación, una expresión es una combinación de constantes, variables o funciones, que es interpretada de acuerdo a las normas particulares de precedencia y asociación para un lenguaje de programación en particular. Como en matemáticas, la expresión es su valor evaluado, es decir, la expresión es una representación de ese valor.





    • Expresión regular (o REGEXP, o Patrón)

    Cita de: WIKIPEDIA
    Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón "H(a|ä|ae)ndel". La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje.





    • Operador

    Un operador es un conjunto de caracteres reservados por el lenguaje (normalmente uno, o dos caracteres) que se encarga de realizar ciertas operaciones, como operaciones matemáticas, de asignación, o de desplazamiento.





    • Pseudocódigo

    Cita de: WIKIPEDIA
    el pseudocódigo (o falso lenguaje) es una descripción de un algoritmo informático de programación de alto nivel compacto e informal que utiliza las convenciones estructurales de un lenguaje de programación verdadero, pero que está diseñado para la lectura humana en lugar de la lectura en máquina, y con independencia de cualquier otro lenguaje de programación. Normalmente, el pseudocódigo omite detalles que no son esenciales para la comprensión humana del algoritmo, tales como declaraciones de variables, código específico del sistema y algunas subrutinas. El lenguaje de programación se complementa, donde sea conveniente, con descripciones detalladas en lenguaje natural, o con notación matemática compacta. Se utiliza pseudocódigo pues este es más fácil de entender para las personas que el código de lenguaje de programación convencional, ya que es una descripción eficiente y con un entorno independiente de los principios fundamentales de un algoritmo.



    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:40 pm
    2. CONSEJOS ANTES DE COMENZAR



    • Defínemelo otra vez

    Si no entendiste alguna de las definiciones anteriores, es hora de que vuelvas a repasarlas porque todas ellas las vas a tener que poner en práctica muy pronto, y muy a menudo.





    • Pregúntaselo a la CMD

    Puedes obtener una lista de la mayoría de comandos internos y externos disponibles en Windows además de una información breve, escribiendo HELP en la CMD.

    Todos los comandos existentes en la CMD disponen de un menú de ayuda al que puedes acceder con el parámetro /? de la siguiente manera:

    Código:
    Comando /?

    Los comandos externos (Aplicaciones CLI) también deberían disponer de un menú de ayuda, suelen estar programadas para multi SO y por personas con distintos gustos a la hora de scriptear, por eso los parámetros de ayuda suelen ser distintos, los parámetros más comunes son -h y -help

    Código:
    Comando -h
    Código:
    Comando -help

    NOTA: Algunas aplicaciones CLI (Mal programadas según mi opinión) distinguen entre mayúsculas y minúsculas por lo que hay que escribir correctamente el parámetro según se indique (-help, -HELP).





    • En busca del error

    Si algún script te tira error y desconoces el motivo, hay dos técnicas muy útiles para intentar localizar la causa del error.

    1º - Ejecuta el script directamente desde la CMD escribiendo la ruta del script (No haciendo doble click sobre el script), de esta manera la CMD no se cerrará y podrás ver la información del error.

    2º - Usa el comando Echo para mostrar el contenido de las variables o los comandos de los que sospeches que están causando el error.

    Por ejemplo, tenemos este código que hace una comparación condicional, pero la comparación no nos funciona y no sabemos porqué:
    Código:
    @Echo OFF
    Set "Variable=Valor"
    if "%VARIABLE%" EQU "Valoor" (Echo Si)
    Pause >NUL

    El ejemplo es muy fácil para todos, lo sé, pero si tenemos un código con más de 100 líneas y tenemos las variables desperdigadas por el código, no sabemos donde está cada cosa, etc, etc... la cosa se complica!, por eso esta solución nos servirá en todas esas ocasiones.

    Usariamos la línea de la que sospechamos como línea de comentario, y una línea más arriba pegariamos la línea pero usando el comando Echo, para mostrar lo que no podemos ver a simple vista en el script:

    Código:
    @Echo OFF
    Set "Variable=Valor"
    ECHO if "%VARIABLE%" EQU "Valoor" (Echo Si)
    REM if "%VARIABLE%" EQU "Valoor" (Echo Si)
    Pause >NUL

    (http://img203.imageshack.us/img203/4318/captura3j.png)

    El error salta a la vista, lo hemos encontrado y solucionado.





    • Productividad (1)

    Hay que intentar ser productivos con nuestros scripts y adecuar nuestro lugar de práctica,
    no es lo mismo empezar a programar nuestro código abriendo el bloc de notas, que hacerlo en un editor de código profesional especializado en ello,
    este tipo de editores por lo general te corrigen o te avisan automáticamente de los errores tipográficos que hayas cometido, y creéme, al empezar se cometen demasiados errores.
    También colorean las diferentes partes de un código, y eso al principio te ayudará a entender mejor que es cada cosa, y donde dese estar situada.

    Un editor de código es la mejor manera para empezar en esto, te ayudará a separar, encontrar, y entender las partes de un script, y aprenderás el manejo en menor tiempo que con el bloc de notas.

    Veámos las diferencias que nos aportan cada uno:

    Notepad
    • NADA
    • Ah, si... el botón "buscar"  (xD)

    Editor
    • Auto-corrección
    • Auto-indentación
    • Auto-completado (de palabras/comandos)
    • Resalto en colores de la sintaxis
    • Colores ajustables de letra y fondo para descansar la vista
    • Un sin fín de opciones variadas que suelen tener cualquier editor como por ejemplo "ordenar lineas", multi-seleccionar líneas o palabras al mismo tiempo, y multi búsquedas.

    Si quieres mi recomendación, la mejor elección para codear scripts Batch es el editor Sublime Text Editor, aunque muchos otros optan por el editor Notepad++
    Sublime Text > http://www.sublimetext.com/2
    Notepad++ > http://notepad-plus-plus.org/





    • Productividad (2)

    Seguramente no sepas que puedes crear tu propia plantilla de trabajo personalizada para tus archivos BAT, y seleccionar esta nueva plantilla en el menú contextual de crear nuevos archivos:

    (http://img18.imageshack.us/img18/9800/captura1h.png)

    Pues así es, se puede conseguir, y con ello se ahorra una considerable cantidad de tiempo si la plantilla está adecuada a tus necesidades...

    Aquí tienes mi plantilla por defecto, y un archivo de registro que es necesario para agregar esta nueva opción (Solo lo he testeado en Windows 7).

    Plantilla.bat
    Código:
    @Echo OFF
    TITLE Plantilla Batch por defecto by Elektro H@cker

    Setlocal enabledelayedexpansion

    Set    "VAR="
    Set /A "NUM=0"


    :: IF "%VAR%" EQU "" (PAUSE)

    :: FOR /F "Usebackq Tokens=* Delims=" %%@ IN ("") DO ()
    :: FOR /L %%@ IN (0,1,10) DO ()
    :: FOR /R %%@ in (*) DO ()
    :: FOR %%@ IN () DO ()


    Pause&Exit


    Plantilla.reg
    Código:
    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\.bat\ShellNew]
    "NullFile"=""
    "Filename"="Plantilla.bat"

    [HKEY_CLASSES_ROOT\batfile]
    "FriendlyTypeName"="Batch Script"

    PD: La plantilla se debe guardar en la ruta C:\Windows\ShellNew\Plantilla.bat para que tenga efecto.





    • Práctica

    Llegar a dominar un lenguaje es dificil, por ese motivo te invito a que vayas poniendo a prueba tus avances en la sección de retos de Scripting.

    -> Zona de retos Scripting (http://foro.elhacker.net/scripting/zona_de_retos_scripting-t360782.0.html)





    • Ética

    La programación no fue creada con el fín de hacer el mal, ni virus, ni autoruns, ni nada por el estilo, Aquí puedes aprender lo básico para crear una bomba lógica, pero si buscas un tutorial orientado a dañar sistemas operativos en estas páginas no lo vas a encontrar.

    Intentar superarse a uno mismo realizando cada vez scripts más complicados es una cosa genial y llena de mérito!, pero lo que no es tiene nada de mérito es copiar códigos de terceras personas en tu propio beneficio (Buscando puro reconocimiento inmerecido), es un acto de inmadurez el cual personalmente desprecio.

    Si copias algo, pide permiso al autor del código, si ves dificil la taréa de contactar con el, pon agradecimientos/créditos en tu code haciendo referencia a los códigos que has obtenido de terceras personas, pues quien sabe si en un futuro llegas a ser un excelente programador y te achacan de copión, lammer, y ladrón, por no haber puesto los créditos necesarios en tus scripts... No cuesta nada!


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:45 pm
    3. LOS PRIMEROS PASOS





    • 3.1 Una Identidad

    Estamos a punto de crear algo nuestro, es casi como de nuestra sangre y por eso lo vamos a tratar como si fuese nuestro hijo, nuestro fruto,
    Vamos a bautizar nuestro script con un nombre!

    Otorgarle un nombre a un script sirve para identificar que archivo bat está ejecutando la CMD, o simplemente dejar nuestra firma en el, y para ello utilizaremos el comando Title

    Este paso lo haremos directamente abriendo la CMD y escribiendo:
    Código:
    Title Elektro Junior

    (http://img28.imageshack.us/img28/674/captura1j.png)

    Podemos comprobar como la barra de título de la ventana ha cambiado.


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:47 pm
    • 3.2 La Voz

    Si queremos expresarnos para mostrar cualquier cosa que se nos ocurra en la pantalla, o si queremos mostrar cualquier tipo de información, tendremos que usar el comando Echo

    Este comando es uno de los más sencillos de aprender y en el ejemplo lo usaremos directamente en la CMD.

    Se puede mostrar un mensaje de dos maneras,

    La primera manera es:
    Código:
    Echo Mensaje

    La segunda manera es añadiendo el caracter + o : o . de esta forma:
    Código:
    Echo. Mensaje
    Echo: Mensaje
    Echo+ Mensaje
    La única diferencia es que la segunda manera añade un espacio al principio del mensaje.

    Si queremos mostrar una línea en blanco usaremos siempre la segunda manera, pero sin escribir ningún mensaje:

    Código:
    Echo.

    Código:
    Echo:

    Código:
    Echo+

    Aquí podeis ver las diferencias:
    (http://img607.imageshack.us/img607/6623/captura1vq.png)

    TIP: Para no llenar nuestros scripts de interminables comandos Echo+ podemos mostrar un mensaje y añadir una línea en blanco debajo, usando el comando MORE de esta manera:
    Código:
    Echo Mensaje | MORE

    TIP: Podemos usar el comando MORE cuantas veces queramos (Se añadirá una línea en blanco por cada uso):
    Código:
    Echo Mensaje | MORE | MORE | MORE | MORE

    (http://img641.imageshack.us/img641/60/captura4b.png)


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:52 pm
    • 3.3 El Silencio

    La CMD siempre se encargará de mostrar todas las líneas que se van procesando de un script (resulta muy molesto), a menos que le indiques que no quieres que te informe de esos datos.

    La "voz" de la CMD se puede activar/desactivar usando el parámetro ON y OFF comando Echo:
    Código:
    Echo OFF
    Código:
    Echo ON

    Como norma general en la primera línea de nuestros scripts siempre usaremos ese comando para desactivar "la voz", aunque en un script le tendremos que añadir el caracter @ así:
    Código:
    @Echo OFF

    Esa sí que será nuestra primera línea del script !!

    NOTA: El caracter  @ indica que el comando que le prosigue a la derecha de él no devuelva "el echo", así que cualquier línea que empiece con el caracter @ no devolverá "la voz" de la CMD.

    NOTA: Por defecto Echo siempre está activado (ON)

    Algunos comandos también nos dirán cosas innecesarias, para silenciar el echo (o salida) de un comando utilizaremos el operador de redirección >, así:
    Código:
    Comando >NUL

    (http://img208.imageshack.us/img208/5784/captura1t.png)

    PD: Más tarde aprenderemos a redireccionar y aprenderemos que es "NUL".


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:56 pm
    • 3.4 La escritura

    En la vida real es muy importante saber escribir, y sobretodo saber escribir bien, con sus comas, sus puntos, sus punto y coma, etc...
    Si no escribes algo correctamente quizás una persona no pueda entender tu escritura y se confunda, pues en Batch sucede lo mismo.

    Las comillas, las comillas son un elemento IMPRESCINDIBLE, las debes usar extremadamente para casi todo, muchos errores en los scripts son causa de no haber usado las comillas apropiadamente (o un uso indebido de otros operadores).

    Más adelante lo explicaré con detalles.


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:57 pm
    • 3.5 La lectura

    Cuando séas un experto en Batch lograrás hacer códigos complejos y con cientos o miles de líneas de código, solo de imaginarlo... puede resultar algo lioso la lectura, ¿Verdad?

    Por suerte todo lenguaje de programación/scripting tiene soporte para añadir líneas de comentarios a los scripts, podemos usar estas líneas de comentario para fácilitar la lectura del script, como recordatorio personal para no olvidar que hace una función, o para añadir información extra para el usuario.

    El comando para añadir una línea de comentario es REM

    Código:
    @Echo OFF
    REM Esto es una línea de comentario
    Pause >NUL

    NOTA: Una línea de comentario no interfiere con los operadores de Batch, es decir, puedes escribir todos los caracteres que desees sin encerrarlos entrecomillas.


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 15:59 pm
    • 3.6 Caminar

    Un script no tiene patas, pero la ejecución del código no se detiene, y si no hacemos algo para detenerla, la ventana de la CMD se cerrará al finalizar la ejecución de nuestro código, muchas veces sin darnos opción a ver que está pasando.

    Se puede detener la ejecución usando el comando Pause.

    Un ejemplo:
    Código:
    @Echo OFF
    Echo Esto es un test !
    Pause

    TIP: Para silenciar el echo del comando Pause lo usaremos de esta manera:
    Código:
    Pause >NUL



    Muchas veces necesitaremos dividir nuestro script en bloques, en varías partes imaginarias (o no tán imaginarias) y dirigirnos hacia esa parte, como por ejemplo las subrutinas.

    Una parte de un script se tiene que dividir usando las denominadas etiquetas

    Una etiqueta se identifica porque siempre lleva el caracter : delante del nombre, así:

    Código:
    :Soy una etiqueta

    Debajo de la etiqueta se puede colocar las líneas de código que deseemos, esas líneas formaran un conjunto con la etiqueta y por eso tenemos que imaginarla como una "parte" imaginaria dividida del scirpt, ya que esas líneas solo se procesarán si se llama a la etiqueta (O si se procesa secuencialmente sin haber llamado a ninguna etiqueta antes).

    Para "caminar" hacia una etiqueta usaremos el comando GOTO seguido del nombre de la etiqueta a la que queremos ir.

    Véamos un ejemplo de todo esto:

    Código:
    @Echo OFF

    Goto :Etiqueta_2

    :Etiqueta_1
    Echo Estoy en la etiqueta 1 !

    :Etiqueta_2
    Echo Estoy en la etiqueta 2 !

    Pause>NUL

    (http://img841.imageshack.us/img841/6815/captura2ck.png)

    Como se puede comprobar, el contenido de la "Etiqueta_1" no se llega a procesar porque una línea más arriba se procesa primeramente el comando GOTO y este se dirige directamente a la "Etiqueta_2", omitiendo todo el contenido de código que haya antes de dicha etiqueta.

    NOTA: Jamás escribiremos nombres de etiquetas con espacios en el nombre, ya que todo lo que haya después del espacio se asignaría como un argumento de la etiqueta.

    NOTA: Puede haber uno o varios espacios entre el comando y el nombre de la etiqueta:

    Código:
    Goto:Etiqueta
    Goto :Etiqueta
    Goto            :Etiqueta


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:04 pm
    • 3.7 Memorizar

    Llegamos a un punto interesante, aprenderemos a memorizar las cosas usando las  variables.

    Como ya expliqué, una variable es un espacio virtual donde podemos almacenar datos/valores.

    Podemos bautizar a una variable con el nombre que deseemos.

    Para guardar un valor en una variable usaremos el comando SET
    Código:
    Set MiVariable=Valor

    NOTA: La acción de crear una variable (usar el comando set) se denomina "Setear".

    Pero como ya expliqué que las comillas son muy importantes PARA TODO, nos acostumbraremos a setear utilizando comillas, es muy importante hacerlo aunque no es obligatorio.
    Código:
    Set "MiVariable=Valor"

    Y en algunos casos muy especiales las deberemos usar así:
    Código:
    Set MiVariable="Valor"






    Para que el intérprete de comandos reconozca una variable, debemos escribirla seguido del caracter % dos veces.
    Código:
    %MiVariable%

    Véamos un ejemplo:
    Código:
    @Echo OFF
    Set "Variable=Esto es lo que hay dentro de la variable"
    Echo %VARIABLE%
    Pause >NUL

    (http://img402.imageshack.us/img402/5991/captura1hm.png)

    Ahora otro ejemplo, sin usar las comillas:
    Código:
    @Echo OFF
    Set Variable=Valor1_&_Valor2
    Echo %VARIABLE%
    Pause >NUL

    (http://img703.imageshack.us/img703/6271/captura2qf.png)

    ¿Ves lo que sucede por no usar las comillas EN TODO?
    Al no encerrar la variable con las comillas dobles y al mismo tiempo haber usado el caracter reservado de Batch &, el intérprete entiende que todo lo que hay a la derecha del caracter & es un comando, y dará error.



    TIP: Se puede eliminar de la memoría una variable simplemente seteando el nombre de la variable, sin añadir ningún valor, de esta forma:
    Código:
    Set "Variable="



    Aquí terminan nuestros primeros pasos, enhorabuena, ya estás preparado para comprender mejor las cosas.


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:17 pm
    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)
    .
    ..
    \


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:19 pm
    • 4.1 Operadores de Ejecución condicional


    • & (AND)

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

    Ejemplo:
    Código:
    @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:
    Código:
    @Echo OFF
    Dir /B FAIL && Echo SUCCEED
    Pause

    Ejemplo de éxito:
    Código:
    @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:
    Código:
    @Echo OFF
    Dir /B SUCCEED || Echo FAIL
    Pause

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

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


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:22 pm
    • 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):
    Código:
    @Echo off
    if 5 equ 5 if 3 equ 3 (Echo true) else (Echo false)
    Pause >NUL

    (http://img713.imageshack.us/img713/4264/captura4qy.png)

    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:
    Código:
    if 5 == 5 & if 3 == 3 (print "true") else (print "false")


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:24 pm
    • 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:

    Código:
    @Echo off
    Echo Hola ^| MORE
    Pause >NUL

    (http://img837.imageshack.us/img837/8739/captura2tj.png)

    Código:
    @Echo off
    Set "VARIABLE=ABC"
    Echo ^%%VARIABLE^%%
    Pause >NUL

    (http://img213.imageshack.us/img213/8333/captura1zd.png)

    Código:
    @Echo off
    Echo Hola ^^
    Pause >NUL

    (http://img62.imageshack.us/img62/8236/captura3h.png)

    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.


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:30 pm
    • 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:
    Código:
    @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:
    Código:
    @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:
    Código:
    @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:
    Código:
    IF 1 EQU 1 (
        echo 1
        echo 2
        echo 3
    )


    2º Ejemplo:
    Código:
    @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

    (http://img802.imageshack.us/img802/1795/captura6.png)

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


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:42 pm
    • 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:
    Código:
    @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

    (http://img507.imageshack.us/img507/2945/captura2g.png)

    Otro ejemplo de comparación:
    Código:
    @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.


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:46 pm
    • 4.6 Operadores de desplazamiento lógico (o Redireccionamiento)


    • >

    Redirecciona la salida de un comando, a un archivo.

    Ejemplo:
    Código:
    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:
    Código:
    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:
    Código:
    SORT < "Archivo.txt"





    • |

    Redirecciona la slaida de un comando, a otro comando.

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

    Código:
    @Echo OFF
    (
      Echo 1
      Echo 2
      Echo 3
    )>"Archivo.txt"





    Otros tipos de redireccionamiento ordinario:

    Código:
    Comando.exe 2> "Archivo"
    Redirecciona cualquier error del comando al archivo.

    Código:
    Comando.exe 2>> "Archivo"
    Redirecciona cualquier error del comando al archivo.

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

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

    Código:
    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:
    Código:
    Type "Archivo.txt" > PRN
    Código:
    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:
    Código:
    @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



    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 16:52 pm
    • 4.7 Operadores aritmétricos y de asignación


    • =

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

    Ejemplo:
    Código:
    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:
    Código:
    @Echo off
    Set /A "NUM=2+2"
    Echo %NUM%
    REM El resultado es 4
    Pause >NUL





    • +=

    Este es el operador alternativo de suma.

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





    • -

    Este es el operador de resta.

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





    • -=

    Este es el operador alternativo de resta.

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





    • *

    Este es el operador de multiplicación.

    Ejemplo:
    Código:
    @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:
    Código:
    @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:
    Código:
    @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:
    Código:
    @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:
    Código:
    @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.

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




    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 17:06 pm
    • 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:

    Código:
    Echo OFF
    Pause

    (http://img99.imageshack.us/img99/2159/captura2r.png)

    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:

    Código:
    echo comando 1
    echo comando 2
    @echo comando 3
    echo comando 4
    Pause

    (http://img717.imageshack.us/img717/9311/captura3nb.png)


    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:
    Código:
    @Echo off
    Set Variable=Valor
    Echo %VARIABLE%
    Echo "%%VARIABLE%%"
    Pause >NUL

    (http://img843.imageshack.us/img843/9025/captura5gb.png)

    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í:

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

    Código:
    @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).

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

    Código:
    !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:
    Código:
    @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:
    Código:
    @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:
    Código:
    @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:
    Código:
    @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:
    Código:
    @Echo OFF
    Dir \
    REM Equivale a "DIR C:\"
    Pause >NUL


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 17:13 pm
    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.


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

    Código:
    @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:
    Código:
    @Echo off
    Echo Me & You
    Pause >NUL

    (http://img703.imageshack.us/img703/6868/captura1ds.png)

    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:

    Código:
    @Echo off
    Echo Me ^& You
    Pause >NUL

    (http://img855.imageshack.us/img855/7259/captura2gp.png)





    • ( )

    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:

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

    (http://img853.imageshack.us/img853/7052/captura3a.png)

    ¿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:

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

    (http://img42.imageshack.us/img42/1110/captura4kc.png)


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 17:17 pm
    6. VARIABLES



    Existen 4 tipos de variables en Batch,

    Las variables especiales: %0
    Lass variables standard: %VARIABLE%
    Las variables expandidas: !VARIABLE!
    Las variables de FOR: %%a

    Las 4 tipos de variables solamente pueden almacenar datos alfabéticos, numéricos o alfanuméricos.


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 17:17 pm
    • 6.1 Variables especiales (o Variables de parámetro) (o Variables de argumentos)


    Las variables especiales son un tipo de variables predefinidas que pueden cambiar su valor constantemente,
    Estas son todas las variables especiales:

    %0  %1  %2   %3  %4  %5  %6  %7  %8  %9   %*

    En ellas se guarda el orden de los argumentos que le pasemos a nuestro script.

    Un argumento es una cadena de caracteres delimitados por un espacio o por comillas dobles, esto quiere decir que una cadena encerrada entre comillas cuenta como un argumento
    Código:
    "Esto es un argumento"    "Y esto otro argumento"

    Pero si no usamos comillas, los argumentos se separan por espacios:
    Código:
    Esto son cuatro argumentos
    1       2     3         4

    La variable %0 no la consideraremos realmente un argumento, porque en ella se guarda la ruta de nuestro script.
    Código:
    @Echo OFF
    Echo %0
    Pause >NUL

    (http://img802.imageshack.us/img802/6132/captura2wd.png)

    Si usamos una subrutina, el argumento %0 pasa a ser el nombre de la etiqueta de la subrutina, y será el siguiente número de variable (%1) el que realmente empezará a guardar el primer argumento que le pasemos:
    Código:
    @Echo OFF
    call :subrutina "argumento 1"
    :subrutina
    Echo %0
    Echo %1
    Pause >NUL

    (http://img32.imageshack.us/img32/3329/captura3r.png)

    Podemos usar la variable especial con comodín %*, esta variable reune todos los argumentos que le pasemos al script:

    Código:
    @Echo OFF
    call :subrutina arg1 arg2 arg3 arg4 arg5
    :subrutina
    Echo %*
    Pause >NUL

    (http://img690.imageshack.us/img690/4411/captura2iy.png)
    (El argumento 0 se omite)



    Habeis visto que solo existen 10 variables especiales con números, pero descontando la variable %0, nos quedan 9 variables, ¿que pasa si necesitamos usar más de 9 argumentos... si por ejemplo necesitamos usar el arhumento 10?

    Bien, pues el valor de las variables especiales se puede desplazar hacia la izquierda son el comando SHIFT, consiguiendo que el valor que había por ejemplo en la variable %3 pase a la variable %2, y el valor de la imaginaria variable %10 pase a la variable %9, entonces ya podremos usar nuestro 10º argumento en la variable %9

    Cita de: CMD
    Código:
    SHIFT /?

    Cambia la posición de parámetros reemplazables

    SHIFT [/n]

    Si las extensiones de comando están habilitadas,
    el comando SHIFT admitirá el modificador /n,
    el cual informa al comando que empiece a cambiar en el argumento n, en donde n puede estar comprendido entre 0 y 8.

    Por ejemplo:
        SHIFT /2

    cambiará %3 a %2, %4 a %3, etc. y deja %0 y %1 sin modificar.

    Ejemplo:
    Código:
    @Echo OFF
    call :subrutina a b c d e

    :subrutina
    Echo Antes del "Left Shift":
    Echo arg1 = %1
    Echo arg2 = %2
    Echo arg3 = %3
    Echo arg4 = %4
    Echo arg5 = %5

    Echo+
    SHIFT /1

    Echo Despues del "Left Shift":
    Echo arg1 = %1
    Echo arg2 = %2
    Echo arg3 = %3
    Echo arg4 = %4
    Echo arg5 = %5

    Pause >NUL

    (http://img853.imageshack.us/img853/4109/captura2em.png)


    NOTA: El comando SHIFT no afecta a la variable especial %*, esta variable no se puede desplazar.





    • Expansión de variables especiales (o Argumentos) y de variables de FOR

    La gran ventaja de las variables especiales y variables de FOR es que pueden ser expandidas para mostrar únicamente los datos que nos interesen, como por ejemplo, el tamaño del argumento, la extensión del archivo, la fecha de modificación, etc.

    Esto se realiza usando el operador ~ seguido de uno de los siguientes caracteres (los caracteres se pueden combinar).


     %~0         - expande %0 quitando las comillas (") que pudiera haber
     %~f0        - expande %0 a un nombre de ruta completo
     %~d0        - expande %0 solo a una letra de unidad
     %~p0        - expande %0 solo a una ruta
     %~n0        - expande %0 solo a un nombre de archivo
     %~x0        - expande %0 solo a una extension de archivo
     %~s0        - ruta expandida contiene solo nombres cortos
     %~a0        - expande %0 a atributos de archivos
     %~t0        - expande %0 a fecha/hora del archivo
     %~z0        - expande %0 a tamaño del archivo
     %~$PATH:0   - busca los directorios de la lista de la variable de entorno de PATH y expande %0 al nombre del primero que se encuentre.


    Ejemplo:
    Código:
    @Echo OFF

    Echo Argumento con comillas:
    Echo %0
    Echo.
    Echo Argumento sin comillas:
    Echo %~0
    Echo.
    Echo Ruta completa del argumento:
    Echo %~f0
    Echo.
    Echo Letra de unidad del argumento:
    Echo %~d0
    Echo.
    Echo Ruta del argumento:
    Echo %~p0
    Echo.
    Echo nombre del argumento:
    Echo %~n0
    Echo.
    Echo Extension del argumento:
    Echo %~x0
    Echo.
    Echo Ruta de nombre corto del argumento:
    Echo %~s0
    Echo.
    Echo Atributos del argumento:
    Echo %~a0
    Echo.
    Echo Fecha/Hora dle argumento:
    Echo %~t0
    Echo.
    Echo Tamanyo del argumento:
    Echo %~z0

    Pause >NUL

    (http://img687.imageshack.us/img687/9796/captura3fw.png)


    Código:
    @Echo OFF

    FOR %%a in (*) DO (

         Echo Ruta:      %%~fa
         Echo Letra:     %%~da
         Echo Carpeta:   %%~pa
         Echo Nombre:    %%~na
         Echo Extension: %%~xa
         Echo Atributos: %%~aa
         Echo Fecha/H.:  %%~ta
         Echo Tamanyo:   %%~za
         Echo+

    )

    Pause >NUL

    (http://img443.imageshack.us/img443/3202/captura4e.png)


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 17:48 pm
    • 6.2 Variable Standard


    • SET

    Una variable standard es la más común en Batch, se puede mostrar usando el comando SET o el comando ECHO (Ojo, mostrar es algo muy distinto a USAR)

    Código:
    @Echo OFF
    Set WINDIR
    Echo %WINDIR%
    Pause >NUL

    (http://img715.imageshack.us/img715/8720/captura5ip.png)



    Para usar una variable es suficiente con escribir su nombre:
    (No nos olvidemos de encerrarla con comillas)

    Código:
    @Echo OFF
    DIR "%WINDIR%"
    Pause >NUL

    (http://img507.imageshack.us/img507/2159/captura2r.png)



    Si una variable contiene una orden y usamos la variable, se procesará la orden:

    Código:
    @Echo OFF
    Set "Variable=Dir /B"
    %VARIABLE%
    Pause >NUL

    (http://img820.imageshack.us/img820/3909/captura2c.png)



    El nombre de las variables puede contener letras, números, espacios, y operadores, pero el nombre de una variable nunca debe empezar por un número, para que no entre en conflicto con las variables especiales.

    Código:
    @Echo OFF
    Set 0Variable=Valor
    Echo %0variable%
    Pause >NUL
    (http://img547.imageshack.us/img547/4524/captura1u.png)

    Para que el nombre de la variable no entre en conflicto, la encerraremos entre comillas (Pero siguiendo la regla de NO empezar el nombre de la variable con un número):
    Código:
    @Echo OFF
    Set "V0a _ri &| #~able=Valor"
    Echo "%V0a _ri &| #~able%"
    Pause >NUL

    (http://img99.imageshack.us/img99/3369/captura2j.png)





    • SET /P

    Con el parámetro /P (Prompt) del comando SET podemos crear una variable y esperar la respuesta del usuario, es decir, el valor de la variable será lo que el usuario escriba en la CMD.

    Código:
    @Echo OFF
    SET /P "VARIABLE=Escriba su nombre >> "
    Echo Ud. se llama %VARIABLE%
    Pause >NUL

    (http://img443.imageshack.us/img443/4318/captura3j.png)





    • SET /A

    Con el parámetro /A del comando SET podemos realizar operaciones matemáticas, y asignar valores numéricos a una variable.

    Sin usar el parámetro /A también podemos asignar números a una variable, pero con el parámetro /A nos aseguramos de que el valor de la variable séa un número, sin excepciones.

    Si la operación o asignación falla, Batch automáticamente le asignará el número más bajo a la variable (el 0)

    Ejemplo:
    Código:
    @Echo OFF
    SET /A NUMERO=abcde
    Echo %NUMERO%
    Pause >NUL

    (http://img694.imageshack.us/img694/5513/captura1va.png)

    NOTA: Aquí tienes la explicación para realizar operaciones con SET /A - > 4.7 Operadores aritmétricos y de asignación (http://foro.elhacker.net/scripting/tutorial_extendido_de_aprendizaje_batch-t375135.0.html;msg1797943#msg1797943)


    Título: Re: Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 17:52 pm
    • 6.3 Variables expandidas

    Las variables expandidas son prácticamente igual que las variables standard, pero para poder usarlas se debe habilitar la expansión de las mismas con el comando SETLOCAL:
    Código:
    Setlocal enabledelayedexpansion

    Ejemplo:
    Código:
    @Echo OFF
    Setlocal enabledelayedexpansion
    Set "VARIABLE=VALOR"
    Echo !VARIABLE!
    Pause >NUL

    (http://img22.imageshack.us/img22/259/captura1y.png)

    Esta técnica se usa comúnmente dentro de un FOR donde para poder mostrar variables tienen que estar expandidas.

    Pero estas variables tienes sus inconvenientes, ya que al habilitar la expansión, solamente podremos usar el caracter ! como operador de variable, es decir, no podremos mostrar el caracter (Ni siquiera excluyendolo ni usando comillas).

    Ejemplo:
    Código:
    @Echo OFF
    Setlocal enabledelayedexpansion
    Echo !Hola
    Echo ^!Hola
    Echo "!Hola"
    Pause >NUL

    (http://img22.imageshack.us/img22/4156/captura3oi.png)

    NOTA: Siempre se puede evitar la expansión y su restricción de caracteres, eso lo explicaré cuando lleguemos a la temática FOR.


    Título: Re: (TEMA BLOQUEADO HASTA FINALIZAR EL TUTO) Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 19:31 pm
    • 6.4 Variables de entorno


    Las variables de entorno son variables predefinidas del sistema, y se puede acceder a su contenido desde cualquier lugar.

    Las variables de entorno por defecto en Windows 7 son las siguientes:


    VARIABLE                   CONTENIDO
    ________                   _________

    %ALLUSERSPROFILE%          C:\ProgramData
    %APPDATA%                  C:\Users\(Nombre de usuario)\AppData\Roaming
    %COMMONPROGRAMFILES%       C:\Program Files\Common Files
    %COMMONPROGRAMFILES(x86)%  C:\Program Files (x86)\Common Files
    %COMPUTERNAME%             (NOMBRE DEL PC-PC)
    %COMSPEC%                  C:\Windows\System32\cmd.exe
    %DIR%                      (Directorio actual)
    %HOMEDRIVE%                C:
    %HOMEPATH%                 C:\Users\(Nombre de usuario)
    %LOCALAPPDATA%             C:\Users\(Nombre de usuario)\AppData\Local
    %LOGONSERVER%              \\{domain_logon_server}
    %PATH%                     C:\Windows\System32\;C:\Windows\;C:\Windows\System32\Wbem;etc...  
    %PATHEXT%                  .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS ; .WSF; .WSH; .MSC
    %PROCESSOR_ARCHITECTURE%   (AMD64) (x86)
    %PROCESSOR_IDENTIFIER%     (Modelo del procesador)
    %PROCESSOR_LEVEL%          (Número)
    %PROCESSOR_REVISION%       (Número)
    %PROGRAMDATA%              C:\ProgramData
    %PROGRAMFILES%             C:\Program Files
    %PROGRAMFILES(x86)%        C:\Program Files (x86)
    %PROMPT%                   $P$G
    %PSMODULEPATH%             C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
    %PUBLIC%                   C:\Users\Public
    %SYSTEMDRIVE%              C:
    %SYSTEMROOT%               C:\Windows
    %TEMP%                     C:\Users\{Username}\AppData\Local\Temp
    %TMP%                      C:\Users\{Username}\AppData\Local\Temp
    %USERDOMAIN%               (Nombre de dominio)
    %USERNAME%                 (Nombre de usuario)
    %USERPROFILE%              C:\Users\(Nombre de usuario)
    %WINDIR%                   C:\Windows




    • Variables de entorno dinámicas


    VARIABLE          CONTENIDO
    ________          _________

    %CD%              (Directorio actual)
    %DATE%            (Fecha actual)
    %TIME%            (Hora actual)
    %RANDOM%          (Número aleatorio entre 0 y 32767)
    %ERRORLEVEL%      (Número de salida)
    %CMDEXTVERSION%   (Número)
    %CMDCMDLINE%      "cmd.exe"  (Parámetro)




    NOTA: Las variables de entorno del usuario se almacenan en la clave de registro:  HKEY_CURRENT_USER\Environment

    NOTA: Las variables de entorno del sistema se almacenan en la clave de registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment


    Título: Re: (TEMA BLOQUEADO HASTA FINALIZAR EL TUTO) Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 19:35 pm
    • 6.5 Variables de FOR

    Las variables de FOR son un tipo de variables que solamente se pueden usar con el comando FOR, así que por el momento no digo más, las explicaré en el apartado del comando FOR.



    Título: Re: (TEMA BLOQUEADO HASTA FINALIZAR EL TUTO) Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 19:40 pm
    7. Comparación condicional





    Las comparaciones se efectuan con el comando IF.

    El comando IF se puede usar para trés tipos de comparaciones.


    1º - Para comparar un elemento:

    Código:
    IF "Elemento 1" EQU "Elemento 2" (
         REM Código si se cumple la condición
    )

    2º - Para comprobar si existe un elemento (archivo o carpeta)

    Código:
    If Exist "Elemento 1" (
         REM Código si se cumple la condición
    )

    3º - Para comprobar si existe una variable.

    Código:
    If DEFINED "Elemento 1" (
         REM Código si se cumple la condición
    )

    También se pueden realizar comparaciones con varias condiciones:

    Código:
    If "elemento 1" EQU "elemento 2" if "elemento 3" EQU "Elemento 4" (
         REM Código si se cumple la condición
    )



    El comando IF acepta estos parámetros y condiciones:

    /I - No distingue entre mayúsculas y minúsculas

    Ejemplo:
    Código:
    @Echo OFF
    IF "A" EQU "a" (Echo correcto)
    Pause >NUL
    La condición no se cumple porque el primer elemento está en mayusculas, y el segundo en minúsculas.

    Código:
    @Echo OFF
    IF /I "A" EQU "a" (Echo correcto)
    Pause >NUL
    La condición se cumple.



    NOT

    Código:
    @Echo OFF
    IF NOT "A" EQU "a" (Echo "A" no es igual que "a")
    Pause >NUL

    Código:
    @Echo OFF
    IF NOT EXIST "C:\fail.txt" (Echo El archivo "C:\Fail.txt" no existe)
    Pause >NUL

    Código:
    @Echo OFF
    IF NOT DEFINED VARI (Echo la variable "%%VARI%%" no existe)
    Pause >NUL



    ELSE

    Se utiliza para ejecutar un código si la condición no se cumple.

    Ejemplo:
    Código:
    @Echo OFF
    IF EXIST "C:\Archivo.txt" (
         Echo El archivo "C:\Archivo.txt" ya existe.
    ) ELSE (
         Echo El archivo "C:\Archivo.txt" no existe.
         Echo Test > "C:\Archivo.txt"
         Echo El archivo "C:\Archivo.txt" ha sido creado...
    )
    Pause >NUL



    En las comparaciones podemos usar los operadores condicionales que expliqué en el apartado de operadores... -> 4.5 Operadores de comparación (o Condicionales) (http://foro.elhacker.net/scripting/tema_bloqueado_hasta_finalizar_el_tuto_tutorial_extendido_de_aprendizaje_batch-t375135.0.html;msg1797940#msg1797940)

    Ejemplo:
    Código:
    @Echo OFF
    IF 1 LSS 2 (Echo 1 es menor que 2)
    Pause >NUL

    NOTA: Se puede usar el operador EQU o el operador ==

    Código:
    IF "A"=="A" (Echo A es igual que A)


    Título: Re: (TEMA BLOQUEADO HASTA FINALIZAR EL TUTO) Tutorial extendido de aprendizaje Batch
    Publicado por: Eleкtro en 4 Noviembre 2012, 20:07 pm

    AÑADIRÉ MÁS INFORMACIÓN A ESTE APARTADO DE "FOR" DENTRO DE POCO...
    ESTE APARTADO Y EL TUTORIAL, NO ESTÁN ACABADOS.






    8. Búcles





    Hay tres maneras de crear un búcle.

    Una manera es usando el comando FOR, el cual ejecuta un comando o una serie de comandos repetidamente sobre varios archivos o datos.

    Otra manera es usando el comando FORFILES,

    Y la última manera de crear un búcle es usando etiquetas, y el comando GOTO.

    Podemos crear un búcle infinito usando una etiqueta, y el comando GOTO, aunque este tipo de búcle es muy distinto y no tiene el mismo fín que un FOR.


    Ejemplo de búcle infinito:
    Código:
    @ECHO OFF

    SET VAR1=A
    SET VAR2=B

    :ETIQUETA
    IF NOT "%VAR1%" EQU "%VAR2%" (
         Echo Los valores "%VAR1%" y "%VAR2%" no conciden.
         GOTO :ETIQUETA
    ) ELSE (
         Echo Los valores "%VAR1%" y "%VAR2%" coinciden.
         Pause&Exit
    )

    (http://img829.imageshack.us/img829/3449/captura1p.png)


    Hay varios tipos de FOR, por lo tanto varios tipos de búcles.





    • FOR


    FOR es un tipo de búcle para archivos, o para una serie de expresiones.

    Sintaxis:
    FOR %%variable IN (archivo o expresión) DO (comandos)


    Ejemplos:
    Código:
    @ECHO OFF
    FOR %%A in (*.bat) DO (Echo %%A)
    Pause&Exit

    (http://img824.imageshack.us/img824/3731/captura1jep.png)

    Código:
    @ECHO OFF
    SET "VARIABLE=a b c d e"
    FOR %%A in (%VARIABLE%) DO (Echo %%A)
    Pause&Exit

    (http://img59.imageshack.us/img59/790/captura2a.png)





    • FOR /R
    (FOR-Files-Rooted at Path)


    FOR /R es un tipo de búcle recursivo para archivos.

    Sintaxis:
    FOR /R "RUTA" %%variable IN (archivos) DO (comandos)


    Ejemplos:
    Código:
    @ECHO OFF
    FOR /R "C:\" %%A in (*.dll) DO (Echo %%A)
    Pause&Exit

    (http://img440.imageshack.us/img440/2738/captura3nr.png)





    • FOR /D
    (FOR-Directories)


    FOR /D es un tipo de búcle para carpetas.

    Sintaxis:
    FOR /D "RUTA" %%variable IN (carpetas) DO (comandos)

    NOTA: Se puede usar en combinación del parámetro "/R" para procesar directorios recursivamente.


    Ejemplos:
    Código:
    @Echo OFF
    FOR /D /R "C:\" %%A in (*system32) DO (Echo %%A)
    Pause >NUL

    (http://img842.imageshack.us/img842/8531/captura2sp.png)





    • FOR /L
    (FOR-List of numbers)


    FOR /L es un tipo de búcle para un rango de números.

    Sintaxis:
    FOR /L %%variable IN (Número inicial,Incremento,Número final) DO (comandos)


    Ejemplos:
    Código:
    @ECHO OFF
    FOR /L %%A IN (0,1,10) DO (Echo %%A)
    Pause&Exit

    (http://img593.imageshack.us/img593/6883/captura4u.png)

    Código:
    @ECHO OFF
    FOR /L %%A IN (5,5,25) DO (Echo Hola!)
    Pause&Exit

    Aquí vemos como el primer número del rango es "5", se va incrementando el número por "5" hasta llegar al "25", por lo tanto el bucle se efectúa 5 veces.

    (http://img197.imageshack.us/img197/9339/captura5u.png)





    • FOR /F
    (FOR-File contents) (o FOR-Command Results)


    FOR /F es un tipo de búcle para el contenido de un archivo, o para el resultado de un comando.

    Sintaxis:
    FOR /F "PARÁMETROS" %%variable IN ('Archivo o comando') DO (comandos)

    Los comandos deben estar entre comillas ('comando')

    Los parámetros de FOR /F son:


    eol=X           - Añade un caracter de comentario a cada línea.

    skip=X          - Especifica el número de líneas que hay que saltarse al principio del archivo.

    delims=XXX      - Especifica un grupo de delimitadores.
                      Esto reemplaza al grupo de delimitadores predeterminados de espacio y tabulación.

    usebackq        - Especifica que una cadena entre comillas inversas se ejecuta como un comando y una cadena con comillas simples es un comando de cadena literal,
                      y permite el uso deomillas dobles para entrecomillar los nombres de archivo en un conjunto de archivos.

    tokens=x,y,m-n  - Especifica que símbolos de cada línea deben pasarse al cuerpo de la clausula "for" en cada iteración.
                      Esto causará que los nombres de variables adicionales sean asignados.
                      Si el último caracter en la cadena tokens= es un asterisco, se asigna una variable adicional que recibe el resto del texto en la línea posterior al último símbolo analizado.



    Ejemplo skip:
    Código:
    @ECHO OFF
    FOR /F "Skip=1" %%A IN ('Echo Linea1 ^& Echo linea2 ^& Echo Linea3') DO (Echo %%A)
    Pause&Exit

    (http://img821.imageshack.us/img821/8020/captura1vw.png)


    Ejemplo delims:
    Código:
    @ECHO OFF
    FOR /F "Delims=c" %%A IN ('Echo abcde') DO (Echo %%A)
    Pause&Exit

    (http://img717.imageshack.us/img717/3893/captura2q.png)