echo %p�d% C:\WINDOWS\s�stem32
Usando �na redirecci�n del archi�o hacia el comando Set /P podremos almacenar s� contenido en �na �ariable. Los �nicos incon�enientes son q�e solo permitir� almacenar la primera l�nea contenida en el archi�o � q�e esta no podr� e�ceder los 1024 caracteres. El ejemplo anterior ser�ir�a para almacenar la r�ta de trabajo act�al en �na �ariable, es �na alternati�a no din�mica a %cd% q�e p�ede ser �til para m�chas cosas. Ahora bien, a la hora de e�pandir el contenido de c�alq�ier �ariable podemos s�stit�ir, manip�lar o modificar el res�ltado q�e se m�estra en tiempo real sin tener q�e �ol�er a declararla con otro �alor distinto. E�isten �arias formalidades para hacer esto � �o� a tratar de e�ponerlas �sando la �ariable %path% tal como m�estra la a��da de set. Para la pr�ctica, si e�pandimos la �ariable path los �alores originales en los ejemplos ser�n los sig�ientes: ( 9) C:\> echo %path% C:\WINDOWS\s�stem32;C:\WINDOWS;C:\WINDOWS\S�stem32\Wbem
� La primera formalidad q�e podremos �sar sir�e para s�stit�ir � es la sig�iente: C:\> echo %path:C:=D:% D:\WINDOWS\s�stem32;D:\WINDOWS;D:\WINDOWS\S�stem32\Wbem
9
Los valores para la variable PATH suelen ser muchos más que los descritos en el ejemplo. Esto es debido a que muchos de los programas que se instalan suelen agregar nuevas entradas a esta variable para facilitar la búsqueda de sus ejecutables y demás dependencias.
25
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 Lo q�e har� esto es cambiar la letra de �nidad C: por D: en todos los directorios. La formalidad es %�a�:X=Y% donde cada repetici�n de X ser� s�stit�ida por Y dentro de la �ariable, donde Y tambi�n p�ede ser �na cadena �ac�a para borrar el �alor de X. Tambi�n podemos agregar �n asterisco delante de X para q�e coincida en todo el contenido hasta la primera aparici�n de X. Por ejemplo si �samos %�a�h:*;=% eliminar� al primer directorio delimitado por ; , o sea q�e X ser�a el p�nto � coma, � el asterisco delimitar�a la cadena pre�ia, o sea C:\WINDOWS\s�stem32, � como l�ego del signo = no se especifica nada, la cadena ser�a eliminada dentro de la �ariable %path% � La seg�nda formalidad permite e�pandir �na �ariable especificando las s�bstrings (o s�bcadenas) q�e se q�ieren e�traer: C:\> echo %path:�11,8% s�stem32
Lo q�e har� lo anterior ser� despla�arse 11 caracteres (a tra��s de C:\WINDOWS\) � l�ego tomar solo los sig�ientes 8 caracteres (s�stem32). La formalidad es %�a�:�X,Y% (10) en donde X ser� el n�mero de caracteres q�e se despla�ar� la �ariable � Y el n�mero de caracteres q�e se tomar�n, donde si ,Y no se especifica ser� el resto del �alor de la �ariable. Tambi�n es posible �sar n�meros negati�os para despla�arse de atr�s hacia adelante. Por ejemplo esto e�traer� los �ltimos 24 caracteres de la �ariable %path%: C:\> echo %path:��24% C:\WINDOWS\S�stem32\Wbem
Lo sig�iente e�traer� toda la �ariable e�cept�ando los 24 �ltimos caracteres: C:\> echo %path:�0,�24% C:\WINDOWS\s�stem32;C:\WINDOWS;
Lle�ando estos ejemplos a �n ambiente m�s practico, imaginemos q�e q�isi�ramos �sar �n programa para crear carpetas con la fecha act�al de manera a�tom�tica (podr�a ser�ir para �n programa de respaldos). Para eso necesitar�amos �sar la �ariable din�mica %da�e%, pero res�lta q�e la fecha e�pandida por date tiene �n caracter especial no permitido para los nombres de archi�os � carpetas, el slash (/): C:\> echo %date% 20/01/2013
Para poder q�itar el slash, deberemos primero di�idir la fecha entre d�a, mes � a�o, contando primero por q�e caracteres nos despla�aremos � l�ego los caracteres q�e tomaremos: C:\> echo %date:�0,2% %date:�3,2% %date:��4% 20 01 2013
10
Debo aclarar que para usar esta formalidad se necesita del símbolo “~” (Alt + 126)
26
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 Primero a partir de la posici�n 0, tomamos los primeros 2 caracteres (20), l�ego en la posici�n 3 tomamos los sig�ientes 2 (01) � l�ego tomamos directamente los 4 �ltimos (201 3). Ahora si q�isi�ramos a�adir tambi�n la hora act�al �sando la �ariable %time%, deber�amos q�itar los s�mbolos de dos p�ntos (:) para poder incorporarla como parte del nombre de �na carpeta o archi�o. Time e�pande la hora de la sig�iente manera: C:\> echo %time% 20:31:52,94
Como �emos, adem�s de la hora, los min�tos � los seg�ndos, tambi�n se m�estran las d�cimas de los seg�ndos, algo q�e tal �e� deber�amos omitir �a q�e no �iene al caso incorporar a �n nombre. Utili�ando el m�todo q�e �samos con la �ariable %date% podemos �desarmar� la hora act�al: C:\> echo %time:�0,2% %time:�3,2% %time:�6,2% 20 31 52
Ahora podr�amos definir �n sistema para crear �na carpeta o archi�o con la fecha � la hora act�al �sando set /a. Para poder establecer �na mejor organi�aci�n de los archi�os, in�ertiremos el orden de la fecha para q�e sea f�cilmente clasificable: @echo off title Crear carpeta con fecha � hora set /a dia=%date:�0,2%,mes=%date:�3,2%,anio=%date:��4% set /a hor=%time:�0,2%,min=%time:�3,2%,seg=%time:�6,2% set fecha=%anio%�%mes%�%dia% set hora=%hor%�%min%�%seg% md %fecha%_%hora%
Esto dar� como res�ltado �na carpeta con el sig�iente nombre: 2013�1�20_20�31�52 Ob�iamente esto lo podr�amos modificar como q�isi�ramos, pero cabe aclarar q�e si obser�amos el formato del mes act�al (01) a perdido el cero q�e lo preced�a, �a q�e debido a como e�presa la a��da de set, los n�meros con prefijo cero son �alidos solo como octales, pero no como decimales. Por eso, c�ando �eamos la sentencia de control FOR, �eremos otro m�todo distinto para obtener la hora � fecha act�al, a�nq�e no menos complicado q�e el act�al. Finali�ando todo este cap�t�lo, en la manip�laci�n a�an�ada de �ariables solamente me faltaba e�plicar lo q�e se denomina �e�pansi�n de �ariable retardada�, pero q�e debo postergar debido a q�e primero necesitaremos saber las sentencias de control para poder e�plicarlo (�_�)
27
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
Sentencias de control A�nq�e Batch no p�eda soportar �n conj�nto demasiado amplio de sentencias de control como el shell de Lin�� o Po�erShell (�a q�e carece de m�chas f�nciones de programaci�n esenciales como Case, While, Until, etc. presentes en Bash � otros leng�ajes), sin embargo p�ede resol�er m�chos de los problemas m�s �s�ales con s�s sentencias de control, a�nq�e recordemos q�e podemos rec�rrir a b�scar m�chos de los comandos de UNIX/Lin�� compilados especialmente para f�ncionar en el cmd de �indo�s, algo notablemente �til para aprender a �sar Lin�� desde n�estro �indo�s � as� tambi�n resol�er las f�nciones q�e hagan falta.
Etiq�etas: Goto Para poder e�plicar de la mejor manera posible las f�nciones de las sentencias de control (� en especial la sentencia If) debo primero ense�ar el �so de etiq�etas con la instr�cci�n Goto, el c�al es �na s�br�tina m�s q�e �na sentencia de control, por lo q�e se �er� con m�s prof�ndidad c�ando e�pliq�e la f�nci�n Call en el apartado de S�br�tinas. Ha� q�e aclarar q�e el �so de goto � etiq�etas tiene �n enfrentamiento entre di�ersos gr�pos de programadores q�e desaconsejan s� �so dentro de la programaci�n sec�encial � estr�ct�rada debido a q�e el ab�so de estas instr�cciones dific�lta la lect�ra del c�digo f�ente de los programas, prod�ciendo lo q�e se llama �c�digo spaghetti�. P�eden saber m�s sobre esto �iendo en Wikipedia: http://es.�ikipedia.org/�iki/Transferencia_incondicional Como an�cdota, la instr�cci�n goto es �na de las pocas f�nciones de batch q�e no f�eron copiadas de UNIX. F�e copiado �ntegramente de BASIC (act�al Vis�al Basic) � este a s� �e� lo e�trajo del leng�aje Pascal (act�al Delphi) q�e a s� �e� lo hab�a sacado de los primeros leng�ajes m�q�ina. Ahora para e�plicar b�sicamente lo q�e es el �so de Goto, podr�amos describir a las etiq�etas (labels) como si f�eran men�s, se crean con �n te�to precedido del signo dos p�ntos (:) p�diendo contener c�alq�ier car�cter e�cept�ando el espacio o s�mbolos especiales (&()[]��^=;!'+,`��), el te�to de la etiq�eta l�ego es referenciado con el comando goto. S� �so es bastante f�cil: @echo off :etiq�eta echo Hola de n�e�o ;) pa�se>n�l g��� e�i��e�a Lo q�e en este caso hace la f�nci�n goto es ir hacia :etiq�eta (de aq�� el termino de transferencia o redireccionamiento q�e se le otorga a goto), la c�al se �bica al inicio del c�digo haciendo q�e este se repita de n�e�o, permiti�ndonos crear b�cles. Tal �e� alg�nos conocer�n el �ir�s �sat�ra pc� q�e aparece seg�ido por los �t�toriales hacker� de �o�t�be � q�e b�sicamente hace repetir la ejec�ci�n de �n programa de �indo�s p�diendo colgar temporalmente la pc: :repetir start cmd.e�e goto repetir
28
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 En este caso se omite el comando pa�se lo q�e prod�ce �na repetici�n o loop infinito, por lo q�e n�nca ol�iden de colocar �n �a��e o �a��e>��� antes de �sar �n goto q�e accione �na ejec�ci�n retroacti�a (o sea �na acci�n hacia atr�s). Para finali�ar, c�ando �samos goto es posible llamar etiq�etas de 3 formas distintas: goto label goto :label goto:label
C�alq�iera de las maneras anteriores es correcta. Con el condicional if podremos �er mejores ejemplos para el �so de goto.
Condicionales: If La sentencia de control if es �n condicional, o sea q�e establece �na condici�n como: si esto se c�mple, hace esto... � si no se c�mple, hace esto otro. If p�ede comparar cadenas, comprobar la e�istencia de archi�os, hacer comparaciones matem�ticas o reconocer �alores de error entre m�chas otras cosas. Seg�n e�presa la a��da de if, s�s principales f�nciones son las sig�ientes: if cadena1==cadena2 (comando) / if not cadena1==cadena2 (comando) if e�ist archi�o (comando) / if not e�ist archi�o (comando) if errorle�el n�mero (comando) / if not errorle�el n�mero (comando) * El par�metro opcional de ��� e�presa q�e �na acci�n solo se debe lle�ar a ca�o si la condici�n es falsa o desig�al. Por ejemplo, �na comparaci�n de condici�n �erdadera se da b�sicamente de la sig�iente manera: @echo off title Preg�ntita :inicio set /p c�enta=C�anto es 2+2 ?... if %c�enta%==4 (goto bien) else (goto mal) :bien echo El res�ltado es correcto ;P pa�se>n�l e�it :mal echo El res�ltado es incorrecto. V�el�a a intentarlo. goto inicio
Si anali�amos el if �eremos q�e la condici�n es: 29
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 if %�ariable%==X (�na acci�n) else (otra acci�n) El doble ig�al �==� establece �na coincidencia (o ig�aldad), q�e si es cierta proceder� a ejec�tar �na acci�n � q�e si no es cierta (aplicando e��e) har� otra cosa, siendo �else� �na f�nci�n opcional q�e podemos omitir. Recordemos q�e el �so de par�ntesis tambi�n se p�ede omitir sal�o c�ando se �tilice la f�nci�n else. � Para establecer �na desig�aldad o diferencia se �tili�a ��� de la sig�iente manera: if ��� %�ariable%==X acci�n Veamos �n ejemplo: @echo off title Redactor echo Q�ien es el a�tor de este t�torial? set /p �ar= if not %�ar%==nikos3194 ( echo Te eq�i�ocaste �� ) else ( echo Correcto! ^^ ) pa�se>n�l Como se p�ede �er, c�ando colocamos par�ntesis podemos acomodar las acciones como se nos antojen, pero con c�idado de q�e si �samos m�s de �na acci�n las precedamos de &&, �a q�e if no permite �sar m�s de �n comando por cada condici�n. (Veremos esto m�s adelante). � Para hacer �na comprobaci�n de la e�istencia de �n archi�o se procede de la sig�iente manera: if e�ist archi�o. pg (del archi�o.jpg) else (echo archi�o. pg no e�iste) pa�se>n�l
En este caso si e�istiera el archi�o �archi�o.jpg� ser�a eliminado, de lo contrario mostrar�a �n mensaje de q�e el archi�o no e�iste. Una forma m�� �til de �sar esto es para detectar la presencia de �ir�s en memorias � eliminar s� fichero de a�toreprod�cci�n �a�tor�n.inf�: if e�ist %homedri�e%\a�tor�n.inf ( echo S� �nidad esta infectada!, presione �na tecla para eliminar el archi�o perj�dicial ) else ( echo S� �nidad no se enc�entra infectada && pa�se>n�l && goto EOF) pa�se>n�l del /f /s /q %homedri�e%\a�tor�n.inf echo Listo!, presione �na tecla para salir... pa�se>n�l
30
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 M�s adelante est�diaremos el f�ncionamiento � la pre�enci�n de �ir�s con m�s prof�ndidad. Al ig�al q�e �if e�ist� para los archi�os, tambi�n se p�ede �sar � if defi�ed� para las �ariables, permitiendo saber si �na �ariable f�e declarada correctamente: set /P �ar=Ingrese �na �ariable: if not defined %�ar% (echo No ha ingresado �na �ariable) � Comparaciones l�gicas � aritm�ticas Ahora bien, las comparaciones l�gicas o aritm�ticas se forman de la sig�iente manera: if [/i] cadena1 opci�n cadena2 (comando) En donde �cadena1� � �cadena2� p�eden ser �n n�mero, �na palabra, �na �ariable o �n conj�nto de caracteres, q�e estar� delimitado por la opci�n de comparaci�n q�e se halla definido, siendo el l�gar de �opci�n� c�alq�iera de las sig�ientes opciones: EQU: Ig�al (=) NEQ: No ig�al (≠)
LSS: Menor q�e (<) LEQ: Menor o ig�al (≤)
GTR: Ma�or q�e (>) GEQ: Ma�or o ig�al (≥)
El par�metro opcional /i indica q�e para las comparaciones no habr� distinci�n entre ma��sc�las � min�sc�las, �a q�e if por defecto trae la f�nci�n Case�Sensiti�e habilitada. Ejemplo con n�meros: @echo off title Menor o ma�or de edad echo C�antos a�os tenes? set /p edad= if %edad% GEQ 18 goto ma�or if %edad% LEQ 18 goto menor :ma�or echo Usted es ma�or de edad� Di�iertase!!! pa�se>n�l goto salir :menor echo Usted es menor de edad� Af�era!!! pa�se>n�l :salir e�it En este ejemplo comprob�bamos si la �ariable %edad% era ma�or o ig�al (GEQ), o menor o ig �al (LEQ) de 18. Podemos �er este otro ejemplo donde se p�eden �tili�ar GTR (ma�or q�e) � LSS (menor q�e) para adi�inar �n n�mero:
31
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
@echo off :men� echo Tenes q�e a�erig�ar el n�mero para poder salir� set /p �ar=pone �n n�mero: if %�ar%==5 goto si if %�ar% LSS 5 goto menor if %Var% GTR 5 goto ma�or :si echo correcto!! pa�se>n�l goto salir :menor echo elegi otro mas alto goto men� :ma�or echo elegi otro mas chico goto men� :salir e�it Y as� como se p�eden hacer comparaciones con n�meros tambi�n se p�eden comparar cadenas de te�to: @echo off title Login :inicio echo Introd�cir la contrase�a: set /p contra= if %contra% EQU admin (goto correcto) else (goto incorrecto) :correcto echo CONTRASE�A CORRECTA! echo Usted dispone de pribilegio para �er el contenido oc�lto... pa�se>n�l t�pe secreto.t�t e�it :incorrecto echo CONTRASE�A INCORRECTA, VOLVE A INTENTARLO goto inicio
Pero para este �ltimo caso, el hecho de especificar EQU ser�a lo mismo q�e poner �==�, �a q�e e�presa ig�aldad: if %contra%==admin (goto correcto) else (goto incorrecto)
32
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 En caso de q�e �s�ramos el par�metro /i , introd�cir Admin o A DMIN seria ig�al q�e admin. � Comparaciones con �ariables de entorno din�micas If permite comprobar los �alores de las �ariables din�micas ErrorLe�el � CmdE�tVersion de manera directa. En el apartado de Variables de Entorno � Din�micas hab�amos �isto q�e errorle�el ser�ia para detectar errores. Si errorle�el m�estra �n c�digo de salida 0 indica q�e no h�bo ning�n problema � si m�estra �n c�digo de salida s�perior hace referencia a q�e h�bo diferentes errores. Por ejemplo, de la sig�iente manera podremos saber si h�bo �n error ma�or o ig�al a �no: if errorle�el GEQ 1 echo H�bo errores.
La a��da de if (a�nq�e p�simamente trad�cida �D) nos m�estra �n ejemplo m�� oc�rrente de �sar goto para identificar los distintos c�digos de error de��eltos por errorle�el: goto error%errorle�el% :error0 echo El programa batch no ha en�iado c�digos de error. (0 ) && pa�se && goto ne�t :error1 echo El programa batch de�ol�i� el c�digo de error gen�rico. (1) && pa�se && goto ne�t :error9009 echo El programa batch de�ol�i� el error de comando o programa desconocido. (9009) pa�se
Pero a�nq�e esto pare�ca corto, si le a�adimos m�s etiq�etas se podr�a complicar, �a el hecho de tener q�e �sar �na l�nea de etiq�eta hace q�e tengamos q�e agregar m�s comandos precedidos de && hacia �na n�e�a etiq�eta (ne�t). Para mejor �tilidad dentro de �na aplicaci�n batch res�lta m�s pr�ctico �sar if. El sig�iente ejemplo con el comando �cop� dem�estra ser m�s simple � menos problem�tico: @echo off echo Respaldo de la carpeta �Mis doc�mentos� a �n pendri�e: �cop� "%HomeDri�e%%HomePath%\Mis doc�mentos" "E:\Back�p" if errorle�el 0 echo Los ficheros f�eron copiados sin error. if errorle�el 1 echo H�bo �n error gen�rico o no se encontraron ficheros para copiar. if errorle�el 2 echo El �s�ario presion� Ctrl+Pa�sa para s�spender el proceso de Xcop�. if errorle�el 3 echo Oc�rri� �n error de inicio en �n comando. P�ede no haber s�ficiente && echo memoria o espacio en el disco, o se �tili�� �na sinta�is incorrecta. if errorle�el 4 echo Oc�rri� �n error de escrit�ra de disco. if errorle�el 9009 echo El comando XCop� no e�iste o no se enc�entra disponible. pa�se>n�l
Por s�p�esto as� como ha� c�digos de error especiales como el 9009 q�e indica q�e �n programa ejec�tado �no se reconoce como �n comando interno o e�terno, programa o archi�o por lotes ejec�table�, tambi�n ha� m�chos otros errores espec�ficos del sistema. Personalmente no p�edo e�plicar m�s errores �a q�e care�co de rec�rsos para identificarlos todos, adem�s de q�e oc�par�an �n considerable espacio en este t�torial.
33
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 CmdE�tVersion f�nciona como ErrorLe�el pero de�ol�iendo la �ersi�n act�al de las e�tensiones de comando (Windo�s_9� es 1 � en Windo�s_NT es 2), a�nq�e con la partic�laridad de q�e tambi�n nos permite saber si las e�tensiones de comando de cmd.e�e est�n habilitadas poniendo el 1 o el 2: if cmde�t�ersion 1 (echo Las e�tensiones de comando estan habilitadas) else ( echo J�ston tenemos �n problema�) Tal �e� esa sea la ma�or �tilidad q�e le podremos dar a esta �ariable. Recordemos q�e si las e�tensiones de comando no est��iesen habilitadas (solo p�ede s�ceder por acci�n de �n mal�are) significa q�e la mitad de las f�nciones, mejoras � act�ali�aciones de los comandos se perder�an (�er cmd /? ) Para finali�ar solo me q�eda decir q�e �no de los pocos problemas del if de Batch es q�e no posee la f�nci�n elif (o else if) q�e ha� en Bash, Po�erShell � otros leng�ajes, � q�e para sol�cionarlo ser� necesario habilitar la e�pansi�n de �ariable de entorno retardada anidando �n n�e�o if dentro de otro if, algo q�e se �er� en el apartado de E�pansi�n de �ariables retardadas. (Por fa�or pido q�e resistan :P). A modo de repaso �o� a dejar �n ejemplo de b�cle n�m�rico impro�isado con if � goto: @echo off title B�cle simple :inicio set n�mero=1 set /a res�ltado=%res�ltado% + %n�mero% if %res�ltado%==10 (echo B�cle completo && pa�se && e�it) else (goto inicio)
Con esto hicimos q�e la �ariable %res�ltado% (por defecto 0) se le f�era s�mando 1 hasta llegar a 10, donde mostrar�a el mensaje �B�cle completo�.
B�cles: For Estamos ante el apartado m�s denso � tal �e� m�s complicado de este t�torial. FOR es �na de las f�nciones m�s importantes � poderosas q�e e�isten para los leng�ajes de programaci�n en general, desde s� inicio en el ASM (Assembler), pasando por Pascal (Delphi), C++, Ja�a, Vis�al Basic, R�b�, Perl, P�thon � �na infinidad de etc�teras. Posiblemente, a�nq�e el comando FOR en Batch sea poderoso, res�lte �n poco m�s �recortado� q�e en otros leng�ajes. El comando FOR en s� es �na herramienta m�� completa q�e nos permite crear f�nciones l�gicas mediante b�cles, anali�ar segmentos � contenidos de archi�os o carpetas entre m�chas cosas m�s. Si �emos la a��da (FOR /?), la definici�n del comando FOR por defecto es: "Ejec�ta el comando para cada �no de los archi�os especificados en el conj�nto de archi�os." S� sinta�is b�sica para los programas batch es: FOR %%�ariable IN (conj�nto) DO (acciones)
34
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
La sinta�is a�nq�e pare�ca compleja, es m�� f�cil � efica� de interpretar si se le presta b�ena atenci�n: %%�a�iab�e = As� se declara a �na �ariable en �n programa batch; � no, no est� mal �D, �a q�e las �ariables en el comando FOR se definen de esta forma, precedidas de dos signos %% (de porcentaje). Al ig�al q�e c�alq�ier otra �ariable podemos definirla como q�eramos (%%3 , %%X , %%�ar) e�cept�ando a los caracteres especiales no permitidos (�&()[]��^=;!'+,`��). IN = Incl��e al �(conj�nto)�. (c��j����) = archi�os o d�gitos con los q�e q�eremos trabajar. Representa los par�metros o f�nciones q�e �sar�n para ejec�tar las acciones. DO = Incl��e a las �(acciones)�. (acci��e�) = Son el o los comandos q�e q�eremos ejec�tar para lle�ar a cabo �na o �arias acciones. Cada comando p�ede lle�ar s�s par�metros, modificadores � �ariantes. Ejemplos: ...DO (attrib �r �h �s %%�ar) , ...DO (del /f /s /q %%�ar) , ...DO (echo %%�ar >> te�t.t�t) ...etc.
� Cabe decir q�e para declarar �ariables en for e�isten dos modalidades: �na para la l�nea de comandos la c�al se hace precedi�ndola con �n solo signo de porcentaje (%) � otra para los archi�os por lotes, la c�al es precedi�ndola de dos signos (%%) tal como se e�p�so arriba. Otra cosa m�� importante es q�e el m��imo de declaraci�n de �ariables para FOR est� limitado a las letras e�istentes en el abecedario ingl�s (26) m�s los n�meros del 0 al 9. Esto se debe a q�e FOR solo toma el primer car�cter de �na �ariable declarada, por lo q�e %%�ar solo �aldr� %%� a la hora de e�pandirse. Para e�itar errores es recomendable �sar �ariables de �n solo car�cter. Para dar �n mejor ejemplo de alg�no de los �sos q�e podemos darle a FOR, imaginemos q�e n�estra impresora t��iera soportada la salida PRN para poder imprimir �sando el comando ��i�� por consola � q�isi�ramos imprimir �n gran n�mero de doc�mentos TXT, Word � PDF, la sol�ci�n ser�a la sig�iente: FOR %%a IN ( .\*.t�t .\*.doc .\*.pdf ..\*t�t ..\*.doc ..\*.pdf ) DO ( print %%a ) Esta instr�cci�n anterior establece para (FOR) la �ariable �%%a� sobre el conj�nto (IN) del gr�po de archi�os de te�to de e�tensi�n .t�t, .doc � .pdf �bicados en el directorio act�al (.\) � en el padre (..\), � l�ego ejec�ta la acci�n (DO) del comando ��i��, el c�al en��a a imprimir a todo el gr�po de archi�os. Aclaro tambi�n q�e no es obligatorio �sar � .\� para dirigirse a los archi�os del directorio act�al: FOR %%a IN ( *.t�t *.doc *.pdf ) DO ( echo Imprimiendo archi�os... print %%a echo Archi�os impresos... ) Como se p�do obser�ar, tampoco f�e necesario �tili�ar && para incl�ir a m�s de �n comando dentro del DO, �a q�e interpreta el salto de l�nea como �na n�e�a acci�n dentro de los par�ntesis. Lamentablemente todo esto solo f�ncionar�a si los dri�ers de n�estra impresora soportaran la redirecci�n del p�erto paralelo (en des�so) hacia el p�erto USB, adem�s de q�e el comando print posiblemente podr�a fallar al identificar el formato de los archi�os .doc � .pdf Este seria otro ejemplo q�e nos permitir�a eliminar los archi�os de la carpeta Temp (la c�al contiene archi�os temporales): FOR %%� IN ( *.log *.dat *.tmp ) DO ( del /q %Temp%\%%� )
35
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
No q�ise �sar los par�metros /F (for�ar) � /S (sistema) para el comando DEL �a q�e p�ede haber archi�os temporales en �so q�e podr�an ser no con�enientes de borrar. Tambi�n aclaro q�e solo p�se las e�tensiones m�s �s�ales q�e dejan los programas en la carpeta de archi�os temporales, pero si se desea se p�ede colocar *.* para eliminar todo lo q�e p�eda haber. FOR tiene m�chas �tilidades q�e podemos �sar con archi�os. Por ejemplo, lo sig�iente nos permitir�a obtener �na lista de los archi�os contenidos en el directorio act�al: FOR %%�ar IN (*) DO echo %%�ar
Tambi�n podr�amos pedir q�e listara solo los archi�os de e�tensi�n .t�t: FOR %%�ar IN (*.t�t) DO echo %%�ar
Y as� podr�amos especificar los comodines q�e se nos p�dieran oc�rrir. � El primer modificador de FOR es /D /D sir�e para mostrar directorios. Como se �io antes, predeterminadamente FOR solo m�estra archi�os, � si �s�ramos este modificador podr�amos hacer las mismas operaciones pero con carpetas. Por ejemplo, lo sig�iente listar�a todas las carpetas del directorio act�al: FOR /D %%� IN (*) DO (echo %%�)
En este otro caso solo se listar�an las carpetas q�e cont��ieran la letra �m� en s� nombre: FOR /D %%� IN (*m*) DO (echo %%�) � El seg�ndo modificador de FOR es /R /R establece �n an�lisis rec�rsi�o, b�scando los archi�os especificados a tra��s de todos los s�bdirectorios. Lo sig�iente listar�a todos los archi�os .bat q�e p�diera haber en todos los directorios � dentro de s�s s�bdirectorios: FOR /R %%� IN (*.bat) do (echo %%�) Tambi�n es posible combinarlo con /D para mostrar los nombres de todos los s�bdirectorios �sando el comod�n dentro del conj�nto: FOR /D /R %%� IN (*) do (echo %%�) � El tercer modificador de FOR es /L /L hace q�e el conj�nto determinado por IN sea �na s�cesi�n de n�meros q�e �a desde �n inicio hasta �n final � q�e a�menta o dismin��e en f�nci�n de lo especificado en el paso de los n�meros determinados por las comas. Para entenderlo, el pase de n�meros se da de la sig�iente manera: (primer n�mero, n�mero de a�ance , �ltimo n�mero)
36
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 O sea q�e si q�isi�ramos a�an�ar del 1 al 10 la sinta�is ser�a: (1, 1, 10)
Esto har�a empe�ar la sec�encia a partir de 1, a�an�ando de a 1 � terminando en 10. Si lo incorpor�ramos a FOR generar�a lo sig�iente: 1 2 3 4 5 6 7 8 9 10 FOR /L %%� IN (1,1,10) DO echo %%� 1 2 3 4 5 6 7 8 9 10 De esta forma si p�si�ramos (0, 2, 10), empe�ar�a de 0 a�an�ando de a 2 hasta el 10, generando la s�cesi�n de 0 2 4 6 8 10 Tambi�n es posible hacer c�entas regresi�as de la sig�iente forma: (10, �1, 0) El n�mero de a�ance al ser negati�o generar� la s�cesi�n 10 9 8 7 6 5 4 3 2 1 0 � El c�arto modificador de FOR es /F /F es el modificador m�s complejo q�e posee FOR ( 11). Nos permite trabajar con cadenas � archi�os separando s� res�ltado o manip�lar las acciones de los comandos entre m�chas otras f�nciones. �A prestar atenci�n! Con el modificador /F, el conj�nto determinado por IN podr� contener: � Un conj�nto de archi�os ���> especific�ndolos sin comillas � Una cadena de caracteres ���> especific�ndola con comillas dobles [ " " ] � Un comando determinado ���> especific�ndolo con comillas simples [ ' ' ] Ahora bien, las opciones q�e podr�n �sarse para manip�lar el conj�nto especificado son: � e�� ��> Todo lo q�e est� desp��s de �ste car�cter (especificado con eol) ser� ignorado (para cada l�nea) � �ki� ��> Es el n�mero de l�neas a saltarse al principio de �n archi�o o comando. � de�i�� ��> Delims nos sir�e para separar strings (cadenas de caracteres), � si no se coloca esta opci�n se �sar�n como separadores el s�mbolo espacio o tab de manera predeterminada. � ��ke�� ��> Con tokens especificamos q�� segmentos (delimitados por "delims") ser�n pasados a las �ariables. Por ejemplo: 1, 2, 3 Solo pasar� los primeros 3 segmentos. 1,2* Pasa 2 segmentos, el primero � todo lo q�e este desp��s (el * regresa todo el resto de la l�nea) 1,2,3�7.8.9�14,16* Pasar� los tres primeros segmentos, l�ego saltar� al s�ptimo, seg�ir� has el no�eno. L�ego saltar� al 14, salta al diecis�is hasta q�e se acaben los segmentos. � ��eback� ��> Cambia la forma de interpretar si es string o comando 11
For /F (también llamado burlosamente “for five” por quienes se desvelan para entenderlo), posee muchas funciones que requieren leer y releer los textos además de practicarlos para su correcta comprensión. Tener paciencia ;)
37
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
E�pansi�n de �ariables retardadas Esto es algo q�e deber�a haber e�plicado en la secci�n de manip�laci�n a�an�ada de �ariables pero q�e t��e q�e postergar debido a q�e antes era necesario saber las sentencias de control para demostrar s� �tilidad. Primero q�e nada debemos saber q�e esta f�nci�n est� siempre deshabilitada de forma predeterminada (�a q�e n�nca es �tili�ado en la consola sal�o en determinados programas batch con f�ncionalidades especiales), � q�e para habilitarla ha� dos formalidades: �na para c�ando estemos en la propia consola (o sea en tiempo real) � otra c�ando estemos dentro de �n programa batch (o sea en �n archi�o por lotes). Para la primera formalidad para �sar en tiempo real (o sea sin �n archi�o batch, m�� raro q�e se �tilice pero q�e m�estro para mencionarla) es necesario �sar el modificador /V:ON en cmd.e�e: c�d /�:��
Para la seg�nda formalidad (la aplicada en archi�os Batch) solo ha� q�e llamar al comando Se�L�ca� con el arg�mento E�ab�eDe�a�edE��a��i�� desde el mismo archi�o batch: ( 12) �e���ca� e�ab�ede�a�ede��a��i��
Esta �ltima formalidad es la q�e �saremos en los archi�os por lotes. Pero ahora bien �allamos a la pr�ctica, para poder e�plicar s� �so tratar� de dar todos los ejemplos q�e me sean posibles � espero q�e les res�lte comprensible... Primero e�plicar� porq�� se da esta implementaci�n. Res�lta q�e si q�eremos manip�lar a �na misma �ariable q�e se enc�entra tanto f�era como dentro de �na sentencia de control (como �na f�nci�n For q�e �tili�a �na �ariable pre�iamente declarada), dentro de �na sentencia anidada sobre otra sentencia (como �n If dentro de otro If), o en c�alq�ier otra iteraci�n (repetici�n) cmd siempre e�pandir� el primer �alor q�e t��o la �ariable, �eamos �n ejemplo de este problema con if: �e� ch��acab�a�=ade�a��e
if "%ch�pacabras%" == "adelante" ( echo Corre por t� �ida! :0 �e� ch��acab�a�=a��a� if "%ch�pacabras%" == "atras" ( echo Acabas de escapar! :P ) )
Como la e�pansi�n de �ariables predeterminada es inmediata, %ch�pacabras% tendr� el �alor �adelante� para ambas instr�cciones if, por lo c�al c�ando se compare �adelante� con �atr�s� habr� �n error de desig�aldad. Y como e�presa la a��da de Set este error tambi�n oc�rre con la sentencia For: 12
Recomiendo ver setlocal /? para más incormación.
38
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
set LISTA=Mis archi�os en este directorio son: for %%i in (*) do set LISTA=%LISTA% %%i echo %LISTA% >> archi�os.t�t
La sentencia f�� %%i i� (*) d� �e� LISTA=%%i lista todos los archi�os de n�estro directorio pero solo se establecer� en el �ltimo archi�o encontrado, el c�al almacenar� en la �ariable LISTA. Para poder hacer q�e se �ean todos los archi�os, la �ariable LISTA debe ser pre�iamente declarada para ir ac�m�lando el contenido del res�ltado de for por cada archi�o encontrado: �e� LISTA=Mis archi�os en este directorio son: for %%i in (*) do �e� LISTA=%LISTA% %%i
N�tese q�e antes de almacenar %%i se almacena a %LISTA%, la c�al contiene el res�ltado ac�m�lado de cada b�cle hecho por for. Esto deber�a f�ncionar si el cmd no tomar� como �nico �alor para la �ariable %LISTA% al primer �alor declarado, o sea � Mi� a�chi��� e� e��e di�ec���i� ���: � repiti�ndose el mismo error q�e s�ced�a en el ejemplo del if. B�eno no hago m�s ejemplos o me �an a q�erer matar :P ...ahora q�e tenemos bien aclarados (o eso espero) los errores q�e oc�rren de forma predeterminada, �eremos como sol�cionarlos �sando �e���ca� E�ab�eDe�a�edE��a��i�� (Habilitaci�n de Retardo de E�pansi�n) Habilitando la e�pansi�n de �ariables retardadas, la e�pansi�n de �ariables permite �sar el car�cter de e�clamaci�n (!) en �e� del signo de porcentaje (%) para las �ariables pre�iamente declaradas � anidadas dentro de otras s�bsentencias: Sol�ci�n a la anidaci�n de if: @echo off title Ch�pacabras �e���ca� e�ab�ede�a�ede��a��i�� set ch�pacabras=adelante if "%ch�pacabras%" == "adelante" ( echo Corre por t� �ida! set ch�pacabras=atras if "!ch��acab�a�!" == "atras" ( echo Acabas de escapar! ;P ) ) pa�se>n�l
N�tese q�e c�ando se redeclara la �ariable ( �e� ch��acab�a�=a��a�) en el seg�ndo if se e�pande la �ariable encerr�ndose entre signos de e�clamaci�n ( !ch��acab�a�!) Sol�ci�n al b�cle de For:
39
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
@echo off title Mis archi�os �e���ca� e�ab�ede�a�ede��a��i�� set LISTA=Mis archi�os en este directorio son: for %%i in (*) do set LISTA= !LISTA! %%i echo %LISTA% >> archi�os.t�t pa�se>n�l
Ahora q�e la �ariable %LISTA% f�e e�pandida como !LISTA! podr� ir ac�m�lando cada res�ltado mostrado por el b�cle for, almacenando l�ego todos los nombres de n�estros archi�os. Mi� a�chi��� e� e��e di�ec���i� ���: �e���.��� Ch��acab�a�.ba� f���.j�g Mi� a�chi���.ba� Para e�poner �n ejemplo m�s a�an�ado de iteraciones de �ariables con condicionales if � b�cles for, e�pondr� el sig�iente programa q�e realic� como �n generador de �na lista de tablas de m�ltiplicar: @ech� �ff �i��e Tab�a� de M���i��ica� �e� Hech� ��� �ik��3194 �a�a e���ica� �a e��a��i�� de �a�iab�e� �e�a�dada� �e���ca� e�ab�ede�a�ede��a��i�� ech�. ech� E��e ���g�a�a ge�e�a�a ��a �i��a de �ab�a� de ����i��ica� ech� de� 1 a� 10 a �� a�chi�� de �e��� defi�id� ��� e� ���a�i�. ech�. �e� /P a�chi��=I�di��e e� ���b�e �a�a e� a�chi��: �e� a�chi��=%a�chi��%.��� �e� ���=0 :i�i �e� E� ���ib�e �ed�ci� e��� a ��e� /a ���=%���% + 1 && g��� b�c�e� if %���%==0 (�e� ���=1 && g��� b�c�e) if %���%==1 (�e� ���=2 && g��� b�c�e) if %���%==2 (�e� ���=3 && g��� b�c�e) if %���%==3 (�e� ���=4 && g��� b�c�e) if %���%==4 (�e� ���=5 && g��� b�c�e) if %���%==5 (�e� ���=6 && g��� b�c�e) if %���%==6 (�e� ���=7 && g��� b�c�e) if %���%==7 (�e� ���=8 && g��� b�c�e) if %���%==8 (�e� ���=9 && g��� b�c�e) if %���%==9 (�e� ���=10 && g��� b�c�e) if %���%==10 g��� �i��� :b�c�e ech�. >>%a�chi��% ech� Tab�a de� %���% >>%a�chi��%
40
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 f�� /� %%� i� (0, 1, 10) d� ( �e� /a ���a�=%%�*!���! ech� !���! � %%� = !���a�!>>!a�chi��! if %%�==10 g��� i�i ) :�i��� ech�. ech� La� �ab�a� de ����i��ica� f�e��� ge�e�ada� � �e ech� e�c�e���a� e� e� a�chi�� "%a�chi��%" ;) �a��e>��� e�i�
El res�ltado generado en el %archi�o%.t�t ser�a como el sig�iente: Tabla del 1 1�0=0 1�1=1 1�2=2 1�3=3 1�4=4 1�5=5 1�6=6 1�7=7 1�8=8 1�9=9 1 � 10 = 10
Tabla del 2 2�0=0 2�1=2 2�2=4 2�3=6 2�4=8 2 � 5 = 10 2 � 6 = 12 2 � 7 = 14 2 � 8 = 16 2 � 9 = 18 2 � 10 = 20
Tabla del 3 3�0=0 3�1=3 3�2=6 3�3=9 3 � 4 = 12 3 � 5 = 15 3 � 6 = 18 3 � 7 = 21 3 � 8 = 24 3 � 9 = 27 3 � 10 = 30
Tabla del 4 4�0=0 4�1=4 4�2=8 4 � 3 = 12 4 � 4 = 16 4 � 5 = 20 4 � 6 = 24 4 � 7 = 28 4 � 8 = 32 4 � 9 = 36 4 � 10 = 40
Tabla del 5 5�0=0 5�1=5 5 � 2 = 10 5 � 3 = 15 5 � 4 = 20 5 � 5 = 25 5 � 6 = 30 5 � 7 = 35 5 � 8 = 40 5 � 9 = 45 5 � 10 = 50
Ob�iamente las encerr� en c�adros de te�to para economi�ar el largo de la hoja, adem�s solo agrego hasta la tabla del 5 as�miendo q�e los lectores �a las deber�an conocer completas. :P
Polimetr�a Este apartado es �na peq�e�a contin�aci�n del apartado anterior. La polimetr�a es la combinaci�n o anidaci�n de dos o m�s �ariables entre si. Para e�plicarlo �amos a �er �n ejemplo: @echo off title E�tracci�n de caracteres setlocal enabledela�ede�pansion set /p �ariable=Indiq�e �na palabra o frase: set /p n=Indiq�e el n�mero de caracteres a e�traer: set �ariable=!�ariable:�1,%�%! echo. echo %�ariable%
41
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
Como podemos obser�ar, se ha anidado la �ariable %n% dentro de !�ariable! . En este caso se �tili�� para e�traer �n n�mero de caracteres indicados por el �s�ario. As� como este caso, podemos �er otro ejemplo con �n b�cle for: @echo off title Apareciendo setlocal enabledela�ede�pansion set "�ar=apareciendo" for /l %%a in (1,1,11) do ( echo !�ar:�0,%%a! ) pa�se>n�l
Esto har� q�e en la pantalla se imprima: a a� a�a a�a� a�a�e a�a�ec a�a�eci a�a�ecie a�a�ecie� a�a�ecie�d a�a�ecie�d�
Si a esto le a�adi�ramos el comando CLS � el comando timeo�t (para red�cir la �elocidad), har�a �n efecto bonito para mostrar te�to corredi�o en la pantalla ;)
S�br�tinas B�eno, aq�� lo q�e �o llamo �s�br�tinas� en Batch no son las mismas clases de s�br�tinas q�e com�nmente se �en en el resto de leng�ajes de programaci�n, como en el caso de Bash o P�thon. Pero podr�an llamarse S�br�tinas si as� lo q�eremos �D
Call Call p�ede llamar a �n archi�o bat e�terno como �n s�bprograma, a�nq�e tambi�n es posible �sar call llamando a �na etiq�eta. Call es �n comando q�e podemos �tili�ar para la programaci�n mod�lar.
42
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
Shift Shift alterna la posici�n de los par�metros en �n archi�o bat. Gracias a la a��da de este podremos �tili�ar m�s de 10 par�metros reempla�ables n�merados de 0 a 9, en las l�neas de comando, marcando �na diferencia de �na posici�n para cada SHIFT q�e se introd�ce.
Arg�mentos, par�metros � par�metros especiales Ya es sabido q�e casi todos los comandos poseen la sig�iente sinta�is: C��a�d�
[���ci��e� /a�g��e����]
�a�a�e����
El signo % seg�ido de �n n�mero (del 1 al 9) son los par�metros q�e se pasaron al in�ocar n�estro programa bat. Por ejemplo si tenemos �n programa llamado sal�do.bat con lo sig�iente: @ech� �ff ech� H��a %1 , c��� e��a�? �a��e>���
Si lo in�ocamos tecleando en consola � �a��d�.ba� Pe�e� , se mostrar� en pantalla �H��a Pe�e , c��� e��a�?� As� como %1 representa al primer par�metro con q�e f�e in�ocado el bat, %0 representa el nombre del archi�o bat en ejec�ci�n (o sea al mismo sal�do.bat) � %# representa a todos los par�metros q�e se le pasaron (# pertenece al inter�alo del 1 al 9) Vamos a esclarecer esto con �n ejemplo: @ech� �ff ca�� :ci�a E���dia� ba�ch e� a�g� ag�adab�e :ci�a ech� %3 %4 %5 %1 %2
Con ca�� :ci�a llamamos a la etiq�eta :ci�a , � en la etiq�eta :ci�a �emos q�e seg�ido del comando ech� se imprimen �nos par�metros en �n orden determinado, podemos obser�ar q�e los primeros par�metros son el 3, el 4 � el 5, � q�e l�ego �ienen el 1 � el 2. Este orden cambiar�a la frase de �Est�diar batch es algo agradable� por �es algo agradable Est�diar batch�. Como �emos, el comando ca�� establece �n contenido para �na etiq�eta q�e l�ego p�ede ser interpretado mediante par�metros, � nosotros podemos ordenar c�ales par�metros q�eremos pasar antes o desp��s. Los par�metros tienen m�chas �tilidades � se p�eden �sar por ejemplo para pasar nombres de archi�os a �n bat q�e se encarga de borrarlos, mo�erlos, etc. El signo %0 representa el nombre del archi�o bat en ejec�ci�n. El signo %* representa todos los par�metros q�e se le pasaron.
43
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 La s�stit�ci�n de los par�metros del archi�o por lotes (%n) ha sido ampliada. Ahora p�ede �sar la sig�iente sinta�is opcional: %�1 � e�pande %1 q�itando las comillas (") q�e p�diera haber %�f1 � e�pande %1 a �n nombre completo de r�ta %�d1 � e�pande %1 s�lo a �na letra de �nidad %�p1 � e�pande %1 s�lo a �na r�ta %�n1 � e�pande %1 s�lo a �n nombre de archi�o %��1 � e�pande %1 s�lo a �na e�tensi�n de archi�o %�s1 � e�pande la r�ta q�e contiene s�lo nombres cortos %�a1 � e�pande %1 a los atrib�tos del archi�o %�t1 � e�pande %1 a la fecha/hora del archi�o %��1 � e�pande %1 al tama�o del archi�o %�$PATH: 1 � b�sca los directorios en la lista de la RUTA de la �ariable de entorno � e�pande %1 al nombre totalmente calificado del primero q�e encontr�. Si el nombre de la �ariable de entorno no se ha definido o no se ha encontrado el archi�o en la b�sq�eda, entonces este modificador se transforma en �na cadena �ac�a.
Comandos de programaci�n a�an�ados Lo q�e �eremos ahora son comandos de programaci�n natales q�e e�isten desde los primeros inicios de Ms�Dos � se conser�aron para s� �so en la consola de Windo�s.
Macros DosKe� Anteriormente hemos �isto q�e el comando doske� permite recorrer historiales con los comandos �sados en la consola mediante teclas de f�nci�n (F7, F8, F9, etc.). Otra de las f�ncionalidades de doske� es la de crear macros. Una macro es �n conj�nto de �no o m�s de comandos q�e se p�eden ejec�tar llam�ndolos mediante �na cla�e. La principal �entaja de las macros creadas con doske� es q�e se almacenan en memoria con lo c�al s� ejec�ci�n es �ltrarr�pida a�nq�e con la �nica des�entaja de q�e las macros d�ran solo d�rante �na sesi�n de la �entana del s�mbolo de sistema (a�nq�e es posible dejarlas g�ardadas en �n archi�o batch). La sinta�is para crear macros es la sig�iente: d��ke� ���b�e_�ac��=c��a�d�
As�, por ejemplo podr�amos escribir lo sig�iente: d��ke� �=�e���a� /a /� /�
44
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 C�ando p�lsemos la tecla � seg�ido de enter, estaremos �sando netstat para listar las direcciones � p�ertos abiertos (�a) en formato n�m�rico (�n) con s� PID o identificador de proceso (�o), pero ahora preg�ntar�n: �porq�� cambie el g�i�n ��� por �n slash �/� ? (lo correcto ser�a �e���a� �a��), esto se debe a q�e doske� no f�nciona bien con las opciones q�e son precedidas por g�iones, por lo q�e para m�s compatibilidad ser� necesario cambiarlos por /. Ig�almente ha� �na sol�ci�n para esto q�e es bastante simple: �sar el comod�n de control �^� para los caracteres especiales, lo c�al nos permitir� adem�s poder �sar && para agr�par comandos: d��ke� �=�e���a� ^�a�� ^&^& i�c��fig /a��
Esto nos permitir� �sar netstat de la misma manera � en conj�nto con el comando ipconfig / all con solo p�lsar n. Ahora bien, �n tema interesante es q�e doske� posee �na codificaci�n especial para �sar en s�s macros. Por ejemplo si q�isi�ramos crear �n pse�do comando q�e cree �n directorio � l�ego pase al mismo, con la sig�iente instr�cci�n podr�amos hacerlo: d��ke� �c=�d $1 $T cd $1
Obteniendo lo sig�iente: �c Ca��e�a C:\Ca��e�a>_
El $1 es ig�al a %1 � indica el primer par�metro pasado, o sea el nombre del directorio �Carpeta�, $T es ig�al a && � permite adj�ntar al comando cd de la misma manera q�e ^&^&. Aq�� �na tabla descripti�a con los c�digos soportados por Doske�: C�digo $G � $g $G$G � $g$g $L o $l $B o $b $T o $t $$ $1 a $9 $*
Significado Redirecciona la salida de los datos a �n sitio o archi�o. Eq�i�alente a > Redirecciona la salida de los datos a �n archi�o pero sin sobrescribirlo. Eq�i�alente a >> Redirecciona la entrada de datos desde �n dispositi�o o archi�o. Eq�i�ale a < En��a el res�ltado de la macro a otro comando para s� ejec�ci�n. Eq�i�alente a � Separa comandos � permite s� ejec�ci�n sec�encial. Eq�i�alente a && Especifica el signo $ en caso q�e sea necesario. Eq�i�alente a los par�metros en los archi�os por lotes (%1 � %9), � representa c�alq�ier informaci�n q�e deba ser introd�cida por el �s�ario de la macro. Representa a todos los par�metros pasados a la macro.
Podemos respaldar n�estras macros a �n archi�o de te�to o batch, de la sig�iente manera: d��ke� /�ac��� > �i�_�ac���.ba�
Lo sig�iente ser�ir�a para �ol�er a cargar el archi�o con las macros g�ardadas anteriormente: d��ke� /�ac��fi�e=�i�_�ac���.ba�
Finalmente si lo deseamos, �sando A��+F10 podemos borrar todas las macros generadas para la sesi�n de cmd.e�e.
45
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
E�tras F�nciones antig�as de Ms�Dos (Old Dos) Lo sig�iente es �na s�cinta g��a de comandos antig�os de Ms�Dos q�e carece de �tilidad debido q�e casi la totalidad de ellos dej� de e�istir r�pida o pa�latinamente. Solo la q�ise adj�ntar al t�torial para q�e refle�ionemos en los c�antiosos cambios q�e hace Microsoft a la hora de modificar �n sistema, algo q�e en Lin�� no oc�rre de la misma manera. CHKDSK � Controla �n disco � pro�ee informaci�n sobre s� capacidad, s� estado, los directorios, los archi�os, la FAT, etc. Hab�a sido reempla�ado por SCANDISK en el DOS 6.2 pero l�ego f�e reincorporado en las posteriores �ersiones. EDIT � Editor q�e reempla�aba a Edlin desde el DOS 5.0. Se �saba esencialmente para modificar peq�e�os archi�os de te�to, empe�ando por los archi�os de sistema, q�e eran el Config.s�s � el AUTOEXEC.BAT. Permaneci� hasta q�e las �ersiones de �indo�s lo despla�aron. FDISK � Instala �n disco d�ro, crea, m�estra en pantalla o s�prime particiones. Era �n comando m�� peligroso de �sar �a q�e �n error o interr�pci�n Ctrl.+C pod�a dejar el disco irrec�perable. INSTALL � Cargaba los programas residentes a tra��s del Config.s�s. MSCDEX � Permit�a el acceso a los CD�ROM a partir del DOS 6. SCANDISK � Herramienta de �erificaci�n � reparaci�n de los discos d�ros a partir de la �ersi�n 6.2. F�e ��elto a reempla�ar por CHKDSK. ANSI.SYS � Cargaba el c�digo ANSI desde el archi�o Config.s�s mediante la opci�n De�ice= APPEND � Indicaba al sistema en q�� directorios DOS debe b�scar los archi�os de datos. Este comando complementaba al comando PATH, q�e s�lo se oc�pa de archi�os de comandos. ASSIGN � En�iaba el comando direccionado en �n disco hacia otro disco; este �ltimo reempla�aba al primero. Dejo de e�istir en el DOS 6. BACKUP � Reali�aba �na copia de seg�ridad de los archi�os de �n disco en �no o � arios discos, mostrando mientras tanto s� nombre en pantalla. La resta�raci�n de los archi�os se hace con la orden de sentido contrario, RESTORE. Dej� de e�istir en el DOS 6, lo c�al f�e �na bendici�n porq�e este comando era �no de los m�s dif�ciles de manejar. BASIC � Llamaba al leng�aje Basic en los IBM PC. Se tratar�a del leng�aje de programaci�n m�s simple q�e e�iste. A partir del DOS 5 f�e reempla�ado por Qbasic, �n int�rprete mejorado. BUFFERS � Comando para el Config.s�s q�e determinaba la capacidad del b�fer para el disco. CHKSTATE.SYS � Incorporado en el DOS 6 por el programa MemMaker para optimi�ar la memoria. CHOICE � Una no�edad del DOS 6 q�e l�ego desapareci� en los int�rpretes de comandos basados en Windo�s NT. B�sicamente le pide al �s�ario q�e efect�e �na selecci�n de men� desde el teclado en �n programa batch �sando errorle�el como entrada est�ndar. Alg�nos programadores batch lo sig�ieron adj�ntando a s�s aplicaciones c�ando dej� de e�istir. COMMAND � Llamaba a �n procesador sec�ndario de comandos, o reinstalaba el procesador de comandos COMMAND.COM del DOS. CONFIG.SYS � Archi�o de config�raci�n del sistema q�e dispon�a de instr�cciones propias. Este archi�o se ejec�taba a�tom�ticamente cada �e� q�e se pon�a en f�ncionamiento la comp�tadora. Act�almente se enc�entra en el s�stem32 bajo el nombre Config.nt, mientras q�e s� e�istencia en la ra�� del disco se conser�� solo por compatibilidad. COUNTRY � Nacionali�aba el sistema, adapt�ndolo a cada pa�s. DBLSPACE � Compactaba el disco d�ro, d�plicando apro�imadamente s� capacidad. La compresi�n pod�a �ariar normalmente de 1,7 a m�s de 10, seg�n el tipo de archi�o. Este comando f�e reempla�ado por DRIVESPACE a
46
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 partir del DOS 6.22 � l�ego f�e ��elto a reempla�ar por el comando COMPACT en las �ersiones act�ales de Windo�s NT. DEBUG � Lan�aba el programa de deb�gging (eliminaci�n de errores). Deb�g siempre est��o reser�ado a los e�pertos, a�nq�e ten�a �arias f�nciones �tiles para archi�os batch. L�ego de casi 30 a�os de �so f�e eliminado por obsoleto en Windo�s 7. DEFRAG � A partir del DOS 6 desfragmentaba los archi�os en el disco d�ro para mejorar la �elocidad � la seg�ridad de lect�ra. DELOLDOS � S�prim�a la p�esta en reser�a de �n DOS antig�o. DELTREE � Era �n comando q�e s�prim�a �n directorio � todo lo q�e p�diera contener, incl��endo los s�bdirectorios, en �na sola operaci�n. Esto hi�o q�e f�era �n comando peligroso �sado por �ir�s por lo q�e f�e remo�ido. DEVICE � Instalaba �n dri�er de perif�rico, por medio del Config.s�s. DEVICEHIGH � A��daba a cargar �n administrador en memoria s�perior, por encima del l�mite de los primeros 640 KB. DISKCOMP � Comparaba el contenido total, pista por pista � sector por sector, de dos disq�etes del mismo tipo. Era �n comando m�� lento de �tili�ar. DISKCOPY � Copiaba de modo id�ntico el contenido de �n disq�ete f�ente en �n disq�ete destinatario rig�rosamente del mismo formato, formateando pre�iamente este �ltimo � haci�ndolo sobre el modelo del disq�ete f�ente si es necesario. Sol�a dar m�chos errores. DISPLAY.SYS � Se �tili�aba para conm�tar las tablas de c�digos, ��a el Config.s�s. DOS � Establec�a �n ��nc�lo en la memoria �s�al � la memoria s�perior a tra��s del config.s�s. DOSSHELL � Llamaba a la s�perestr�ct�ra de di�logo del DOS. Este shell f�e s�primido en la �ersi�n DOS 6.2 �a q�e Microsoft consider� q�e hab�a sido reempla�ado �entajosamente por el administrador de archi�os de Windo�s E�plorer.e�e. DRIVER.SYS � Administraba las disq�eteras a tra��s del Config.S�s. DRIVPARM � Defin�a los par�metros de perif�ricos en modo bloq�e a tra��s del Config.S�s. EMM386 � Sim�laba la memoria e�pandida en la memoria e�tendida a tra��s del Config.s�s. EXE2BIN � Un comando bastante �til en s� momento. Ser��a para con�ertir el formato .EXE en .BIN o .COM, haciendo q�e los programas �sar�n menos espacio en memoria � f�eran m�s compatibles. Este comando estaba destinado a los programadores. EXPAND � Descomprime �n archi�o comprimido CAB. A�n se contin�a �tili�ando. FASTHELP � Mostraba en pantalla la a��da de los comandos de MS�DOS 6. FASTOPEN � Proporcionaba �n acceso r�pido a los archi�os q�e se �san con m�s frec�encia, o a los �ltimos q�e se han �tili�ado, memori�ando s� camino de acceso. FC � Permite comparar de archi�os. No est��o disponible en todas las �ersiones. FCBS � Especificaba la cantidad de bloq�es de control de archi�os en el Config.S�s. FILES � Especificaba la cantidad de archi�os abiertos en el Config.S�s. GRAFTABL � Cargaba la tabla de los caracteres gr�ficos, los c�digos ASCII 128 a 255, para la �is�ali�aci�n en pantalla. No se �s� m�s pero f�e conser�ado por compatibilidad. GRAPHIC � Cargaba �na sec�encia q�e permite la impresi�n de la pantalla q�e incl��e caracteres gr�ficos, de c�digos ASCII 128 a 255. GWBASIC � Llamado del antig�o Basic a�an�ado de Microsoft. No e�istio m�s �a q�e f�e reempla�ado por el QBasic. HELP � Pedido de a��da de comandos a partir del DOS 5. HIMEM.SYS � Administrador de memoria e�tendida, a�n se �sa por compatibilidad. INCLUDE � Incl��a �n bloq�e de config�raci�n en otro a tra��s del Config.S�s. INTERLNK � Conectaba dos comp�tadoras en red, por medio de s�s p�ertos paralelos o en serie. JOIN � Asignaba el contenido de �n disco a �n directorio de otro disco. No e�iste m�s. KEYB � Cargaba el programa q�e administrar�a el teclado (reemplaba al q�e reside en la memoria m�erta, para el teclado de USA). LASTDRIVE � Define la cantidad de �nidades de disco en el Config.S�s. LINK � Llamaba al editor de cone�iones. Reser�ado a los programadores. LOADFIX � Cargaba �n programa por encima de los primeros 64 Kb de memoria.
47
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 LOADHIGH � Cargaba �n programa en la memoria s�perior a tra��s del a�toe�ec.bat a partir del DOS 5. S� otro nombre era LH. MEM � M�estra en pantalla la memoria oc�pada � la disponible, disponible hasta Windo�s XP. MEMMAKER � Permit�a la administraci�n � optimi�aci�n de la memoria desde DOS 6. MENUCOLOR � Determinaba el color de te�to � fondo para el primer men� desde Config.S�s. MENUDEFAULT � Especificaba el men� por defecto en el inicio. MENUITEM � Defin�a �n �tem del men� de arranq�e. MIRROR � Copia de seg�ridad para el seg�imiento del borrado de archi�os con el DOS 5 . MODE � Establec�a las condiciones de f�ncionamiento de los perif�ricos, impresora, interfase de �ideo � cone�iones en serie, tambi�n ser�ia para la preparaci�n de las tablas de c�digos. F�e conser�ado por compatibilidad en las �ersiones de NT. MSBACKUP � Procedimiento de copia de seg�ridad en el DOS 6. MSD � Pro�e�a informaci�n t�cnica sobre la comp�tadora en el DOS 6. NLSFUNC � Comando relati�o a los idiomas nacionales. S� nombre pro�iene de �Nacional Lang�ages S�pport F�nction�. Da informaciones complementarias sobre los pa�ses � preparaba el �so de las tablas de c�digos con CHCP. PAUSE � S�spend�a la ejec�ci�n de �n programa .BAT mostrando en pantalla �n mensaje optati�o de 121 caracteres como m��imo. Act�almente f�e modificado � �a no permite mostrar mensajes opcionales. POWER � Pon�a o sacaba de ser�icio la administraci�n del cons�mo de energ�a. PRINT � Imprime el contenido de archi�os, en seg�ndo plano, mientras se prosig�e con �n trabajo en la pantalla. F�e conser�ado por compatibilidad. PRINTER.SYS � Se �saba para conm�tar las tablas de c�digos con las impresoras en Config.S�s. QBASIC � F�e el n�e�o leng�aje Basic de Microsoft en el DOS 5. Reempla�ado por Vis�al Basic. RAMDRIVE � Instalaba �n disco �irt�al a tra��s del Config.S�s. RECOVER � Inter�iene c�ando ha� q�e rec�perar los datos de �n archi�o porq�e ha� �n sector defect�oso en el disco. Los datos de este sector se habr�n perdido. Se conser�� en Windo�s NT. RESTORE � Resta�ra el contenido de �n disco a partir de s� copia de seg�ridad anterior, con los DOS hasta el 5 incl�si�e. Posteriormente s�lo e�isti� por compatibilidad. SETVER � Declaraba las �ersiones del DOS para alg�nas aplicaciones. SHARE � Instalaba el programa para compartir archi�os en red. SHELL � Instalaba �n procesador de comandos. SHIPDISK � Bloq�eaba los cabe�ales del disco d�ro antes de despla�arlo. Desapareci� en DOS 6. SMARTDRV � Creaci�n de la ante memoria de disco SmartDri�e en DOS 6. STACKS � Defin�a las pilas a tra��s del Config.S�s. SUBMENU � Defin�a �n �tem del men� de arranq�e abriendo �n s�bmen� a partir del DOS 6. SUBST � S�stit��e �n camino de acceso c��a r�ta �/o descripci�n es larga, por �na �nidad de disco ficticia q�e bastar� con llamar l�ego. A�n contin�a �tili��ndose. SWITCHES � S�stit��a al teclado e�tendido por el teclado con�encional. SYS � Comando q�e copiaba los tres archi�os q�e sir�en de n�cleo al sistema del disco f�ente acti�o a �n disco destinatario. UNDELETE � Rec�peraci�n de archi�os borrados. Reempla�ado por RECOVER. UNFORMAT � Reconstr�cci�n de �n disco reformateado a partir del DOS 5 (dej� de e�istir). VDISK � Instalaba �n disco �irt�al, a tra��s del Config.S�s. Dej� de e�istir en DOS 6. VER � M�estra en pantalla la �ersi�n acti�a del sistema. VOL � M�estra en pantalla el nombre del disco act�al o el del solicit ado. XCOPY � Copia archi�os selecti�amente, incl�si�e los q�e pro�ienen de s�bdirectorios. Es �n comando e�celente q�e sir�e para efect�ar copias de seg�ridad.
48
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
49
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
� Lib�� ��: P��g�a�aci�� Ba�h � Introd�cci�n � diferencias Como �imos con cmd.e�e, �n Shell es �n programa q�e permite establecer contacto entre el �s�ario � el sistema operati�o, a�nq�e el cmd de �indo�s f�e despla�ado por e�plorer como el n�e�o shell, el c�al �a pose�a el GUI (interfa� gr�fica de �s�ario) incorporado. En los sistemas UNIX � Lin�� ha� m�ltit�d de shells, pero el m�s frec�ente es el Bo�rne Again Shell o Bash, �na e�ol�ci�n mejorada del propio Bo�rne Shell (Bsh). Todos los shells q�e ha� en UNIX � Lin�� tienen alg�nos elementos partic�lares q�e los disting�en entre s�, pero en realidad las similit�des entre todos son tan grandes q�e el solo hecho de conocer �no nos permite trabajar con c�alq�ier otro shell sin m�chos incon�enientes.
Migraci�n b�sica Tabla de comparaci�n de comandos entre Batch � s�s eq�i�alentes en Bash (Uni�/Lin��): ( 13)
C��a�d� Ba�ch
E��i�a�e��e e� Ba�h
De�c�i�ci��
dir dir *.* /o�d
ls ls �tr
dir *.* /� /os dir /s dir /a tree cd mkdir md assign rmdir rd cd (sin parametros) del erase rd /s (NT) deltree (DOS 6) cop� �cop�
ls �ls ls �R ls �a tree cd mkdir
Lista el contenido de �n directorio. Lista el contenido por el orden de la fecha de creaci�n o modificaci�n primero. Lista los archi�os por s� tama�o. Lista los s�bdirectorios de forma rec�rsi�a. Lista los archi�os oc�ltos. Lista directorios de forma rec�rsi�a. Cambia de directorio. Crea �n n�e�o directorio.
ln rmdir
Crea �n �inc�lo (link) a �n archi�o o directorio. Elimina �n directorio.
p�d rm �i�
M�estra la �bicaci�n act�al. Elimina �n archi�o.
rm �R
Elimina todos los s�bdirectorios � archi�os de �n directorio de forma rec�rsi�a. Copia �n archi�o. Copia todos los archi�os de �n directorio de forma rec�rsi�a.
13
cp �pi� cp �R
Agradecimientos al sitio YoLinux.com por proporcionar la tabla original en inglés: http://www.yolinux.com/TUTORIALS/unix_for_dos_users.html (La presente versión traducida po see algunas actualizaciones).
50
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 rename mo�e t�pe
m� �i�
M�e�e o renombra a �n archi�o.
cat
more
more
help comando comando /? cls
man comando comando ��help clear Ctrl. + L e�it e�it 0 grep
M�estra o ��elca el contenido de �n archi�o especificado. Redirecciona la salida mostrando el contenido p�gina por p�gina. M�estra la a��da sobre el comando especificado.
e�it e�it 0 find findstr comp fc set set �ariable=�alor echo %�ariable% echo te�to set PATH=%PATH%;/dir prompt $p$g
cmp diff set en� e�port �ariable=�alor seten� �ariable=�alor echo $�ariable echo �te�to� e�port PATH=�$PATH:/dir� e�port PS1='\h(\�)\W> '
date time doske� /h doske� nombre=comando
histor� alias nombre=comando
break on
trap
sort
sort
edlin edit notepad
ed �i, �im, emacs, sed, gedit, �edit, pico, gnp, �emacs, dtpad, etc.
back�p �archi�os� A:\ �cop� �archi�os� A:\
attrib
tar �c�f /de�/fd0 �archi�os� mdir mcop� tar ���f /de�/fd0 �archi�os� mdir mcop� chmod
attrib +h archi�o
m� archi�o .archi�o
print cmd /C script (NT) command /C (DOS) call script
lpr sh script script
restore A:\�archi�os� �cop� A:\�archi�os�
date
Limpia la pantalla. Sale de la l�nea de comandos o shell. Abandona el shell con �alor errorle�el 0. B�sca �na palabra o conj�nto de caracteres en �no o m�s archi�os especificados. Compara dos archi�os � m�estra s�s diferencias. Otras alternati�as son comm, mgdiff � tkdiff. M�estra todas las �ariables de entorno declaradas en el sistema. Declara �na �ariable en la KornSh o Bash. Declara �na �ariable en la C shell K&R E�pande el contenido de �na �ariable. M�estra �n te�to en pantalla. Establece �na n�e�a r�ta en PATH. Establece �n �alor para el g�i�n o p�nto de inserci�n de la consola del �s�ario. M�estra la fecha � hora act�al. M�estra �n historial de comandos tipeados. Establece �n alias o nombre s�stit�ti�o para �n comando determinado. Habilita el atajo Ctrl. + Pa�sa para pa�sar �n proceso o comando determinado. Redirecciona la salida mostrando el contenido ordenado alfab�ticamente. Editor de te�to de l�nea. Edita �n archi�o de te�to sin formato. Las alternati�as de Uni�/Lin�� son m�cho m�s a�an�adas en c�anto a opciones. G�arda archi�os en �n flopp�. La f�nsi�n en Lin�� es m�cho m�s e�tendida al poder comprimirlos adem�s de copiarlos. Rec�pera archi�os de respaldo en �n flopp�.
Cambia los atrib�tos � permisos de lect�ra de �n archi�o especificado. Con�ierte �n archi�o en oc�lto (en UNIX se hace precediendo el nombre de p�nto). Imprime �n archi�o de te�to plano. Llama a la linea de comandos para ejec�tar �n script especificado.
51
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 mem
chkdsk scandisk chdisk (DOS) fdisk s�bst X: C:\directorio
free top ps �a�� top fsck deb�gfs d� �s fdisk mo�nt
format
mke2fs
�er echo %COMSPEC% pk�ip
hostname ping
�name �a echo $SHELL �ip, g�ip b�ip2 tar hostname ping
tracert
tracero�te
ipconfig (NT) �inipcfg (DOS) nbtstat (�n, �c) nbtstat �a dominio
ifconfig
tasklist
nslook�p dominio host dominio nmlook�p �A dominio ro�te �n
ro�te print netstat �r net help start net start nombre net stop nombre net share
chkconfig �list � grep on ser�ice nombre start ser�ice nombre stop df
net send mensaje msg e�plorer sh�tdo�n sh�tdo�n �r
smbclient �M (�inhostname) talk start� sh�tdo�n sh�tdo�n �r
M�estra el �so o la memoria libre en el sistema. Lista los nombres, PID � �so de memoria de los procesos acti�os en el sistema. Anali�a � repara el sistema sistema de archi�os del disco d�ro. M�estra el �so � espacio libre del disco. Herramienta de particionamiento de disco. Monta �na letra de �nidad para �n directorio especificado (no eq�i�alente). Formatea �n disco d�ro. Para disq�etes se debe �sar fdformat o mformat. M�estra la �ersi�n del sistema operati�o. M�estra la �bicaci�n del shell. Comprime o descomprime archi�os � directorios. El comando tar permite concatenar archi�os sin compresi�n. M�estra el nombre de la comp�tadora. En�ia �n n�mero de paq�etes a �n host determinado para comprobar la cone�i�n. M�estra los saltos de r�tas por donde �iajan los paq�etes hasta llegar al host de destino. M�estra o config�ra �n dispositi�o de red. M�estra la informaci�n DNS o nombres de NetBIOS del dominio determinado. M�estra el contenido de la tabla de r�tas. Lista los ser�icios acti�os. Acti�a o desacti�a �n ser�icio o demonio. M�estra los archi�os o directorios montados o compartidos. En��a �n mensaje de red a �na PC con Windo�s. En��a mensajes a otro �s�ario del sistema. Inicia la interfa� gr�fica. Apaga el sistema. Reinicia el sistema.
A partir de esta tabla podr�amos crear �na lista de alias q�e nos permita �sar el eq�i�alente de cada comando sin tener q�e rememori�arlos. Los alias p�eden ser g�ardados en el archi�o de perfil de Bash �.bashrc� en la carpeta personal del �s�ario, o sea q�e se enc�entra generalmente en la �bicaci�n $HOME/.bashrc. Esta ser�a �na s�cinta lista de alg�nos de los comandos m�s �s�ales � s�s eq�i�alentes:
52
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
alias alias alias alias alias alias alias alias alias alias alias alias
dir=ls -lF del=rm rm -iv del= move=mv mv -iv move= rename=mv mv -iv rename= copy=cp cp -piv copy= type=cat cat type= cls=c clear cls= mem=free free mem= ver=uname uname -a ver= C:=cd C:=cd /
A�nq�e pens�ndolo bien, lo mejor ser�a aprender los comandos de Lin�� � dejar la cost�mbre de �sar cmd.e�e, por lo q�e es m�s recomendable mostrar �n mensaje mencionando la sinta�is correcta de cada �no de los comandos:
alias dir="echo 'Use el comando: ls --lF'" alias del="echo 'Use el comando: rm --iv'" alias move="echo move="ech o 'Use el comando: mv - iv'" alias rename="echo 'Use el comando: mv --iv'" alias copy="echo 'Use el comando: cp --piv'" alias type="echo 'Use el comando: cat'" alias cls="echo 'Use el comando: clear o precione Ctrl+L'" alias mem="echo 'Use el comando: free'" alias ver="echo 'Use el comando: uname --a'" alias C:="echo 'La ' La unidad C no existe en Linux. Utilice cd / para ir a la raiz del sistema.'"
Tabla de comparaci�n entre operadores de consola Batch (cmd.e�e) � Bash (Bo�rne Again Shell):
O�e�ad�� Ba�ch
O�e�ad�� Ba�h
De�c�i�ci��
\ .\ ..\ Ctrl.+ Z Ctrl.+ C n�l con prn lpt1 com1 * ? %�ariable% %1 %2 %3 %4 %5 %6 %7 %8 %9 /o�
/ ./ ../ Ctrl.+ D Ctrl.+ C /de�/n�ll stdin /de�/lp0
Delimitador de r�ta de directorio. Directorio act�al. Directorio s�sperior. Finali�aci�n de escrit�ra. Cierre de Shell. Interr�pci�n de �n proceso o comando. Dispositi�o n�lo. Estandart inp�t o entrada en pantalla. Impresora por defecto o primer p�erto paralelo.
/de�/tt�S0 * ? $�ariable $1 $2 $3 $4 $5 $6 $7 $8 $9
Primer dispositi�o en p�erto serial. Comod�n para �n conj�nto de caracteres. Comod�n para �n car�cter. Prefijo de e�pansi�n de �ariables. Llamada de arg�mentos desde �n script en la shell.
� o ��
� > >> <
� > >> <
Llamada de modificadores o par�metros de comandos. Pipe o t�ber�a de redireccionamiento. Redirecci�n stdo�t. Redirecci�n stdo�t con reescrit�ra. Redirecci�n stdin. 53
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 @echo off rem if string==string if not choice if e�ist C:\r�ta\a.t�t (notepad C:\r�ta\a.t�t ) else ( echo Error ) if not e�ist .\data.db goto label :label FOR %%� in (conj�nto) do ( acciones %%� ) errorle�el timeo�t
set +� # if [ string=string ] != case if [ �e /r�ta/a.t�t] then gedit /r�ta/a.t�t else echo Error fi if [ ! �e ./data.db ] goto label :label for � in conj�nto do acciones � done $? sleep
pa�se>n�l
read
54
Q�ita el eco local. Prefijo de comentario. Establece �na comparaci�n de ig�aldad. Establece �na comparaci�n de desig�aldad. Operador de selecci�n de opciones. Reali�a �n procedimiento condicional si el archi�o a.t�t en \r�ta\ o /r�ta/ e�iste. De ser cierto lo abrir� en �n editor de te�to plano, de lo contrario mostrara �n mensaje diciendo Error.
Condicional si �n archi�o no e�iste. Etiq�eta de transferencia incondicional. B�cle for. Declara �na �ariable sobre �n conj�nto de archi�os o opciones para emprender �na o m�s acciones determinadas. M�estra el c�digo de retorno de error. Pa�sa �n programa permitiendo especificar el tiempo de espera en seg�ndos. Pa�sa �n programa sin mostrar �n mensaje.
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
� Lib�� ���: P��g�a�aci�� P��h�� � Primer contacto Este t�torial introd�ctorio lo hice para aq�ellos q�e �ienen de tener �na introd�cci�n a la programaci�n con Batch (�n leng�aje demasiado restringido en posibilidades), � lo redact� en base a la �G�ia de aprendi�aje de P�thon release 2.0� q�e como an�cdota es de oct�bre del 2000, lo q�e pr�eba la anecdota de q�e los leng�ajes libres ajenos a Microsoft no se desact�ali�an (modific�ndose parcialmente), sino q�e se le agregan n�e�as f�nciones sobre la base original, como en el leng�aje C/C++. P�thon es �n leng�aje mas f�cil q�e C, pero a s� �e� es tan poderoso como C, P�thon adem�s p�ede ser �tili�ado como �na potente calc�ladora. Yo ahora me �o� a basar en �n entorno UNIX like como el caso de GNU/Lin�� Ub�nt� para �ariar �n poco del entorno de Windo�s (com�nmente �sado por la ma�or�a). Primero debemos tener instalado P�thon, siendo q�e en Lin�� �a �iene instalado en especial en todas las distrib�ciones deri�adas de De�ian. En Windo�s la instalaci�n es bastante f�cil, en la p�gina de http://���.p�thon.org/do�nload/ se p�ede bajar la �ltima �ersi�n del interprete de P�thon para cada plataforma. Entre s�s caracter�sticas podr�amos referenciar 3 p�ntos importantes: � Permite resol�er operaciones complejas en C en pocas sentencias. � El agr�pamiento de sentencias se reali�a con sangr�as. � No es necesario declarar los arg�mentos o las �ariables.
Conceptos b�sicos Ahora �amos a hacer lo primero q�e se hace con c�alq�ier leng�aje q�e se aprende: �n �Hola M�ndo� :P Primero abrimos n�estro editor de c�digo fa�orito (recomiendo P�Scripter, Kate o Notepad++) La sinta�is es f�cil: >>> ��i�� �H��a ���d�!� H��a ���d�!
L�ego lo g�ardamos con el nombre � la e�tensi�n �hola_m�ndo.p�� (recomiendo reempla�ar los espacios por el g�i�n bajo en los nombres de archi�os p�thon para hacerlos mas accesibles desde la consola) � l�ego desde la consola Bash o el CMD tecleamos: $ ���h�� h��a_���d�.��
Al dar intro aparecer� el t�pico mensaje �Hola m�ndo!�, al haber tipeado p�thon al principio esto� llamando al interprete a q�e ejec�te el archi�o personalmente, para poder hacer q�e el archi�o se ejec�te con �n doble clic ha� q�e agregar la sig�iente l�nea al principio del c�digo:
#!/���/bi�/���h�� ���h�� h��a_���d�.��
55
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194
Ademas en UNIX*/Lin�� ha� q�e decirle al archi�o q�e es ejec�table mediante la orden: ch��d a+� h��a_���d�.��
Ahora para definir �na �ariable, se pone c�alq�ier nombre sin espacios ni caracteres especiales � s� �alor encerrado entre comillas seg�ido del ig�al, l�ego se con�oca a la �ariable por el nombre definido: �e��aje = �H��a ���d�� ��i�� �e��aje
Las �ariables de p�thon son m�cho m�s elegantes q�e en batch, a�nq�e parecidas en q�e se p�eden �sar para hacer c�lc�los, pero m�cho mas potentes: �e����ad� = 345592652368 + 2759254890 � 4829726345 / 642 * 3 ��i�� �e����ad�
Tambi�n ha� m�chas f�nciones especificas como �e�(��) c��a f�nci�n es medir la cantidad de caracteres de �na cadena de te�to, en este caso la �ariable �e��aje: �e�(��e��aje�) 10
Los comentarios en P�thon se definen con # (n�meral), � en este caso agr�pamos la �ariable en el mensaje, sal�dando a �na persona:
# Sa��da�d� a �e�e ���b�e = �Pe�e� ��i�� �H��a�, ���b�e
# �� ����� ���� ����� �������� � �� �������� ������
Para q�e �na �ariable p�eda ser definida por el �s�ario se �tili�a el comando ra�_inp�t(�Ingrese �n �alor: �) q�e �endr�a a ser como el Set /P Ingrese �n �alor: en batch, p�ede ponerse inp�t(��) solo el te�to seria tratado como �n �alor de �ariable en memoria � no como �na cadena de te�to (string) como lo define el prefijo �ra�_�, ac� se combinar�a ra�_inp�t(��) adentro de �na �ariable:
#!/���/bi�/���h�� # ��������� � ��� �������
���b�e = �a�_i����(�C��� �e ��a�a�? �) ��i�� �H��a�, ���b�e ��i�� �� �� ���b�e �ie�e�, �e�(���b�e), ��e��a�.�
Esto de�ol�er�a:
C��� �e ��a�a�? �ik�� H��a �ik�� � �� ���b�e �ie�e 5 �e��a�.
56
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 Al programa podr�amos agregarle �n condicional con la sentencia IF (ig�al q�e en batch), para en caso de q�e el �s�ario no ingrese �n nombre, ha� q�e notar q�e tanto if como e��e lle�an el signo �dos p�ntos� al final para se�alar las acciones (en batch se �saban opcionalmente par�ntesis):
#!/���/bi�/���h�� # ��������� � ��� �������
���b�e = �a�_i����(�C��� �e ��a�a�? �) if ���b�e == ��: ��i�� �N� �e da� �� ���b�e?... N� �e �a��d�.� e��e: ��i�� �H��a�, ���b�e ��i�� �� �� ���b�e �ie�e�, �e�(���b�e), ��e��a�.�
En programaci�n, � m�s dentro de P�thon ha� m�chas maneras de resol�er �n mismo problema, por ejemplo las cadenas de te�to anteriores �o las separe de las �ariables �sando comas, pero se p�eden j�ntar con el s�mbolo mas (+):
��i�� �H��a� + ���b�e + �� �� ���b�e �ie�e� + ���(�e�(���b�e)) + ��e��a�.�
Nos podemos fijar q�e a len la t��e q�e poner dentro de str(), la c�al dice q�e el �alor de len no es para s�marse (por los signos), sino q�e es �na cadena de te�to (string); por ejemplo las partes te�t�ales del script de arriba al estar encerradas entre comillas se definen como cadenas o strings, si no t��ieran las comillas se definir�an como �alores � no se procesar�an. Para e�plicar mejor esto �o� a dar �n ejemplo, as� q�e abrimos �na consola de P�thon � en el prompt tipeamos lo sig�iente:
>>> 11 + 11 22 >>> �11� + �11� 1111
La diferencia se nota en q�e estando sin comillas las reconoce como �ariables � las procesa como � alores, por lo q�e si en �es de n�meros f�eran te�to dar�a �n error diciendo q�e las �ariables no est�n definidas, en cambio en el �ltimo ejemplo al tener las comillas conser�a los caracteres j�nt�ndolos sin procesarlos si no ha� orden e�plicita. Una f�nci�n a�an�ada de P�thon es la de poder crear f�nciones, esto se hace con el comando DEF q�e �endr�a a ser �na �ariable capa� de almacenar gr�pos de comandos enteros, por ejemplo se p�ede poner �n string determinado:
def ��_�a��da�() ��i�� �N� �e da� �� ���b�e?... N� �e �a��d�.� if ���b�e == ��: ��_�a��da�()
57
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 En este caso anterior definimos la f�nci�n ��_�a��da�() � la colocamos en el if , la f�nci�n def es m�� �til c�ando ha� q�e repetir m�chas �eces �n segmento de c�digo e�tenso en �n programa. Seg�ramente se preg�ntar�n para q�e se dejan los par�ntesis si no tienen nada, � en realidad esto es por con�enci�n, los par�ntesis son para pasar arg�mentos determinados a las f�nciones, a�nq�e esto es algo m�s complicado (� este t�torial es solo introd�ctorio). Un ejemplo de �so de FOR es con �na lista contenida en �na �ariable, por ejemplo:
�e����a� = [�Nik���, �Ma�ia��, �Ma��a�] f�� ���b�e i� �e����a�: ��i�� �H��a�, ���b�e
Esto mostrar�a:
H��a Nik��, H��a Ma�ia�, H��a Ma��a
A partir de ahora el t�torial podr�a e�tenderse con m�s f�nciones, pero creo q�e para ser �na peq�e�a introd�cci�n con esto ser� s�ficiente, a�nq�e no me g�star�a terminar sin antes mencionarles a todos los programadores de Batch q�e est�n b�scando migrar a este mejor leng�aje, la e�istencia del mod�lo OS. Este mod�lo nos permite ejec�tar comandos de sistema � programas e�ternos, � se llama mediante el comandoi����� de la sig�iente forma: i����� ��
Vamos a dar �n ejemplo concreto con �n script:
#!/���/bi�/���h�� i����� �� ��.����e�("�i�g h���://���.g��g�e.c��") �i�e.��ee�(10) ��.����e�("�i�g h���://���.�ah��.c��")
Lo q�e har�a el c�digo anterior ser�a mostrar el res�ltado de dos ping ( a Google � Yahoo) con �n tiempo intermedio de espera de 10 seg�ndos. Ob�iamente este c�digo no tiene �na �tilidad m�� pr�ctica, pero m�estra b�sicamente como f�nciona el m�d�lo OS: primero importamos el m�d�lo � l�ego llamamos los comandos o progr amas q�e precisemos mediante la sentencia os.s�stem("comando o programa") Un ejemplo m�s concreto pero a�an�ado para aq�ellos q�e �ienen de programar en Batch ser�a la reali�aci�n de �n simil "bot" para generar �isitas a lo q�e por ejemplo podr�a ser �n sitio o �n ��deo determinado. Este c�digo q�e �o realic� � coment� estar�a orientado a abrir �n ��deo en Windo�s �sando el na�egador Mo�illa Firefo� (siendo este el na�egador predeterminado) � reprod�cirlo d�rante 5 seg�ndos o menos para l�ego cerrarlo � �ol�erlo a abrir d�rante 200 �eces, lo q�e generar�a 200 reprod�cciones:
#!/���/bi�/���h�� i����� �� # �������� �� ������ ��
58
T�torial de programaci�n Batch m�s migraci�n a Bash e introd�cci�n a P�thon � nikos3194 ���e�� = 0 �abe� .����e�
# ���������� �� �������� ������ ��� ����� 0 # ������� ��� �������� ���� �� ��������� ���� (���� ��� �� �����)
# � ������������ ������ �� ������� ����� �� ������� ���� ����� �� �����:
��.����e�("��a�� h���://���.�����be.c��/�a�ch?�=Bh5W_R5B��I") # �� ���� �� ��� ������� �� ����� �� ��������� ��� �������, ������� ���� �� ���������: # ��.������("%������������%����������������.��� ����://���.�������.���/����������5���5����") # ������� �� ������ �� ������ �� 5 �������� (���� �� �� ������� �� �������)
�i�e.��ee�(5) # �������� �� ��������� �� ������� ��� ����� ������� �� �� ������ �� ������� (��� �������� /�)
��.����e�("TASKKILL /F /IM:fi�ef��.e�e /FI "WINDOWTITLE �e Y��T�be" > ���") # � ������������ �� �� ���� 1 � �� �������� ������
���e�� = ���e�� + 1 # �� ��������� ��� �� �������� ������ �� ����� ������� � 200 (�� ������) � �� ���� �� ������� �� # ���� ��� �� ������� �� ��������� �� � �������� ��� ������� ���� �� ��� ��������� ��� ������� :�
if ���e�� == 200: ��i�� "���i�e de 200 �e���d�cci��e�" && ��i�� "Re��e�e �� IP � b���e �a� c��kie�!" && b�eak e��e: g��� .����e� # �� ���� �� ��� �� ����������� (��) �� ��� ������ (����), �� ��������� ���� ������ � ������� �� ������.
Un ap�nte importante (porq�e me hab�an preg�ntado al respecto) es q�e en p�thon es �sado el �p�nto � coma� (;) para agr�par barios comandos en �na sola l�nea de c�digo, como el "&&" �sado en Batch o Bash. Podr�a haber p�esto m�s ejemplos, pero como dije antes no q�isiera e�tender m�s all� a este t�torial introd�ctorio.
59