Título: (Tema bloqueado hasta finalizar el tuto) Tutorial extendido de aprendizaje Batch Publicado por: Eleкtro en 4 Noviembre 2012, 15:25 pm ÍNDICE Pincha en un tema para ir directamente.
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
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.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.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.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
comandos Título: Re: Tutorial extendido de aprendizaje Batch Publicado por: Eleкtro en 4 Noviembre 2012, 15:28 pm 1. DEFINICIONES
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.
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.
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
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.
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 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...
"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 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.
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.
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.
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».
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.
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.
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.
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.
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.
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.
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.
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
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.
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).
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.
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
Editor
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/
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.
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)
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
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
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 La única diferencia es que la segunda manera añade un espacio al principio del mensaje.Echo: Mensaje Echo+ 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
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
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
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
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
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
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.
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
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
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
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
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.
1er Ejemplo: Código: @Echo off 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.(Echo Agrupacion 1 & pause) 2º Ejemplo: Código: @Echo off Hemos agrupado a la izquierda una serie de 2 comandos concatenados, y en la derecha otra agrupación de 2 comandos,(Echo Agrupacion 1 & Dir /B FAIL) || (Echo Agrupacion 2 & Pause) 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 Aquí hay una pequeña modificación, el comando pause no tiene agrupación.(Echo Agrupacion 1 & Dir /B FAIL) || (Echo Agrupacion 2) & Pause 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.
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
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
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
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
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
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.
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
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 (http://img547.imageshack.us/img547/4524/captura1u.png)Set 0Variable=Valor Echo %0variable% Pause >NUL 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)
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)
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
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
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
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
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 La condición no se cumple porque el primer elemento está en mayusculas, y el segundo en minúsculas.IF "A" EQU "a" (Echo correcto) Pause >NUL Código: @Echo OFF La condición se cumple.IF /I "A" EQU "a" (Echo correcto) Pause >NUL 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 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 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 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 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 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) |