58

Codigo Latino 10

Embed Size (px)

DESCRIPTION

Una revista de programacion hecha por hispanos para todo el mundo.

Citation preview

Page 2: Codigo Latino 10

Una entrega más de Código Latino, ya han pasado 15 días desde la última, ya es la segunda enUna entrega más de Código Latino, ya han pasado 15 días desde la última, ya es la segunda en

manos mías y para esta edición tendremos mucho mucho código, estoy tratando de mejorar elmanos mías y para esta edición tendremos mucho mucho código, estoy tratando de mejorar el

aspecto, pero sigo pidiendo ayuda para esto, YO SOY MALO PARA EL DISEÑO.aspecto, pero sigo pidiendo ayuda para esto, YO SOY MALO PARA EL DISEÑO.

Comenzaremos con un código mío, por qué no??? :P jejeje y seguiremos con manuales deComenzaremos con un código mío, por qué no??? :P jejeje y seguiremos con manuales de

grandes de la programación hispanohablante. grandes de la programación hispanohablante.

Espero la disfruten leyendola tanto como yo la hicé editandola!!!Espero la disfruten leyendola tanto como yo la hicé editandola!!!

PD. Soy malo para esto de la primera página también :PPD. Soy malo para esto de la primera página también :P

Page 3: Codigo Latino 10

●● Aplicación Cliente – Servidor (Python)Aplicación Cliente – Servidor (Python)●● Crear nuestra propía RunTime Library I Parte ( C )Crear nuestra propía RunTime Library I Parte ( C )●● Transferir el foco desde un JTextArea al recibir un 'Tab Key'(Java)Transferir el foco desde un JTextArea al recibir un 'Tab Key'(Java)●● Renombrar archivos (Ruby)Renombrar archivos (Ruby)●● Fundamento    de  los   ataques por desbordamiento de Buffer [FADBFundamento    de  los   ataques por desbordamiento de Buffer [FADB  

1­2] (ASM)1­2] (ASM)●● Entrevista a FrankGKEntrevista a FrankGK●● El   futúro   del   Scripting   –   Arquitectura   –   PowerShell   para   IT'sEl   futúro   del   Scripting   –   Arquitectura   –   PowerShell   para   IT's  

(PowerShell)(PowerShell)●● Historia del Lenguaje de Programación PythonHistoria del Lenguaje de Programación Python●● Tutorial BATCHTutorial BATCH●● Review de Inform 7 (Inform) Review de Inform 7 (Inform) ●● Entrevista a F_TanoriEntrevista a F_Tanori

Page 4: Codigo Latino 10

Aplicación Cliente - ServidorAplicación Cliente - Servidor

Por RadicalEdPor RadicalEd http://radicalpython.blogspot.comhttp://radicalpython.blogspot.comHoy explicaremos cómo hacer una sencilla aplicación cliente � servidor con Python; con muy pocas líneas deHoy explicaremos cómo hacer una sencilla aplicación cliente � servidor con Python; con muy pocas líneas de

código se puede hacer una especie de � Troyano� , algo que nunca pude ni siquiera en Visual Basic con sucódigo se puede hacer una especie de � Troyano� , algo que nunca pude ni siquiera en Visual Basic con su

control Winsock >:-( ; en la próxima entrega explicaré como hacer un Troyano de Conexión Inversa.control Winsock >:-( ; en la próxima entrega explicaré como hacer un Troyano de Conexión Inversa.

Ahora veamos el código del Servidor:Ahora veamos el código del Servidor:#!/usr/bin/env python#!/usr/bin/env python

#server.py#server.py

#Desarrollado por RadicalEd#Desarrollado por RadicalEd

importimport socketsocket

fromfrom subprocesssubprocess importimport * *

#Creamos un objeto socket#Creamos un objeto socket

sock = sock = socketsocket..socketsocket((socketsocket..AF_INETAF_INET, , socketsocket..SOCK_STREAM)SOCK_STREAM)

#Nos enlazamos directamente al equipo#Nos enlazamos directamente al equipo

sock.sock.bind((bind((socketsocket..gethostbyname(gethostbyname(socketsocket..gethostname())gethostname()), , 31283128))))

#Nos ponemos a la escucha#Nos ponemos a la escucha

sock.sock.listen(listen(55))

trytry::

whilewhile TrueTrue::

#Aceptamos la conexion quedandonos a la escucha #Aceptamos la conexion quedandonos a la escucha

conn, addr = sock. conn, addr = sock.accept()accept()

#Recibimos hasta 2KB de datos #Recibimos hasta 2KB de datos

command = conn. command = conn.recv(recv(20482048))

trytry::

#Para mas info#Para mas info

#http://www.python.org/doc/2.5/lib/node529.html #http://www.python.org/doc/2.5/lib/node529.html

echo = Popen echo = Popen((command, shell=command, shell=TrueTrue, stdout=PIPE, stdout=PIPE))..stdoutstdout..read()read()

#Enviamos los datos mostrados al cliente #Enviamos los datos mostrados al cliente

conn. conn.send(send(echoecho))

exceptexcept::

#En caso de no ejecutarse se muestra un error #En caso de no ejecutarse se muestra un error

conn. conn.send(send('Error''Error'))

#Cerramos la conexion #Cerramos la conexion

conn. conn.close()close()

#Si llegan a oprimir Ctrl + Z que no muestre nada#Si llegan a oprimir Ctrl + Z que no muestre nada

exceptexcept KeyboardInterruptKeyboardInterrupt::

passpass

Page 5: Codigo Latino 10

Ahora veamos el código del Cliente:Ahora veamos el código del Cliente:#!/usr/bin/env python#!/usr/bin/env python

#cliente.py#cliente.py

#Desarrollado por RadicalEd#Desarrollado por RadicalEd

importimport socketsocket, , syssys

printprint 'Para salir oprima Ctrl + Z''Para salir oprima Ctrl + Z'

IP = IP = raw_inputraw_input(('Digite la IP: ''Digite la IP: '))

trytry::

#Un bucle infinito para enviar peticiones #Un bucle infinito para enviar peticiones

whilewhile TrueTrue::

#Creamos un objeto socket #Creamos un objeto socket

sock = sock = socketsocket..socketsocket((socketsocket..AF_INETAF_INET, , socketsocket..SOCK_STREAM)SOCK_STREAM)

#Nos conectamos #Nos conectamos

sock. sock.connect((connect((IP,IP,31283128))))

#Empezamos a enviar peticiones #Empezamos a enviar peticiones

send = send = raw_inputraw_input(('>>> ''>>> ')) #El prompt de Python :P#El prompt de Python :P

sock. sock.send(send(sendsend))

#Recibimos hasta 2KB de datos #Recibimos hasta 2KB de datos

printprint sock. sock.recv(recv(20482048))

#Cerramos la conexion #Cerramos la conexion

sock. sock.close()close()

#En caso de haber un KeyboardInterrupt salimos sin mostrar nada#En caso de haber un KeyboardInterrupt salimos sin mostrar nada

exceptexcept KeyboardInterruptKeyboardInterrupt::

passpass

Este coloreado de Sintáxis es gracias al Geshi de Este coloreado de Sintáxis es gracias al Geshi de SoloCodigoSoloCodigo

Page 6: Codigo Latino 10

Crear nuestra propia Run Time Library (Primera Parte)Crear nuestra propia Run Time Library (Primera Parte)

Por Eternal_IdolPor Eternal_IdolAlguna vez se preguntaron por que un programa como este puede llegar a ocupar unos 24KB?Alguna vez se preguntaron por que un programa como este puede llegar a ocupar unos 24KB?

intint main( main(int int argc, argc, charchar *argv, *argv, char char *env)*env)

{{

return return 5050;;

}}

Este programa no hace NADA, solo nos devuelve un 50 (si recuerdan nuestro último tutorial esto es mov eax,Este programa no hace NADA, solo nos devuelve un 50 (si recuerdan nuestro último tutorial esto es mov eax,

50). El 'problema' es que VC++ por defecto incorpora su Run Time Library que contiene muchisimas50). El 'problema' es que VC++ por defecto incorpora su Run Time Library que contiene muchisimas

funciones indispensables como strlen, malloc, printf y muchas más. Esta Run Time Library ocupa bastantesfunciones indispensables como strlen, malloc, printf y muchas más. Esta Run Time Library ocupa bastantes

KB, si hacemos un programa extenso su tamaño no tiene la más mínima importancia, pero si sólo escribimosKB, si hacemos un programa extenso su tamaño no tiene la más mínima importancia, pero si sólo escribimos

un par de instrucciones ...un par de instrucciones ...

Linkeen el código anterior con esta línea de comandos:Linkeen el código anterior con esta línea de comandos:

link código.obj /NODEFAULTLIB /ENTRY:mainlink código.obj /NODEFAULTLIB /ENTRY:main

Paso a explicar, NODEFAULTLIB le indica al linker que quite las librerias que utiliza para resolverPaso a explicar, NODEFAULTLIB le indica al linker que quite las librerias que utiliza para resolver

referencias externas por defecto.referencias externas por defecto.

ENTRY le indica al linker la función que dará comienzo al programa que por defecto nunca es main, nuestrasENTRY le indica al linker la función que dará comienzo al programa que por defecto nunca es main, nuestras

funciones main o WinMain son llamadas por otras que antes hacen inicialización de la Heap para utilizarfunciones main o WinMain son llamadas por otras que antes hacen inicialización de la Heap para utilizar

malloc y free, que nos devuelven argc, argv y env por ejemplo. Estas funciones se llaman mainCRTStartupmalloc y free, que nos devuelven argc, argv y env por ejemplo. Estas funciones se llaman mainCRTStartup

para main y WinMainCRTStartup para WinMain.para main y WinMainCRTStartup para WinMain.

Que hemos logrado con esta línea de comandos? Reducir el tamaño de nuestro ejecutable a nada más y nadaQue hemos logrado con esta línea de comandos? Reducir el tamaño de nuestro ejecutable a nada más y nada

menos que 1024 bytes (si no lo consiguieron es porque tienen una versión del linker que usa un align grandemenos que 1024 bytes (si no lo consiguieron es porque tienen una versión del linker que usa un align grande

prueben con: link código.obj /NODEFAULTLIB /ENTRY:main /ALIGN:512 y lo van a conseguir).prueben con: link código.obj /NODEFAULTLIB /ENTRY:main /ALIGN:512 y lo van a conseguir).

Esto está muy bien pero en realidad no nos sirve de mucho, ahora tenemos un programa que estáEsto está muy bien pero en realidad no nos sirve de mucho, ahora tenemos un programa que está

discapacitado, no puede llamar ni siquiera a la función strlen(). Pero como el título de este tutorial dice vamosdiscapacitado, no puede llamar ni siquiera a la función strlen(). Pero como el título de este tutorial dice vamos

a crear nuestra propia Run Time Library para reemplazar la de VC++, el objetivo no es hacer una mejor quea crear nuestra propia Run Time Library para reemplazar la de VC++, el objetivo no es hacer una mejor que

los muchachos de Microsoft, sino tener nuestra propia Run Time Library unicamente con las funciones quelos muchachos de Microsoft, sino tener nuestra propia Run Time Library unicamente con las funciones que

necesitemos y de paso aprender MUCHO sobre programación.necesitemos y de paso aprender MUCHO sobre programación.

Page 7: Codigo Latino 10

Primero vamos a ver un ejemplo de Run Time Library muy simple escrito en C++. Nuestro objetivo en estePrimero vamos a ver un ejemplo de Run Time Library muy simple escrito en C++. Nuestro objetivo en este

momento es compilar este programa (COMUN.CPP) sin la STDLIB por defecto:momento es compilar este programa (COMUN.CPP) sin la STDLIB por defecto:

#include <windows.h>#include <windows.h>

intint main( main(int int argc, argc, charchar *argv, *argv, char char *env)*env)

{{

charchar *dos = ( *dos = (charchar*)malloc(55);*)malloc(55);

intint x = strlen( x = strlen("hola""hola"););

wsprintf(dos, wsprintf(dos,"%d""%d",x);,x);

MessageBox(0,dos,dos,0); MessageBox(0,dos,dos,0);

free(dos); free(dos);

return return 5050;;

}}

Con esta línea de comandos LINK COMUN.OBJ /NODEFAULTLIB user32.lib kernel32.lib nos enteramosCon esta línea de comandos LINK COMUN.OBJ /NODEFAULTLIB user32.lib kernel32.lib nos enteramos

que nos faltan un par de funciones, estas cuatro exactamente:que nos faltan un par de funciones, estas cuatro exactamente:

COMUN.OBJ : error LNK2001: unresolved external symbol _freeCOMUN.OBJ : error LNK2001: unresolved external symbol _free

COMUN.OBJ : error LNK2001: unresolved external symbol _strlenCOMUN.OBJ : error LNK2001: unresolved external symbol _strlen

COMUN.OBJ : error LNK2001: unresolved external symbol _mallocCOMUN.OBJ : error LNK2001: unresolved external symbol _malloc

LINKASM : error LNK2001: unresolved external symbol _mainCRTStartupLINKASM : error LNK2001: unresolved external symbol _mainCRTStartup

COMUN.exe : fatal error LNK1120: 4 unresolved externalsCOMUN.exe : fatal error LNK1120: 4 unresolved externals

Al crear nuestra librería la vamos a hacer lo más módular posible, porque cada archivo objeto (códigoAl crear nuestra librería la vamos a hacer lo más módular posible, porque cada archivo objeto (código

compilado) que sea llamado se cargará completamente, por ejemplo si tenemos todas las funciones dentro decompilado) que sea llamado se cargará completamente, por ejemplo si tenemos todas las funciones dentro de

un solo archivo .cpp, lo compilamos y solo utilizamos strlen() dentro del programa que usa nuestra Run Timeun solo archivo .cpp, lo compilamos y solo utilizamos strlen() dentro del programa que usa nuestra Run Time

Library también serán cargadas strcpy(), malloc(), free() y todas las funciones que hagamos.Library también serán cargadas strcpy(), malloc(), free() y todas las funciones que hagamos.

Sabiendo esto que es muy importante vamos a crear cuatro archivos, C_STR.CPP con las funciones strlen() ySabiendo esto que es muy importante vamos a crear cuatro archivos, C_STR.CPP con las funciones strlen() y

strcpy(), C_MAIN.CPP con mainCRTStartup, C_WMAIN.CPP con WinMainCRTStartup y C_ALLOC.CPPstrcpy(), C_MAIN.CPP con mainCRTStartup, C_WMAIN.CPP con WinMainCRTStartup y C_ALLOC.CPP

con malloc() y free().con malloc() y free().

C_STR.CPP:C_STR.CPP:externextern "C""C" size_t strlen( size_t strlen(const charconst char *s) *s)

{{

unsigned longunsigned long Result = 0; Result = 0;

whilewhile(*s++) { Result++; }(*s++) { Result++; }

returnreturn Result; Result;

}}

Page 8: Codigo Latino 10

extern extern "C" "C" charchar *strcpy( *strcpy(char char *dest, *dest, const charconst char *src) *src)

{{

charchar *cp = dest; *cp = dest;

whilewhile(*cp++ = *src++);(*cp++ = *src++);

return return (dest);(dest);

}}

C_MAIN.CPP:C_MAIN.CPP:extern extern intint main( main(int int argc, argc, charchar *argv, *argv, char char *env)*env)

extern extern "C" "C" voidvoid mainCRTStartup() { main(0,0,0);} mainCRTStartup() { main(0,0,0);}

C_WMAIN.CPP:C_WMAIN.CPP:#include <windows.h>#include <windows.h>

extern extern WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,intint nCmdShow); nCmdShow);

extern extern "C" "C" voidvoid WinMainCRTStartup() { WinMain(GetModuleHandle(WinMainCRTStartup() { WinMain(GetModuleHandle(NULLNULL), ), NULLNULL, GetCommandLine(), SW_SHOW); }, GetCommandLine(), SW_SHOW); }

C_ALLOC.CPP:C_ALLOC.CPP:#include <windows.h>#include <windows.h>

voidvoid *malloc(size_t size) { *malloc(size_t size) { return return HeapAlloc(GetProcessHeap(), HeapAlloc(GetProcessHeap(), NULLNULL, size); }, size); }

voidvoid free(free(voidvoid *block) { HeapFree(GetProcessHeap(), *block) { HeapFree(GetProcessHeap(), NULLNULL, block); }, block); }

Bueno, la mayoria de las cosas las deben entender sin ningún problema, C_STR.CPP tiene dos funcionesBueno, la mayoria de las cosas las deben entender sin ningún problema, C_STR.CPP tiene dos funciones

muy simples strlen() y strcpy() de la STDLIB. C_MAIN.CPP tiene una función que llama al main delmuy simples strlen() y strcpy() de la STDLIB. C_MAIN.CPP tiene una función que llama al main del

programa que estemos escribiendo y le pasa como parámetros el argc, argv y env (en este caso solo leprograma que estemos escribiendo y le pasa como parámetros el argc, argv y env (en este caso solo le

pasamos ceros para no complicarnos). C_WMAIN.CPP llama a WinMain() la instancia anterior delpasamos ceros para no complicarnos). C_WMAIN.CPP llama a WinMain() la instancia anterior del

programa, la línea de comandos y SW_SHOW. Finalmente C_ALLOC.CPP usa la Heap del proceso paraprograma, la línea de comandos y SW_SHOW. Finalmente C_ALLOC.CPP usa la Heap del proceso para

asignar y liberar memoria.asignar y liberar memoria.

Ahora que tenemos todos los archivos de la CLIB (nuestra libreria para reemplazar la Run Time Library deAhora que tenemos todos los archivos de la CLIB (nuestra libreria para reemplazar la Run Time Library de

VC++) podemos compilarla y linkearla así:VC++) podemos compilarla y linkearla así:

cl /c C_ALLOC.CPP C_MAIN.CPP C_STR.CPP C_WMAIN.CPPcl /c C_ALLOC.CPP C_MAIN.CPP C_STR.CPP C_WMAIN.CPP

lib /out:CLIB.LIB C_ALLOC.OBJ C_MAIN.OBJ C_STR.OBJ C_WMAIN.OBJlib /out:CLIB.LIB C_ALLOC.OBJ C_MAIN.OBJ C_STR.OBJ C_WMAIN.OBJ

Esto nos va a generar nuestra clib.lib.Esto nos va a generar nuestra clib.lib.

Page 9: Codigo Latino 10

Ahora teniendo el comun.cpp podemos hacer:Ahora teniendo el comun.cpp podemos hacer:

LINK COMUN.OBJ /NODEFAULTLIB user32.lib kernel32.lib clib.lib y se va a generar un ejecutable queLINK COMUN.OBJ /NODEFAULTLIB user32.lib kernel32.lib clib.lib y se va a generar un ejecutable que

nos va mostrar un MessageBox con el número 10. Ocupa 2.560 bytes en mi PC. Si prueban a compilar elnos va mostrar un MessageBox con el número 10. Ocupa 2.560 bytes en mi PC. Si prueban a compilar el

mismo programa con la STDLIB por defecto verán que lo mínimo que consigan serán 14.484 bytes.mismo programa con la STDLIB por defecto verán que lo mínimo que consigan serán 14.484 bytes.

En la segunda parte vamos a ver como mejorar nuestra libreria con más rutinas, como por ejemploEn la segunda parte vamos a ver como mejorar nuestra libreria con más rutinas, como por ejemplo

implementar los operadores new y delete, entre otras cosas.implementar los operadores new y delete, entre otras cosas.

Saludos,Saludos,

Mariano.Mariano.

Page 10: Codigo Latino 10

El uso de los Jtextarea al recibir un 'Tab Key'El uso de los Jtextarea al recibir un 'Tab Key'Por shakkaPor shakka http://mbrenes.blogspot.comhttp://mbrenes.blogspot.com

El uso de los El uso de los JTextAreaJTextArea es muy util emplearlos para que el usuario ingrese una cantidad relativamente grande es muy util emplearlos para que el usuario ingrese una cantidad relativamente grande

de información y/o cuando se require darle un tratamiento especial, como por ejemplo: desplegar texto ende información y/o cuando se require darle un tratamiento especial, como por ejemplo: desplegar texto en

varias líneas.varias líneas.

Sin embargo, debido a estas caracteristicas reacciona distinto ante el evento de captura de pulsación deSin embargo, debido a estas caracteristicas reacciona distinto ante el evento de captura de pulsación de

teclas(caso concreto: la tecla de tabulación), la cual en ciertos escenarios es necesario cambiar esteteclas(caso concreto: la tecla de tabulación), la cual en ciertos escenarios es necesario cambiar este

comportamiento.comportamiento.

Esto se puede hacer de varias maneras, una es llamando al metodo Esto se puede hacer de varias maneras, una es llamando al metodo setFocusTraversalKeys()setFocusTraversalKeys() al cual se le al cual se le

pasan 2 parámetros : un entero, para el cual utilizamos unas constantes que indican el sentido en que sepasan 2 parámetros : un entero, para el cual utilizamos unas constantes que indican el sentido en que se

transfiere el foco, y en el segundo parámetro indicamos el conjunto de teclas.transfiere el foco, y en el segundo parámetro indicamos el conjunto de teclas.

Set<AWTKeyStroke> setKeys = Set<AWTKeyStroke> setKeys = new new HashSet<AWTKeyStroke>();HashSet<AWTKeyStroke>();

/** /**

* Reciba o pase el foco al dispararse el evento, cual sea pulsada la tecla de tabulacion * Reciba o pase el foco al dispararse el evento, cual sea pulsada la tecla de tabulacion

*/*/

setKeys.setKeys.addadd(AWTKeyStroke.(AWTKeyStroke.getAWTKeyStrokegetAWTKeyStroke(KeyEvent.(KeyEvent.VK_TABVK_TAB, 0));, 0));

Page 11: Codigo Latino 10

/**/**

* Para esta instancia: * Para esta instancia:

* le indico que reciba el foco (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS), * le indico que reciba el foco (KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS),

* y que lo devuelva (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS) * y que lo devuelva (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)

* solo para el conjunto de teclas que estableci en setKeys. * solo para el conjunto de teclas que estableci en setKeys.

*/*/

txtArea1.txtArea1.setFocusTraversalKeyssetFocusTraversalKeys(KeyboardFocusManager.(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYSFORWARD_TRAVERSAL_KEYS, setKeys);, setKeys);

txtArea1.txtArea1.setFocusTraversalKeyssetFocusTraversalKeys(KeyboardFocusManager.(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYSBACKWARD_TRAVERSAL_KEYS, setKeys);, setKeys);

Si usamos NetBeans para diseñar la interfaz de usuario, veremos que desde el editor del IDE no podremosSi usamos NetBeans para diseñar la interfaz de usuario, veremos que desde el editor del IDE no podremos

editar el código correspondiente a la inicialización de la instancia, pero evidentemente si lo podemos hacereditar el código correspondiente a la inicialización de la instancia, pero evidentemente si lo podemos hacer

cerrando NB y editando el código fuente o bien, sin salir del NB, damos cerrando NB y editando el código fuente o bien, sin salir del NB, damos clickclick derecho sobre el control y derecho sobre el control y

vamos a vamos a Customize CodeCustomize Code..

Más información: Más información: http://www.chuidiang.comhttp://www.chuidiang.com

Page 12: Codigo Latino 10

Renombrar archivos en RubyRenombrar archivos en Ruby

Por BlagPor Blag http://atejada.blogspot.comhttp://atejada.blogspot.comLo bueno de ser programador es que cuando necesitas algo, no tienes que buscarlo, comprarlo o descargarlo...Lo bueno de ser programador es que cuando necesitas algo, no tienes que buscarlo, comprarlo o descargarlo...

Puedes programarlo -;)Puedes programarlo -;)

Eso justamente fue lo que hice -:P Quería tener un renombrador de archivos en batch... Por lo tanto decidí queEso justamente fue lo que hice -:P Quería tener un renombrador de archivos en batch... Por lo tanto decidí que

lo mejor era hacerlo yo mismo...Tenía por supuesto muchos lenguajes de programación entre los cualeslo mejor era hacerlo yo mismo...Tenía por supuesto muchos lenguajes de programación entre los cuales

escoger...Pero últimamente mi amor por Ruby ha regresado, así que esto es lo que hice -:)escoger...Pero últimamente mi amor por Ruby ha regresado, así que esto es lo que hice -:)$Folder $Folder = = ArrayArray..newnew

$Files $Files = = ArrayArray..newnew

$counter$counter = 0 = 0

printprint(("Ingrese la carpeta: ""Ingrese la carpeta: "))

$Dir_Text $Dir_Text = = getsgets..chopchop!!

printprint(("Ingrese la extension: ""Ingrese la extension: "))

$Ext_Text $Ext_Text = = getsgets..chopchop!!

$Dir_Text$Dir_Text..subsub!(!("\\""\\",,"\\ \\""\\ \\").).deletedelete!(!(" "" "))

DirDir..foreachforeach(($Dir_Text$Dir_Text) {|x| ) {|x| $Folder$Folder..pushpush(x)}(x)}

for for file file inin $Folder$Folder

$long$long = file. = file.lengthlength - 3 - 3

ifif(file[(file[$long$long,3] == ,3] == $Ext_Text$Ext_Text))

$Full_File$Full_File = = $Dir_Text $Dir_Text + + "\\\\""\\\\" + file + file

$Files$Files..pushpush(($Full_File$Full_File))

end end

endend

forfor file file inin $Files$Files

$counter$counter += 1 += 1

$New_File $New_File = = $Dir_Text $Dir_Text + + "\\\\" "\\\\" + + $counter$counter..to_sto_s + "." + + "." + $Ext_Text$Ext_Text

FileFile..renamerename(file,(file,$New_File$New_File))

endend

puts puts "#{$counter} archivos convertidos""#{$counter} archivos convertidos"

Lo que hace, es simplemente leer una carpeta, tomar los archivos con la extensión que queremos yLo que hace, es simplemente leer una carpeta, tomar los archivos con la extensión que queremos y

renombrarlos numéricamente.renombrarlos numéricamente.

El Array.sort no funciona bien con valores alfanuméricos... El Array.sort no funciona bien con valores alfanuméricos...

Esto significa que la primera versión de mi programa no funciona -:( Es decir, funciona la primera vez, peroEsto significa que la primera versión de mi programa no funciona -:( Es decir, funciona la primera vez, pero

la segunda por el error en el Array.sort comienza a eliminar archivos... Algo que nadie quiere que pase... Ala segunda por el error en el Array.sort comienza a eliminar archivos... Algo que nadie quiere que pase... A

mi me pasó -:( mi me pasó -:(

Page 13: Codigo Latino 10

En fín...Luego de algunos cambios y varias pruebas, tengo la versión final del programa que ahora si En fín...Luego de algunos cambios y varias pruebas, tengo la versión final del programa que ahora si

funciona sin ningún problema -;) funciona sin ningún problema -;)

$Folder $Folder = = ArrayArray..newnew

$Files $Files = = ArrayArray..newnew

$counter$counter = 0 = 0

$count$count = 0 = 0

printprint(("Ingrese la carpeta: ""Ingrese la carpeta: "))

$Dir_Text $Dir_Text = = getsgets..chopchop!!

printprint(("Ingrese la extension: ""Ingrese la extension: "))

$Ext_Text $Ext_Text = = getsgets..chopchop!!

$Dir_Text$Dir_Text..subsub!(!("\\""\\",,"\\ \\""\\ \\").).deletedelete!(!(" "" "))

DirDir..foreachforeach(($Dir_Text$Dir_Text) {|x| ) {|x| $Folder$Folder..pushpush(x)}(x)}

for for file file inin $Folder$Folder

$long$long = file. = file.lengthlength - 3 - 3

ifif(file[(file[$long$long,3] == ,3] == $Ext_Text$Ext_Text))

$Full_File$Full_File = = $Dir_Text $Dir_Text + + "\\\\""\\\\" + file + file

$Files$Files..pushpush(($Full_File$Full_File))

end end

endend

for for file file inin $Files$Files

$count $count = 0 = 0

for for do_fiile do_fiile inin $Files$Files

$len_count$len_count = = $Files$Files[[$count$count].].lengthlength

$len_counter$len_counter = = $Files$Files[[$counter$counter].].lengthlength

$last_count$last_count = = $Files$Files[[$count$count].].rindexrindex(("\\""\\" ) + 1 ) + 1

$len_count$len_count -= -= $last_count$last_count

$len_counter$len_counter -= -= $last_count$last_count

ifif $Files$Files[[$count$count].].sliceslice(($last_count$last_count, , $len_count$len_count).).to_ito_i > > $Files$Files[[$counter$counter ]. ].sliceslice(($last_count$last_count, , $len_counter$len_counter).).to_ito_i

$aux$aux = = $Files$Files[[$count$count] ]

$Files$Files[[$count$count] = ] = $Files$Files[[$counter$counter ] ]

$Files$Files[[$counter$counter] = ] = $aux$aux

endend

$count$count += 1 += 1

endend

$counter$counter += 1 += 1

endend

Page 14: Codigo Latino 10

$counter$counter = 0 = 0

forfor file file inin $Files$Files

$counter$counter += 1 += 1

$New_File $New_File = = $Dir_Text $Dir_Text + + "\\\\" "\\\\" + + $counter$counter..to_sto_s + "." + + "." + $Ext_Text$Ext_Text

FileFile..renamerename(file,(file,$New_File$New_File))

endend

puts puts "#{$counter} archivos convertidos""#{$counter} archivos convertidos"

Ruby es un lenguaje excelente, pero como siempre tiene sus pequeños detalles, que debemos investigar yRuby es un lenguaje excelente, pero como siempre tiene sus pequeños detalles, que debemos investigar y

probar -:) probar -:)

Saludos, Saludos,

Blag.Blag.

Page 15: Codigo Latino 10

Fundamentos de los Ataques por Desbordamiento de BufferFundamentos de los Ataques por Desbordamiento de BufferPor m0skit0Por m0skit0 http://fr33kk0mpu73r.blogspot.comhttp://fr33kk0mpu73r.blogspot.com

Las intrucciones CALL y RETLas intrucciones CALL y RETLa instrucción CALL sirve para hacer La instrucción CALL sirve para hacer llamadas a funciones llamadas a funciones en ensamblador. Veamos el siguiente código deen ensamblador. Veamos el siguiente código de

ejemplo:ejemplo:

0x0804836C 0x0804836C -> -> PUSH PUSH EBPEBP

0x0804836D0x0804836D -> -> MOVMOV ESP,EBP ESP,EBP

0x0804836F 0x0804836F -> -> CALL CALL 0x0804829C0x0804829C

0x08048374 0x08048374 -> -> ADDADD 0x100x10,ESP,ESP

En la dirección 0x0804836F tenemos una llamada a una función, que comienza en 0x0804829C, mediante laEn la dirección 0x0804836F tenemos una llamada a una función, que comienza en 0x0804829C, mediante la

instrucción CALL. Lo primero que va a hacer CALL es meter en la pila la dirección de la siguienteinstrucción CALL. Lo primero que va a hacer CALL es meter en la pila la dirección de la siguiente

instrucción, o instrucción, o dirección de retornodirección de retorno. Suponiendo que ESP = 0x09000000 primero le restamos 4,. Suponiendo que ESP = 0x09000000 primero le restamos 4,

0x08FFFFFC, y metemos en la pila los 4 bytes de la dirección donde se encuentra ADD 0x10,ESP. La pila0x08FFFFFC, y metemos en la pila los 4 bytes de la dirección donde se encuentra ADD 0x10,ESP. La pila

quedaría tal que así:quedaría tal que así:

0x090000000x09000000 XX <-- El byte más bajo de EBP ( XX <-- El byte más bajo de EBP (PUSH PUSH EBP)EBP)

0x08FFFFFF0x08FFFFFF 08 08

0x08FFFFFE 0x08FFFFFE 0404

0x08FFFFFD 0x08FFFFFD 8383

0x08FFFFFC 0x08FFFFFC 7474

0x08FFFFFB 0x08FFFFFB ????

Acto seguido, CALL pone en el registro EIP (Extended Instruction Pointer), que es el encargado de apuntar aActo seguido, CALL pone en el registro EIP (Extended Instruction Pointer), que es el encargado de apuntar a

la siguiente instrucción a ejecutar, la dirección de la función, es decir, 0x0804829C. Con esto ya sela siguiente instrucción a ejecutar, la dirección de la función, es decir, 0x0804829C. Con esto ya se

comienzan a ejecutar las instrucciones de la función. Supongamos ahora que la función consta del siguientecomienzan a ejecutar las instrucciones de la función. Supongamos ahora que la función consta del siguiente

código:código:

0x0804829C 0x0804829C -> -> MOV MOV EAX,EBXEAX,EBX

0x0804829E 0x0804829E -> -> RETRET

La instrucción RET (RETurn) realiza la operación contraria a CALL, es decir, devuelve el flujo del programaLa instrucción RET (RETurn) realiza la operación contraria a CALL, es decir, devuelve el flujo del programa

donde estaba antes de la llamada a la función. Primero saca de la pila 4 bytes, los pone en EIP y luego suma 4donde estaba antes de la llamada a la función. Primero saca de la pila 4 bytes, los pone en EIP y luego suma 4

a ESP. Así que la siguiente instrucción en ejecutarse después de RET es aquélla cuya dirección se encuentrea ESP. Así que la siguiente instrucción en ejecutarse después de RET es aquélla cuya dirección se encuentre

en la cima de la pila antes de ejecutarse RET. En nuestro caso, RET extrae de la pila (ESP = 0x08FFFFFC) elen la cima de la pila antes de ejecutarse RET. En nuestro caso, RET extrae de la pila (ESP = 0x08FFFFFC) el

valor 0x08048374, lo pone en EIP y suma 4 a ESP. Así que la siguiente instrucción en ser ejecutada despuésvalor 0x08048374, lo pone en EIP y suma 4 a ESP. Así que la siguiente instrucción en ser ejecutada después

de RET (dirección 0x0804829E) es ADD 0x10,ESP (dirección 0x08048374).de RET (dirección 0x0804829E) es ADD 0x10,ESP (dirección 0x08048374).

Page 16: Codigo Latino 10

¿Qué pasaría entonces si ejecutásemos el siguiente código?¿Qué pasaría entonces si ejecutásemos el siguiente código?

0x08000000 0x08000000 -> -> PUSH PUSH 0x080000000x08000000

0x08000005 0x08000005 -> -> RETRET

Pues que entraríamos en un bucle infinito. ¿Por qué? Supongamos que antes de ejecutar nada,Pues que entraríamos en un bucle infinito. ¿Por qué? Supongamos que antes de ejecutar nada,

ESP=0x09000000 y EIP = 0x08000000. Al ejecutar la instrucción apuntada por EIP, PUSH 0x08000000,ESP=0x09000000 y EIP = 0x08000000. Al ejecutar la instrucción apuntada por EIP, PUSH 0x08000000,

metemos en la pila el valor 0x08000000. Después, al ejecutar RET, esta instrucción saca el valor que haya enmetemos en la pila el valor 0x08000000. Después, al ejecutar RET, esta instrucción saca el valor que haya en

la pila (0x08000000) y lo copia a EIP. Así la siguiente instrucción que pasaría a ejecutarse sería la ubicada enla pila (0x08000000) y lo copia a EIP. Así la siguiente instrucción que pasaría a ejecutarse sería la ubicada en

la dirección 0x08000000, es decir, PUSH 0x08000000, y de vuelta al principio.la dirección 0x08000000, es decir, PUSH 0x08000000, y de vuelta al principio.

¿Qué sonsacamos de esto? Pues que podemos hacer que el flujo de un programa cambie al modificar la¿Qué sonsacamos de esto? Pues que podemos hacer que el flujo de un programa cambie al modificar la

dirección de retorno almacenada en la pila. Éste es uno de los fundamentos de los ataques pordirección de retorno almacenada en la pila. Éste es uno de los fundamentos de los ataques por

desbordamiento de buffer.desbordamiento de buffer.

El paso de parámetros por pilaEl paso de parámetros por pilaGeneralmente, al llamar a funciones también queremos pasarles unos ciertos valores para que trabajen conGeneralmente, al llamar a funciones también queremos pasarles unos ciertos valores para que trabajen con

ellos, lo que llamamos ellos, lo que llamamos parámetrosparámetros. El convenio más utilizado es el . El convenio más utilizado es el paso de parámetros por pilapaso de parámetros por pila. Los. Los

parámetros en la pila se pasan en orden inverso a como los recoge la función (¡recordemos el funcionamientoparámetros en la pila se pasan en orden inverso a como los recoge la función (¡recordemos el funcionamiento

de la pila!).de la pila!).

Supongamos por ejemplo que tenemos una función que realiza alguna operación con dos números enteros,Supongamos por ejemplo que tenemos una función que realiza alguna operación con dos números enteros,

cuya entrada se encuentra en la dirección 0x07000000. Para pasarle por pila los números 10 (A encuya entrada se encuentra en la dirección 0x07000000. Para pasarle por pila los números 10 (A en

hexadecimal) y 20 (14 en hexadecimal) como primer y segundo parámetro respectivamente, necesitaríamos elhexadecimal) y 20 (14 en hexadecimal) como primer y segundo parámetro respectivamente, necesitaríamos el

siguiente código:siguiente código:

0x08000000 0x08000000 -> -> PUSH PUSH 20 (Segundo parámetro)20 (Segundo parámetro)

0x08000005 0x08000005 -> -> PUSH PUSH 10 (Primer parámetro)10 (Primer parámetro)

0x0800000A0x0800000A -> -> CALL CALL 0x070000000x07000000

0x0800000F 0x0800000F -> -> MOVMOV EAX, EBX EAX, EBX

Después de la llamada CALL, la pila quedaría como sigue (si consideramos inicialmente ESP=0x09000000): Después de la llamada CALL, la pila quedaría como sigue (si consideramos inicialmente ESP=0x09000000):

0x09000000 0x09000000 -> ??-> ??

0x08FFFFFF 0x08FFFFFF -> 00-> 00

0x08FFFFFE 0x08FFFFFE -> 00-> 00

0x08FFFFFD 0x08FFFFFD -> 00-> 00

0x08FFFFFC 0x08FFFFFC -> 14 <-- Segundo parámetro (PUSH 20)-> 14 <-- Segundo parámetro (PUSH 20)

0x08FFFFFB 0x08FFFFFB -> 00-> 00

0x08FFFFFA 0x08FFFFFA -> 00-> 00

Page 17: Codigo Latino 10

0x08FFFFF9 0x08FFFFF9 -> 00-> 00

0x08FFFFF8 0x08FFFFF8 -> 0A <-- Primer parámetro (PUSH 10)-> 0A <-- Primer parámetro (PUSH 10)

0x08FFFFF7 0x08FFFFF7 -> 08-> 08

0x08FFFFF6 0x08FFFFF6 -> 00-> 00

0x08FFFFF5 0x08FFFFF5 -> 00-> 00

0x08FFFFF4 0x08FFFFF4 -> 0F <-- Dirección de retorno de CALL-> 0F <-- Dirección de retorno de CALL

con ESP = 0x08FFFFF4 y EIP = 0x07000000. La función entrante en 0x07000000 se encuentra pues quecon ESP = 0x08FFFFF4 y EIP = 0x07000000. La función entrante en 0x07000000 se encuentra pues que

tiene el primer parámetro en ESP+4 y el segundo en ESP+8 (y sucesivamente de 4 en 4 si son variostiene el primer parámetro en ESP+4 y el segundo en ESP+8 (y sucesivamente de 4 en 4 si son varios

parámetros). Así pues el códigoparámetros). Así pues el código

0x07000000 0x07000000 -> -> ADDADD 0x40x4, ESP, ESP

0x07000003 0x07000003 -> -> POP POP EAXEAX

0x07000004 0x07000004 -> -> POP POP EBXEBX

pone el primer parámetro (0x0000000A) en EAX y el segundo (0x00000014) en EBX, quedandopone el primer parámetro (0x0000000A) en EAX y el segundo (0x00000014) en EBX, quedando

ESP=0x09000000. Por lo tanto, antes de poder ejecutar la instrucción RET para retornar de la función,ESP=0x09000000. Por lo tanto, antes de poder ejecutar la instrucción RET para retornar de la función,

tendremos que devolver ESP a su valor original para que pueda extraer la dirección de retorno adecuada:tendremos que devolver ESP a su valor original para que pueda extraer la dirección de retorno adecuada:

SUB SUB 0xC0xC, ESP, ESP

RETRET

Restamos 12 (C en hexadecimal), 2 x 4 bytes por cada parámetro + 4 bytes de la dirección de retorno, 12Restamos 12 (C en hexadecimal), 2 x 4 bytes por cada parámetro + 4 bytes de la dirección de retorno, 12

bytes en total, a ESP = 0x09000000 para convertirlo en 0x08FFFFF4, donde se encuentra la dirección debytes en total, a ESP = 0x09000000 para convertirlo en 0x08FFFFF4, donde se encuentra la dirección de

retorno correcta (0x0800000F). Acto seguido RET saca de la pila 0x0800000F y pone este valor en EIP, conretorno correcta (0x0800000F). Acto seguido RET saca de la pila 0x0800000F y pone este valor en EIP, con

lo que la ejecución continúa en dicha dirección con la instrucción MOV EAX,EBX, con ESP = 0x08FFFFF8.lo que la ejecución continúa en dicha dirección con la instrucción MOV EAX,EBX, con ESP = 0x08FFFFF8.

Page 18: Codigo Latino 10

FrankGK es un recien iniciado en este mundo de la programación, se le ve el interes pues lo he vistoFrankGK es un recien iniciado en este mundo de la programación, se le ve el interes pues lo he visto

preguntado por JAVA, Visual Basic, C e incluso hasta ASM; se ha entrenado mucho en BATCH, inclusopreguntado por JAVA, Visual Basic, C e incluso hasta ASM; se ha entrenado mucho en BATCH, incluso

tenemos un manual de él aca en Código Latino y se está volviendo un experto, ha demostrado sus habilidadestenemos un manual de él aca en Código Latino y se está volviendo un experto, ha demostrado sus habilidades

en el foro de en el foro de TrucosWindowsTrucosWindows este pedazo de entrevista nos ha regalado este Newbie de la programación. este pedazo de entrevista nos ha regalado este Newbie de la programación.

1) ¿De dónde eres?1) ¿De dónde eres?

España, MadridEspaña, Madrid

2) ¿Hace cuánto que comenzaste a programar?2) ¿Hace cuánto que comenzaste a programar?

Este año, en el mes de JunioEste año, en el mes de Junio

3) ¿Cuáles son tus lenguajes de programación3) ¿Cuáles son tus lenguajes de programación

favoritos?favoritos?

VB, C & BATCH (no sé si cuenta BATCH)VB, C & BATCH (no sé si cuenta BATCH)

4) ¿Cuáles son tus programas favoritos de Diseño?4) ¿Cuáles son tus programas favoritos de Diseño?

¿Diseño grafico?, no manejo mucho, el photoshop y el¿Diseño grafico?, no manejo mucho, el photoshop y el

paint ocasionalmente xDpaint ocasionalmente xD

5) ¿Qué te inspiró a ser programador?5) ¿Qué te inspiró a ser programador?

Pensar que hay detras de las ventanas, yPensar que hay detras de las ventanas, y

posteriormente TrucosWindows.netposteriormente TrucosWindows.net

6) ¿Cuéntanos un poco acerca de tu compañía?6) ¿Cuéntanos un poco acerca de tu compañía?

Sorry no sé q te refieres, no tengo ninguna empresa :PSorry no sé q te refieres, no tengo ninguna empresa :P

7) ¿Qué opinas de la escena de programadores en7) ¿Qué opinas de la escena de programadores en

Latinoamérica?Latinoamérica?

Por lo que se allí hay muy buenos programadores, creoPor lo que se allí hay muy buenos programadores, creo

recordar que hace 1 mes o 2 como mucho hackearon larecordar que hace 1 mes o 2 como mucho hackearon la

página del congreso y no sé que pusieron, de todaspágina del congreso y no sé que pusieron, de todas

formas opino que más ayudas al sector de laformas opino que más ayudas al sector de la

informatica (por lo menos aquí en España lo estaninformatica (por lo menos aquí en España lo estan

diciendo a voces).diciendo a voces).

8) ¿Cuáles son tus nuevos proyectos?8) ¿Cuáles son tus nuevos proyectos?

He de empezar poco a poco y estoy dandome caña conHe de empezar poco a poco y estoy dandome caña con

C, me gusta el tema de los algóritmos y en C estoyC, me gusta el tema de los algóritmos y en C estoy

empezando a hacerlos. En VB me queda tanto o másempezando a hacerlos. En VB me queda tanto o más

por aprender como en C, pero sé hacer cosillaspor aprender como en C, pero sé hacer cosillas

9) ¿Que te gustaría ver en los próximos años en el9) ¿Que te gustaría ver en los próximos años en el

mundo de la programación?mundo de la programación?

Que comercializen ordenadores más baratos, mejores,Que comercializen ordenadores más baratos, mejores,

y respecto a la informática quiero ver como avanzay respecto a la informática quiero ver como avanza

todo lo relacionado con el tema cuántico, ya q metodo lo relacionado con el tema cuántico, ya q me

llama bastante la atención..llama bastante la atención..

10) ¿Cuál es tu mensaje final para la comunidad?10) ¿Cuál es tu mensaje final para la comunidad?

Sigan así, hay muy buena gente (y bastanteSigan así, hay muy buena gente (y bastante

inteligente), ojala en un tiempo podamos hacerinteligente), ojala en un tiempo podamos hacer

concursos (me refiero a programación), y llegar aconcursos (me refiero a programación), y llegar a

crear buenas ideas, luego plasmarlas en algunoscrear buenas ideas, luego plasmarlas en algunos

proyectos.proyectos.

un saludoun saludo

Page 19: Codigo Latino 10

PowerShellPowerShell

Por JuanKPor JuanK http://juank.black-byte.comhttp://juank.black-byte.com

Parte I - El futuro del scriptingParte I - El futuro del scriptingComo logro automatizar mis labores administrativas? Quiero ser más eficiente? esa es la pregunta que aComo logro automatizar mis labores administrativas? Quiero ser más eficiente? esa es la pregunta que a

diario tienen muchos administradores de red y personal de IT en general, pueden existir muchas opciones:diario tienen muchos administradores de red y personal de IT en general, pueden existir muchas opciones:

•• Desarrollos personalizados Desarrollos personalizados

•• Aplicaciones de terceros Aplicaciones de terceros

•• Automatización por medio de scripts Automatización por medio de scripts

Como es de suponerce este tipo de demandas suelen ser � imposibles� sobre todo dentro del tiempo requeridoComo es de suponerce este tipo de demandas suelen ser � imposibles� sobre todo dentro del tiempo requerido

o con un presupuesto ajustado. Entonces cual es la respuesta a esa pregunta?: PowerShell.o con un presupuesto ajustado. Entonces cual es la respuesta a esa pregunta?: PowerShell.

Antes de entrar en materia revisemos unos conceptos importante.Antes de entrar en materia revisemos unos conceptos importante.

Qué es un script?Qué es un script?

Un script es un conjunto de instrucciones utilizadas para automatizar un conjunto de tareas.Un script es un conjunto de instrucciones utilizadas para automatizar un conjunto de tareas.

Funciona como el guión de una película, donde se describen paso a paso las diferentes acciones que un actorFunciona como el guión de una película, donde se describen paso a paso las diferentes acciones que un actor

debe efectuar. En nuestro caso el actor el sistema operativo y el guionista es quien hace el script. debe efectuar. En nuestro caso el actor el sistema operativo y el guionista es quien hace el script.

Qué es un shell?Qué es un shell?

Un shell es una pieza de software que provee una interfaz de uso, desde el punto de vista de la computaciónUn shell es una pieza de software que provee una interfaz de uso, desde el punto de vista de la computación

se puede definir en varios niveles.se puede definir en varios niveles.

Un componente que provee acceso al kernel (núcleo) del sistema operativo, en el caso de los desarrolladoresUn componente que provee acceso al kernel (núcleo) del sistema operativo, en el caso de los desarrolladores

esa interfaz puede ser Shell32.dll , User32.dll y otras.esa interfaz puede ser Shell32.dll , User32.dll y otras.

Desde el punto de vista de los usuarios el Shell pueden ser el sistema de ventanas de Windows o una consolaDesde el punto de vista de los usuarios el Shell pueden ser el sistema de ventanas de Windows o una consola

de símbolo de Sistema.de símbolo de Sistema.

PowerShell, es un shell que brinda una interfaz robusta para que el usuario IT realice tareas de administraciónPowerShell, es un shell que brinda una interfaz robusta para que el usuario IT realice tareas de administración

dentro del sistema.dentro del sistema.

Page 20: Codigo Latino 10

Evolución de los � Shell�Evolución de los � Shell�

Sistemas operativos de la familia UNIX desde su comienzo han tenido un shell de consola de comandosSistemas operativos de la familia UNIX desde su comienzo han tenido un shell de consola de comandos

robusto, en contraste robusto, en contraste WindowsWindows siempre se caracterizo por tener falencia en ese sentido debido a que, desde siempre se caracterizo por tener falencia en ese sentido debido a que, desde

luego, no era algo importante en sus primeras versiones pues la prioridad siempre era brindar una interfaz deluego, no era algo importante en sus primeras versiones pues la prioridad siempre era brindar una interfaz de

usuario(shell) amistosa, mientras que en UNIX esa casí siempre (hasta hace relativamente poco)ha sido unausuario(shell) amistosa, mientras que en UNIX esa casí siempre (hasta hace relativamente poco)ha sido una

debilidad. debilidad.

Con el paso del tiempo los sistemas operativos de la familia de windows fueron fortaleciendose y suCon el paso del tiempo los sistemas operativos de la familia de windows fueron fortaleciendose y su

incursión en la rama empresarial y de IT fue cada vez más notoria lo cual fue volviendo las labores deincursión en la rama empresarial y de IT fue cada vez más notoria lo cual fue volviendo las labores de

administración un tema cada vez más complejo y extenso. Para cubrir esas necesidades Windows cada vezadministración un tema cada vez más complejo y extenso. Para cubrir esas necesidades Windows cada vez

incorporo más herramientas de línea de comandos, no solo fortaleciendo su clásica interfaz del símbolo delincorporo más herramientas de línea de comandos, no solo fortaleciendo su clásica interfaz del símbolo del

sistema (conocida � vulgarmente� como ventana del DOS) sino además incluyendo nuevos shell para ejecutarsistema (conocida � vulgarmente� como ventana del DOS) sino además incluyendo nuevos shell para ejecutar

script, sin embargo algunos de estos shell realmente eran más las vulnerabilidades que abrían en el sistemascript, sin embargo algunos de estos shell realmente eran más las vulnerabilidades que abrían en el sistema

que la utilidad que se les lograba sacar, con el tiempo estos shell se fueron fortaleciendo y surgieron muchosque la utilidad que se les lograba sacar, con el tiempo estos shell se fueron fortaleciendo y surgieron muchos

nuevos principalmente orientados a realizar tareas usando wmi (Windows Management Instrumentation)nuevos principalmente orientados a realizar tareas usando wmi (Windows Management Instrumentation)

combinado con scripts de tipo VBScript y javascript.combinado con scripts de tipo VBScript y javascript.

Si bien el ambiente de script cada vez era más diverso y extendido, hacia falta algo fundamental: Integración,Si bien el ambiente de script cada vez era más diverso y extendido, hacia falta algo fundamental: Integración,

interoperabilidad y flexibilidad.interoperabilidad y flexibilidad.

Así que para cubrir esta nueva necesidad surgió El proyecto Monad el cual más adelante se llamaría:Así que para cubrir esta nueva necesidad surgió El proyecto Monad el cual más adelante se llamaría:

PowerShell 1.0. y hoy día ya estamos ad portas de la versión 2.0.PowerShell 1.0. y hoy día ya estamos ad portas de la versión 2.0.

Page 21: Codigo Latino 10

Parte II - ArquitecturaParte II - ArquitecturaModelo BásicoModelo Básico

Powershell se compone de 4 elementos fundamentales:Powershell se compone de 4 elementos fundamentales:

•• .Net FrameWork .Net FrameWork

•• Sistema operativo (Windows XP / Vista / Server 2003 / Server 2008) Sistema operativo (Windows XP / Vista / Server 2003 / Server 2008)

•• CommandLet� s (Cmdlet� s), Data Providers CommandLet� s (Cmdlet� s), Data Providers

•• PowerShell Host PowerShell Host

Desde el punto de vista de desarrollo El .NEt Framework aporta el soporte para CLR 2.0 y junto con el todosDesde el punto de vista de desarrollo El .NEt Framework aporta el soporte para CLR 2.0 y junto con el todos

los beneficios de el desarrollo sobre esta platáforma.los beneficios de el desarrollo sobre esta platáforma.

El sistema operativo desde luego provee a PowerShell de las API� s necesarias para interactuar con lasEl sistema operativo desde luego provee a PowerShell de las API� s necesarias para interactuar con las

características del sistema como: archivos, registro, dispositivo, usuarios etc.características del sistema como: archivos, registro, dispositivo, usuarios etc.

Los Cmdlet� s, como veremos más adelante, son una parte fundamental de PowerShell que esencialmenteLos Cmdlet� s, como veremos más adelante, son una parte fundamental de PowerShell que esencialmente

brindan una interfaz unificada de programación para hacer uso de las características de scripting a través delbrindan una interfaz unificada de programación para hacer uso de las características de scripting a través del

pipeline processor.pipeline processor.

Finalmente encontramos el PowerShell Host, por defecto es una consola de comandos de texto, pero no esFinalmente encontramos el PowerShell Host, por defecto es una consola de comandos de texto, pero no es

una restricción, en los últimos capítulos que traten el tema de PowerShell veremos como podemos hostearuna restricción, en los últimos capítulos que traten el tema de PowerShell veremos como podemos hostear

tanto la interfaz de entrada de scripts, como la interfaz de resultados en aplicaciones independientes contanto la interfaz de entrada de scripts, como la interfaz de resultados en aplicaciones independientes con

interfaces gráficas Web o de aplicaciones de windows.interfaces gráficas Web o de aplicaciones de windows.

Modelo FuncionalModelo Funcional

Page 22: Codigo Latino 10

El gráfico se debe revisar de abajo hacia arriba, en un primer nivel tenemos al sistema operativo, quien brindaEl gráfico se debe revisar de abajo hacia arriba, en un primer nivel tenemos al sistema operativo, quien brinda

las API� s necesarias para la ejecución e interacción de PowerShell, sobre el sistema operativo tenemos ellas API� s necesarias para la ejecución e interacción de PowerShell, sobre el sistema operativo tenemos el

CLR que en adelante brinda sus servicios a PowerShell, estos servicios son un entorno de ejecución conCLR que en adelante brinda sus servicios a PowerShell, estos servicios son un entorno de ejecución con

administración de memoria, aislamiento de dominios de aplicación, etc.administración de memoria, aislamiento de dominios de aplicación, etc.

Sin embargo para que el CLR sea realmente útil se requiere una seríe de interfaces de adquisición de datos:Sin embargo para que el CLR sea realmente útil se requiere una seríe de interfaces de adquisición de datos:

los PowerShell Providers. Estos Providers se encargan de envíar a los diferentes CmdLets instalados enlos PowerShell Providers. Estos Providers se encargan de envíar a los diferentes CmdLets instalados en

PowerShell la información solicitada, es decir son fuentes de datos que bien pueden devolver un conjunto dePowerShell la información solicitada, es decir son fuentes de datos que bien pueden devolver un conjunto de

llaves de registro, un listado de archivos, registros de un base de datos, los procesos en ejecución etc etc.llaves de registro, un listado de archivos, registros de un base de datos, los procesos en ejecución etc etc.

Una vez los datos son accedidos por los Providers esos envían o reciben información de los CmdLet� s, unUna vez los datos son accedidos por los Providers esos envían o reciben información de los CmdLet� s, un

CmdLet por si solo solo puede realizar un conjunto de tareas limitado, por ejemplo consultar los procesos enCmdLet por si solo solo puede realizar un conjunto de tareas limitado, por ejemplo consultar los procesos en

ejecución, y otro CmdLet puede por ejemplo ordenar un arreglo según un criterio de ordenamiento. Elejecución, y otro CmdLet puede por ejemplo ordenar un arreglo según un criterio de ordenamiento. El

verdadero poder de los CmdLet esta en la capacidad que tienen para hacer que el resultado de uno de ellosverdadero poder de los CmdLet esta en la capacidad que tienen para hacer que el resultado de uno de ellos

sirva como fuente de datos a otro CmdLet y a su vez el resultado de este CmdLet sirva como entrada a otrosirva como fuente de datos a otro CmdLet y a su vez el resultado de este CmdLet sirva como entrada a otro

más& y así puede funcionar de manera ilimitada, dicha interacción entre CmdLet� s se lleva a acabo gracias amás& y así puede funcionar de manera ilimitada, dicha interacción entre CmdLet� s se lleva a acabo gracias a

otra parte fundamental de PowerShell : El Pipeline Processor.otra parte fundamental de PowerShell : El Pipeline Processor.

Page 23: Codigo Latino 10

El PipeLine Processor tiene una función sencilla, pero crítica para que la magia comience a surtir efecto, es elEl PipeLine Processor tiene una función sencilla, pero crítica para que la magia comience a surtir efecto, es el

encargado de hacer que la información fluya entre CmdLet� s, el que recibe los datos de entrada desde el hostencargado de hacer que la información fluya entre CmdLet� s, el que recibe los datos de entrada desde el host

de comandos y el que envía el resultado final al host de salida. El PipeLine Processor es el hilo conductor quede comandos y el que envía el resultado final al host de salida. El PipeLine Processor es el hilo conductor que

hace que muchos componentes logren ser PowerShell .hace que muchos componentes logren ser PowerShell .

En el gráfico podemos observar como en el nivel más superior se encuentran los comandos, cada comando seEn el gráfico podemos observar como en el nivel más superior se encuentran los comandos, cada comando se

separa de otro a través de un separa de otro a través de un || (un pipe) este pipe representa el Pipeline Processor por lo cual podemos (un pipe) este pipe representa el Pipeline Processor por lo cual podemos

visualizar como cada un comando envía su información al pipeline y este redirecciona su salida al comandovisualizar como cada un comando envía su información al pipeline y este redirecciona su salida al comando

siguiente y así sucesivamete hasta que tras el último comando envía el resultado final al host de salida.siguiente y así sucesivamete hasta que tras el último comando envía el resultado final al host de salida.

Page 24: Codigo Latino 10

Parte III � PowerShell para IT'sParte III � PowerShell para IT'sEn las dos anteriores entregas nos hemos dedicado al sustento teórico y al background necesario para saberEn las dos anteriores entregas nos hemos dedicado al sustento teórico y al background necesario para saber

de que estábamos hablando. Ya falta poco para comenzar, pero antes una información importante para seguirde que estábamos hablando. Ya falta poco para comenzar, pero antes una información importante para seguir

adelante.adelante.

Instalar PowerShellInstalar PowerShell

RequerimientosRequerimientos

•• Net Framework 2.0 Net Framework 2.0

•• Windows XP SP2 +, Windows Vista, Windows Server 2003 SP1+, Windows Server 2008 Windows XP SP2 +, Windows Vista, Windows Server 2003 SP1+, Windows Server 2008

Una vez ya tengas esto debes bajarte la versión de PowerShell de tu preferencia:Una vez ya tengas esto debes bajarte la versión de PowerShell de tu preferencia:

Link de descargaLink de descarga

Integración de tecnologías de automatizaciónIntegración de tecnologías de automatización

Este es el primero de dos puntos clave que PowerShell brinda a los IT� s y es que por primera vez despues deEste es el primero de dos puntos clave que PowerShell brinda a los IT� s y es que por primera vez despues de

muchos años existe una tecnología de script capaz de integrar todas las tecnologías de script existentes bajomuchos años existe una tecnología de script capaz de integrar todas las tecnologías de script existentes bajo

Windows en una sola, pero esto solo es la parte de agrupar tecnologías de script, pero que tal poder accederWindows en una sola, pero esto solo es la parte de agrupar tecnologías de script, pero que tal poder acceder

por medio de scripts a toda la infraestructura desde un punto central? bueno el dibujo habla por si solo:por medio de scripts a toda la infraestructura desde un punto central? bueno el dibujo habla por si solo:

PowerShell nos permite interactuar con cada uno de los componentes de nuestra infraestructura de red, ISAPowerShell nos permite interactuar con cada uno de los componentes de nuestra infraestructura de red, ISA

Server, Exchange System Center, Active Directory y muchos más, pero por si fuera poco tenemos (sobre todoServer, Exchange System Center, Active Directory y muchos más, pero por si fuera poco tenemos (sobre todo

para desarrolladores pero le impacta a los IT� s) .NET Framework, es decir tenemos las puertas abiertas apara desarrolladores pero le impacta a los IT� s) .NET Framework, es decir tenemos las puertas abiertas a

Page 25: Codigo Latino 10

hacer lo que queramos, el framework nos lo permite.hacer lo que queramos, el framework nos lo permite.

Beneficios para crear scriptsBeneficios para crear scripts

Tanto para developers como para IT� s estas características son muy importantes, sere breve:Tanto para developers como para IT� s estas características son muy importantes, sere breve:

Bueno ya fue suficiente. Recuerden que esto no es un curso de PowerShell, es un overview donde seBueno ya fue suficiente. Recuerden que esto no es un curso de PowerShell, es un overview donde se

mostraran algunas cosas interesantes de manera general.mostraran algunas cosas interesantes de manera general.

Let� s begin!!!Let� s begin!!!

Primeros scriptsPrimeros scripts

Nivel de seguridadNivel de seguridad

PowerShell posee niveles de seguridad en cuanto a la ejecución de script así que nuestro primer scriptPowerShell posee niveles de seguridad en cuanto a la ejecución de script así que nuestro primer script

establecera un nivel de seguridad adecuado para los demos. Los posibles valores son: establecera un nivel de seguridad adecuado para los demos. Los posibles valores son:

•• Unrestricted : todo script es permitido Unrestricted : todo script es permitido

•• RemoteSigned : todo script local es permitido, pero si son remotos deben estar firmados digitalmente RemoteSigned : todo script local es permitido, pero si son remotos deben estar firmados digitalmente

•• AllSigned : todo script debe estar firmado digitalmente AllSigned : todo script debe estar firmado digitalmente

Se debe ejecutar este comando como administrador o en Windows Vista inicializando la aplicaion conSe debe ejecutar este comando como administrador o en Windows Vista inicializando la aplicaion con

elevación de privilegios.elevación de privilegios.

Set-ExecutionPolicy RemoteSignedSet-ExecutionPolicy RemoteSigned

1- Nombre de los procesos que tienen ventana con nombre no vacío1- Nombre de los procesos que tienen ventana con nombre no vacío

get-processget-process | | where-objectwhere-object{$_.MainWindowTitle {$_.MainWindowTitle -ne-ne ""} ""}

Page 26: Codigo Latino 10

Aquí podemos observar el pipe � |� que redirecciona la salida de get-process a where-object, dentro de whereAquí podemos observar el pipe � |� que redirecciona la salida de get-process a where-object, dentro de where

object ({}) utilizamos object ({}) utilizamos $_$_ para representar a cada uno de los objetos que devuelve el comando anterior (en para representar a cada uno de los objetos que devuelve el comando anterior (en

este caso get-process) lo cual quiere decir que verificamos los objetos donde el atributo MainWindowTitle noeste caso get-process) lo cual quiere decir que verificamos los objetos donde el atributo MainWindowTitle no

sea igual (sea igual (-ne =n-ne =not ot eequal) a vacío.qual) a vacío.

La salida arrojara algo parecido a esto:La salida arrojara algo parecido a esto:

HandlesHandles NMP(K)NMP(K) PM(K)PM(K) WX(K)WX(K) VM(M)VM(M) CPU(s)CPU(s) IdId ProcessNameProcessName

448448 3737 7090870908 8592085920 287287 832,44832,44 59645964 DreamweaverDreamweaver

302302 2626 6415264152 7359273592 181181 36,0736,07 58085808 FirefoxFirefox

642642 6262 112576112576 128432128432 415415 28,8828,88 56165616 FireworksFireworks

638638 4040 6578065780 6689266892 239239 25,1825,18 57205720 iexploriexplor

796796 7474 4196041960 2308023080 234234 40,3940,39 41964196 msnmsgrmsnmsgr

783783 8181 5994459944 2508425084 353353 31,2631,26 28802880 POWERPNTPOWERPNT

283283 1414 5683656836 4789647896 562562 0,670,67 12561256 powershellpowershell

2- Procesos que comienzan por letras y tienen números, este es aparentemente más complejo, pero es2- Procesos que comienzan por letras y tienen números, este es aparentemente más complejo, pero es

realmente básico la parte compleja son las expresiones regulares ("^[a-z]+[^0-9]+$") pero basicámente esrealmente básico la parte compleja son las expresiones regulares ("^[a-z]+[^0-9]+$") pero basicámente es

solo un patrón de busqueda.solo un patrón de busqueda.

get-processget-process | | where-objectwhere-object{$_.Name -math {$_.Name -math "^[a-z]+[-9]+$""^[a-z]+[-9]+$"}}

La salidaLa salida

HandlesHandles NMP(K)NMP(K) PM(K)PM(K) WX(K)WX(K) VM(M)VM(M) CPU(s)CPU(s) IdId ProcessNameProcessName

6161 55 19881988 45324532 5252 0,020,02 21642164 MSCamS64MSCamS64

4242 66 39843984 61406140 7979 0,050,05 41524152 rundll32rundll32

9393 88 52005200 80888088 8383 0,050,05 44324432 rundll32rundll32

7575 55 21842184 49844984 5454 0,090,09 39643964 splwow64splwow64

Prueben esta variante, es muy parecida pero hace lo contrario, trae procesos que comiencen por letras y quePrueben esta variante, es muy parecida pero hace lo contrario, trae procesos que comiencen por letras y que

no tengan números.no tengan números.

get-processget-process | | where-objectwhere-object{$_.Name -math {$_.Name -math "^[a-z]+[^0-9]+$""^[a-z]+[^0-9]+$"}}

Page 27: Codigo Latino 10

3- Generar la salida filtrada y direccionarla luego en un archivo html y luego adicionarle un estilo. Vamos a3- Generar la salida filtrada y direccionarla luego en un archivo html y luego adicionarle un estilo. Vamos a

ponerle más detallitos, tal ves se les complique para algunos IT� s pero para otros& . será genial, debemosponerle más detallitos, tal ves se les complique para algunos IT� s pero para otros& . será genial, debemos

crear un archivo de texto con este contenido:crear un archivo de texto con este contenido:<style><style>

. .fila_parfila_par

{ { background-colorbackground-color::#FFFFCC#FFFFCC;};}

. .fila_imparfila_impar { {background-colorbackground-color::#CCFFFF#CCFFFF;};}

</style></style>

<script type=<script type="text/javascript""text/javascript">>

<!--<!--

functionfunction AplicarCebra () AplicarCebra ()

{ {

tables = document. tables = document.getElementsByTagNamegetElementsByTagName(("table""table"););

for for ( i = 0; i < tables.( i = 0; i < tables.lengthlength; i++); i++)

{ {

ColoreaFilas(tables[i]); ColoreaFilas(tables[i]);

} }

} }

function function ColoreaFilas(tabla)ColoreaFilas(tabla)

{ {

filasTabla = tabla. filasTabla = tabla.rowsrows;;

forfor(j=0; j < filasTabla.(j=0; j < filasTabla.lengthlength; j++); j++)

{ {

ifif(j%2==0)(j%2==0)

{ {

filasTabla[j]. filasTabla[j].classNameclassName=="fila_par""fila_par";;

} }elseelse

{ {

filasTabla[j]. filasTabla[j].classNameclassName=="fila_impar""fila_impar";;

} }

} }

} }

// -->// -->

</script></script>

<<bodybody onloadonload=="AplicarCebra();""AplicarCebra();"/>/>

Guardemos esto en un archivo de texto llamado EstiloYScript.txt, básicamente hemos creado una pequeñaGuardemos esto en un archivo de texto llamado EstiloYScript.txt, básicamente hemos creado una pequeña

hoja de éstilos, y algunas funciones útiles de jscript, al final hemos invocado uno de los script desde elhoja de éstilos, y algunas funciones útiles de jscript, al final hemos invocado uno de los script desde el

body& por el momento no se fijen en lo que hace eso sino lo entienden& ese no es el tema, conformensebody& por el momento no se fijen en lo que hace eso sino lo entienden& ese no es el tema, conformense

con saber que es para crear una tabla en una página Web y hacer que quede coloreada automáticamente. con saber que es para crear una tabla en una página Web y hacer que quede coloreada automáticamente.

Page 28: Codigo Latino 10

Ahora desde la consola de PowerShell nos vamos a la carpeta donde guardamos el archivo (sí& se hace igualAhora desde la consola de PowerShell nos vamos a la carpeta donde guardamos el archivo (sí& se hace igual

que en una consola DOS, recuerden que PowerShell extiende las funcionalidades de los antiguos bat). Ahoraque en una consola DOS, recuerden que PowerShell extiende las funcionalidades de los antiguos bat). Ahora

vamos a aprender varias cosas:vamos a aprender varias cosas:

Acá vemos como definir una variable ( head, para definirla se le pone Acá vemos como definir una variable ( head, para definirla se le pone $$), y también vemos como leer un), y también vemos como leer un

archivo y asignar sus contenidos a la variable:archivo y asignar sus contenidos a la variable:

$head $head = = get-contentget-content "EstiloYScript.txt""EstiloYScript.txt"

Ahora veamos el siguiente comando, nos permite no solo seleccionar la lista de procesos sino traerAhora veamos el siguiente comando, nos permite no solo seleccionar la lista de procesos sino traer

únicamente la información que deseamos. Estamos buscando los procesos que comiencen por r. Atención alúnicamente la información que deseamos. Estamos buscando los procesos que comiencen por r. Atención al

comando select.comando select.

get-processget-process | |

where-objectwhere-object{ $_.Name -like { $_.Name -like "r*""r*"} |} |

select-objectselect-object id, processname, handles id, processname, handles

La salida:La salida:

IdId ProcessNameProcessName HandlesHandles

25562556 rosetta_beta_5.96_windows_intelx86 rosetta_beta_5.96_windows_intelx86 5252

37403740 rosetta_beta_5.96_windows_intelx86 rosetta_beta_5.96_windows_intelx86 5353

25202520 RtvscanRtvscan 594594

41524152 rundll32rundll32 4242

44324432 rundll32rundll32 9393

Espero que les este gustando, ahora veamos como redireccionar la salida en formato htmlEspero que les este gustando, ahora veamos como redireccionar la salida en formato html

get-processget-process | |

where-objectwhere-object{ $_.Name -like { $_.Name -like "r*""r*"} |} |

select-objectselect-object id, processname, handles | id, processname, handles |

convertto-htmlconvertto-html

Page 29: Codigo Latino 10

La salida html:La salida html:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"

"http://www.w3.org/TR/html4/strict.dtd"> "http://www.w3.org/TR/html4/strict.dtd">

<<htmlhtml>>

< <headhead>>

< <titletitle>HTML TABLE</>HTML TABLE</titletitle>>

</ </headhead>>

<<bodybody>>

< <tabletable>>

< <colgroupcolgroup>>

< <colcol><><colcol><><colcol>>

</ </colgroupcolgroup>>

< <trtr><><thth>Id</>Id</thth><><thth>ProcessName</>ProcessName</thth><><thth>Handles</>Handles</thth></></trtr>>

< <trtr><><tdtd>2556</>2556</tdtd><><tdtd>rosetta_beta_5.96_windows_intelx86</>rosetta_beta_5.96_windows_intelx86</tdtd><><tdtd>52</>52</tdtd></></trtr>>

< <trtr><><tdtd>5776</>5776</tdtd><><tdtd>rosetta_beta_5.96_windows_intelx86</>rosetta_beta_5.96_windows_intelx86</tdtd><><tdtd>53</>53</tdtd></></trtr>>

< <trtr><><tdtd>2520</>2520</tdtd><><tdtd>Rtvscan</>Rtvscan</tdtd><><tdtd>594</>594</tdtd></></trtr>>

< <trtr><><tdtd>4152</>4152</tdtd><><tdtd>rundll32</>rundll32</tdtd><><tdtd>42</>42</tdtd></></trtr>>

< <trtr><><tdtd>4432</>4432</tdtd><><tdtd>rundll32</>rundll32</tdtd><><tdtd>93</>93</tdtd></></trtr>>

</ </tabletable>>

</</bodybody>>

</</htmlhtml>>

Como direccionarla a un archivo de texto? se puede pasándole por pipe al comando out-file, o bien como enComo direccionarla a un archivo de texto? se puede pasándole por pipe al comando out-file, o bien como en

los antiguos bat con el operador > o >>:los antiguos bat con el operador > o >>:get-processget-process | |

where-objectwhere-object{ $_.Name -like { $_.Name -like "r*""r*"} |} |

select-objectselect-object id, processname, handles | id, processname, handles |

convertto-htmlconvertto-html > > htmlFile.htmlhtmlFile.html

Este archivo ya es legible y lo podemos abrir desde el browser, recuerdan el estilo y script que cargamos antesEste archivo ya es legible y lo podemos abrir desde el browser, recuerdan el estilo y script que cargamos antes

en la variable $head? es momento de usarlo, adicionemosle algo de sabor al html generado:en la variable $head? es momento de usarlo, adicionemosle algo de sabor al html generado:

get-processget-process | |

where-objectwhere-object{ $_.Name -like { $_.Name -like "r*""r*"} |} |

select-objectselect-object id, processname, handles | id, processname, handles |

convertto-html -head convertto-html -head $head$head >> htmlFile.html htmlFile.html

Y al abrirlo desde el explorador& revísenlo uds mismos.Y al abrirlo desde el explorador& revísenlo uds mismos.

Page 30: Codigo Latino 10

4- Matar un proceso recurriendo a Windows Management Instrumentation (WMI), para este ejemplo lo4- Matar un proceso recurriendo a Windows Management Instrumentation (WMI), para este ejemplo lo

primero que debemos hacer es abrir un bloc de notas. Luego anotar esto en la consola:primero que debemos hacer es abrir un bloc de notas. Luego anotar esto en la consola:

$a$a = = get-wmiobjectget-wmiobject win32_process | win32_process |

where-objectwhere-object {$_.name {$_.name -eq-eq "notepad.exe""notepad.exe"}}

$a$a.terminate().terminate()

5- Consultar el consumo de CPU de un proceso recurriendo a Windows Management Instrumentation5- Consultar el consumo de CPU de un proceso recurriendo a Windows Management Instrumentation

(WMI), la salida es formateada con el comando fotmat-table para pesonalizar los labels, y se usa el comando(WMI), la salida es formateada con el comando fotmat-table para pesonalizar los labels, y se usa el comando

select para determinar que datos serán procesados en la salida.select para determinar que datos serán procesados en la salida.

get-wmiobjectget-wmiobject Win32_PerfFormattedData_PerfProc_Process | Win32_PerfFormattedData_PerfProc_Process |

select-objectselect-object name, PercentProcessorTime | name, PercentProcessorTime |

where-object where-object { $_.Name { $_.Name -eq-eq "powershell""powershell"} |} |

format-table format-table @@{Label={Label="Nombre del proceso""Nombre del proceso"; Expression={$_.name}},; Expression={$_.name}},

@@{Label={Label="Tiempo de CPU""Tiempo de CPU"; Expression={$_.PercentProcessorTime}} -auto; Expression={$_.PercentProcessorTime}} -auto

La salida&La salida&

Nombre del Proceso Tiempo de CPUNombre del Proceso Tiempo de CPU

------------------ ------------------------------- -------------

powershell 0powershell 0

6- Sentencias de control de flujo, ya a estas alturas lo único por explicar es que es que es write-host &6- Sentencias de control de flujo, ya a estas alturas lo único por explicar es que es que es write-host &

escribir en el host , en este caso la consola y throw es para envíar una excepción en un programa.escribir en el host , en este caso la consola y throw es para envíar una excepción en un programa.

$a$a = = "white""white"

if if (($a$a -eq-eq "red""red"))

{ {"The color is red.""The color is red."}}

elseif elseif (($a$a -eq-eq "white""white"))

{ {"The color is white.""The color is white."}}

elseelse

{ {"The color is blue.""The color is blue."}}

Ejecutenlo& creo que es claro. Hagan pruebas cambiando el valor de la variable $a para que vean comoEjecutenlo& creo que es claro. Hagan pruebas cambiando el valor de la variable $a para que vean como

cambia el flujo de las instrucciones.cambia el flujo de las instrucciones.

Page 31: Codigo Latino 10

7- Definir funciones, es un ejemplo muy similar al anterior, pero se añaden algunos modificadores a write-7- Definir funciones, es un ejemplo muy similar al anterior, pero se añaden algunos modificadores a write-

host para cambiar los colores de fondo y de fuente.host para cambiar los colores de fondo y de fuente.

function function ElColor(ElColor($color$color))

{{

"El color es:""El color es:"

ifif ( ($color$color -eq-eq "amarillo""amarillo"))

{ { write-host write-host "amarillo""amarillo" -foregroundcolor-foregroundcolor "yellow""yellow" } }

elseif elseif (($color $color -eq -eq "azul""azul"))

{ { write-host write-host "azul""azul" -foregroundcolor-foregroundcolor "blue""blue" -backgroundcolor -backgroundcolor "white""white"}}

elseif elseif (($color$color -eq-eq "rojo""rojo"))

{ { write-hostwrite-host "rojo""rojo" -foregroundcolor-foregroundcolor "red""red"}}

elseelse

{ { throwthrow "No reconozco ese color""No reconozco ese color"}}

}}

Con lo anterior hemos creado la función, ahora probemoslaCon lo anterior hemos creado la función, ahora probemosla

ElColor(� amarillo� );ElColor(� amarillo� );

El color es: El color es: amarilloamarillo

ElColor(� azul� );ElColor(� azul� );

El color es:El color es:azulazul

ElColor(� rojo� );ElColor(� rojo� );

El color es:El color es:rojorojo

ElColor(� xxx� );ElColor(� xxx� );

No reconozco ese colorNo reconozco ese color

En línea:11 carácter:10En línea:11 carácter:10

+ { throw <<<< "No reconozco ese color"}+ { throw <<<< "No reconozco ese color"}

8- Switches de funciones, ahora rescribamos la función de esta forma:8- Switches de funciones, ahora rescribamos la función de esta forma:

function function ElColor(ElColor($color$color, [, [switchswitch] ] $comoWarning$comoWarning))

{{

ifif(($comoWarning$comoWarning))

{ { write-warningwrite-warning "El color es: ""El color es: " } }

else else

{ { "El color es: ""El color es: " } }

ifif ( ($color$color -eq-eq "amarillo""amarillo"))

{ { write-host write-host "amarillo""amarillo" -foregroundcolor-foregroundcolor "yellow""yellow" } }

Page 32: Codigo Latino 10

elseif elseif (($color $color -eq -eq "azul""azul"))

{ { write-host write-host "azul""azul" -foregroundcolor-foregroundcolor "blue""blue" -backgroundcolor -backgroundcolor "white""white"}}

elseif elseif (($color$color -eq-eq "rojo""rojo"))

{ { write-hostwrite-host "rojo""rojo" -foregroundcolor-foregroundcolor "red""red"}}

elseelse

{ { throwthrow "No reconozco ese color""No reconozco ese color"}}

}}

La función ahora recibe un parámetro de tipo switch, el cual luego es verificado para determinar si el mensajeLa función ahora recibe un parámetro de tipo switch, el cual luego es verificado para determinar si el mensaje

se muestra o no a manera de advertencia, la salida y el uso sería igual al ejemplo anterior desde que no se usese muestra o no a manera de advertencia, la salida y el uso sería igual al ejemplo anterior desde que no se use

el switch. Para usar el switch se debe hacer de la siguiente forma:el switch. Para usar el switch se debe hacer de la siguiente forma:

ElColor(� azul� ) -comoWarningElColor(� azul� ) -comoWarning

ADVERTENCIA: El color es:ADVERTENCIA: El color es:

azulazul

Bien eso es todo, como verán aunque esto es PowerShell para IT� s hubo bastante desarrollo, sin embargo loBien eso es todo, como verán aunque esto es PowerShell para IT� s hubo bastante desarrollo, sin embargo lo

que tengo preparado para los developers es aún mejor, que tal en vez de solamente usar PowerShell&que tengo preparado para los developers es aún mejor, que tal en vez de solamente usar PowerShell&

extenderlo? o hacer que su salida no sea una consola sino una aplicación propia? o hacer que los comandosextenderlo? o hacer que su salida no sea una consola sino una aplicación propia? o hacer que los comandos

no se digiten en una consola sino desde una página Web u otra aplicación?& pues de eso tratara la próximano se digiten en una consola sino desde una página Web u otra aplicación?& pues de eso tratara la próxima

entrega.entrega.

Page 33: Codigo Latino 10

Historia de PythonHistoria de Python http://es.wikipedia.orghttp://es.wikipedia.orgPython fue creado a finales de los ochenta por Guido van Rossum en Python fue creado a finales de los ochenta por Guido van Rossum en CWICWI en los en los Países BajosPaíses Bajos como un como un

sucesor del sucesor del lenguaje de programación ABClenguaje de programación ABC, capaz de manejar excepciones e interactuar con el , capaz de manejar excepciones e interactuar con el sistemasistema

operativo Amoebaoperativo Amoeba . .

Van Rossum es el principal autor de Python, y su continuo rol central en decidir la dirección de Python esVan Rossum es el principal autor de Python, y su continuo rol central en decidir la dirección de Python es

reconocido, refiriéndose a él como reconocido, refiriéndose a él como Benevolente dictador vitalicioBenevolente dictador vitalicio o o Benevolent Dictator for LifeBenevolent Dictator for Life (BDFL). (BDFL).

En 1991, van Rossum publicó el código (versión 0.9.0) en En 1991, van Rossum publicó el código (versión 0.9.0) en alt.sourcesalt.sources. En esta etapa del desarrollo ya estaban. En esta etapa del desarrollo ya estaban

presentes clases con herencia, manejo de excepciones, funciones, y los tipos modulares: presentes clases con herencia, manejo de excepciones, funciones, y los tipos modulares: listlist, , dictdict, , strstr y así y así

sucesivamente. Además en este lanzamiento inicial aparecía un sistema de módulos adoptado de sucesivamente. Además en este lanzamiento inicial aparecía un sistema de módulos adoptado de Modula-3Modula-3;;

van Rossum describe el módulo como "uno de las mayores unidades de programación de Python". El modelovan Rossum describe el módulo como "uno de las mayores unidades de programación de Python". El modelo

de excepciones en Python es parecido al de Modula-3, con la adición de una cláusula de excepciones en Python es parecido al de Modula-3, con la adición de una cláusula elseelse . En el año 1994 se . En el año 1994 se

formó formó comp.lang.pythoncomp.lang.python, el foro de discusión principal de Python, marcando un hito en el crecimiento del, el foro de discusión principal de Python, marcando un hito en el crecimiento del

grupo de usuarios de este lenguaje.grupo de usuarios de este lenguaje.

Python alcanzó la versión 1.0 en enero de 1994. Una característica de este lanzamiento fueron lasPython alcanzó la versión 1.0 en enero de 1994. Una característica de este lanzamiento fueron las

herramientas de la herramientas de la programación funcionalprogramación funcional: : lambdalambda, , mapmap, , filterfilter y y reducereduce. Van Rossum explicó que "Hace 12. Van Rossum explicó que "Hace 12

años, Python adquirió lambda, reduce(), filter() and map(), cortesía de un hacker de años, Python adquirió lambda, reduce(), filter() and map(), cortesía de un hacker de LispLisp que las extrañaba y que las extrañaba y

que envió parches." El donante fue que envió parches." El donante fue Amrit PremAmrit Prem; no se hace ninguna mención específica de cualquier herencia; no se hace ninguna mención específica de cualquier herencia

de Lisp en las notas de lanzamiento.de Lisp en las notas de lanzamiento.

La última versión liberada proveniente de CWI fue Python 1.2. En 1995, van Rossum continuó su trabajo enLa última versión liberada proveniente de CWI fue Python 1.2. En 1995, van Rossum continuó su trabajo en

Python en la Python en la Corporation for National Research InitiativesCorporation for National Research Initiatives (CNRI) en Reston, (CNRI) en Reston, VirginiaVirginia donde lanzó varias donde lanzó varias

versiones del versiones del softwaresoftware..

Durante su estancia en CNRI, van Rossum lanzó la iniciativa Durante su estancia en CNRI, van Rossum lanzó la iniciativa Computer Programming for EverybodyComputer Programming for Everybody (CP4E), (CP4E),

con el fin de hacer la programación más accesible a más gente, con un nivel de 'alfabetización' básico encon el fin de hacer la programación más accesible a más gente, con un nivel de 'alfabetización' básico en

lenguajes de programación, similar a la alfabetización básica en inglés y habilidades matemáticas necesariaslenguajes de programación, similar a la alfabetización básica en inglés y habilidades matemáticas necesarias

por muchos trabajadores. Python tuvo un papel crucial en este proceso: debido a su orientación hacia unapor muchos trabajadores. Python tuvo un papel crucial en este proceso: debido a su orientación hacia una

sintaxis limpia, ya era idóneo, y las metas de CP4E presentaban similitudes con su predecesor, ABC. Elsintaxis limpia, ya era idóneo, y las metas de CP4E presentaban similitudes con su predecesor, ABC. El

proyecto fue patrocinado por proyecto fue patrocinado por DARPADARPA. En el año 2007, el proyecto CP4E está inactivo, y mientras Python. En el año 2007, el proyecto CP4E está inactivo, y mientras Python

intenta ser fácil de aprender y no muy arcano en su sintaxis y semántica, alcanzando a los no-programadores,intenta ser fácil de aprender y no muy arcano en su sintaxis y semántica, alcanzando a los no-programadores,

no es una preocupación activa.no es una preocupación activa.

En el año 2000, el principal equipo de desarrolladores de Python se cambió a En el año 2000, el principal equipo de desarrolladores de Python se cambió a BeOpen.comBeOpen.com para formar el para formar el

equipo BeOpen equipo BeOpen PythonLabsPythonLabs. CNRI pidió que la versión 1.6 fuera pública, continuando su desarrollo hasta. CNRI pidió que la versión 1.6 fuera pública, continuando su desarrollo hasta

que el equipo de desarrollo abandonó CNRI; su programa de lanzamiento y el de la versión 2.0 tenían unaque el equipo de desarrollo abandonó CNRI; su programa de lanzamiento y el de la versión 2.0 tenían una

significativa cantidad de translapo. Python 2.0 fue el primer y único lanzamiento de BeOpen.com. Despuéssignificativa cantidad de translapo. Python 2.0 fue el primer y único lanzamiento de BeOpen.com. Después

que Python 2.0 fuera publicado por BeOpen.com, Guido van Rossum y los otros desarrolladores PythonLabsque Python 2.0 fuera publicado por BeOpen.com, Guido van Rossum y los otros desarrolladores PythonLabs

se unieron en se unieron en Digital CreationsDigital Creations..

Python 2.0 tomó una característica mayor del lenguaje de Python 2.0 tomó una característica mayor del lenguaje de programación funcionalprogramación funcional HaskellHaskell: : listlist

Page 34: Codigo Latino 10

comprehensionscomprehensions. La sintaxis de Python para esta construcción es muy similar a la de Haskell, salvo por la. La sintaxis de Python para esta construcción es muy similar a la de Haskell, salvo por la

preferencia de los caracteres de puntuación en Haskell, y la preferencia de Python por palabras clavespreferencia de los caracteres de puntuación en Haskell, y la preferencia de Python por palabras claves

alfabéticas. Python 2.0 introdujo además un sistema de alfabéticas. Python 2.0 introdujo además un sistema de recolección de basurarecolección de basura capaz de recolectar referencias capaz de recolectar referencias

cíclicas.cíclicas.

Posterior a este doble lanzamiento, y después que van Rossum dejó CNRI para trabajar con desarrolladoresPosterior a este doble lanzamiento, y después que van Rossum dejó CNRI para trabajar con desarrolladores

de software comercial, quedó claro que la opción de usar Python con software disponible bajo de software comercial, quedó claro que la opción de usar Python con software disponible bajo GPLGPL era muy era muy

deseable. La licencia usada entonces, la deseable. La licencia usada entonces, la Python LicensePython License, incluía una cláusula estipulando que la licencia, incluía una cláusula estipulando que la licencia

estaba gobernada por el estado de estaba gobernada por el estado de VirginiaVirginia por lo que, bajo la óptica de los abogados de por lo que, bajo la óptica de los abogados de Free SoftwareFree Software

FoundationFoundation (FSF), se hacía incompatible con (FSF), se hacía incompatible con GNU GPLGNU GPL. CNRI y FSF se relacionaron para cambiar la. CNRI y FSF se relacionaron para cambiar la

licencia de software libre de Python para hacerla compatible con GPL. En el año 2001, van Rossum fuelicencia de software libre de Python para hacerla compatible con GPL. En el año 2001, van Rossum fue

premiado con premiado con FSF Award for the Advancement of Free SoftwareFSF Award for the Advancement of Free Software..

Python 1.6.1 es esencialmente el mismo que Python 1.6, con unos pocos arreglos de Python 1.6.1 es esencialmente el mismo que Python 1.6, con unos pocos arreglos de bugsbugs, y con una nueva, y con una nueva

licencia compatible con GPL.licencia compatible con GPL.

Python 2.1 fue un trabajo derivado de Python 1.6.1, así como también de Python 2.0. Su licencia fuePython 2.1 fue un trabajo derivado de Python 1.6.1, así como también de Python 2.0. Su licencia fue

renombrada: renombrada: Python Software Foundation LicensePython Software Foundation License. Todo el código, documentación y especificaciones. Todo el código, documentación y especificaciones

añadidas, desde la fecha del lanzamiento de la versión alfa de Python 2.1, tiene como dueño a añadidas, desde la fecha del lanzamiento de la versión alfa de Python 2.1, tiene como dueño a PythonPython

Software FoundationSoftware Foundation (PSF), una organización sin ánimo de lucro fundada en el año 2001, tomando como (PSF), una organización sin ánimo de lucro fundada en el año 2001, tomando como

modelo la modelo la Apache Software FoundationApache Software Foundation. Incluido en este lanzamiento fue una implementación del scoping. Incluido en este lanzamiento fue una implementación del scoping

más parecida a las reglas de más parecida a las reglas de static scopingstatic scoping (del cual (del cual SchemeScheme es el originador). es el originador).

Una innovación mayor en Python 2.2 fue la unificación de los tipos en Python (tipos escritos en C), y clasesUna innovación mayor en Python 2.2 fue la unificación de los tipos en Python (tipos escritos en C), y clases

(tipos escritos en Python) dentro de una jerarquía. Esa unificación logró un modelo de objetos de Python(tipos escritos en Python) dentro de una jerarquía. Esa unificación logró un modelo de objetos de Python

puro y consistente. También fueron agregados los puro y consistente. También fueron agregados los generadoresgeneradores que fueron inspirados por el lenguaje que fueron inspirados por el lenguaje IconIcon..

Las adiciones a la biblioteca estándar de Python y las decisiones sintácticas fueron influenciadas fuertementeLas adiciones a la biblioteca estándar de Python y las decisiones sintácticas fueron influenciadas fuertemente

por por JavaJava en algunos casos: el package en algunos casos: el package logginglogging, introducido en la versión 2.3, el parser , introducido en la versión 2.3, el parser SAXSAX, introducido en, introducido en

2.0, y la sintaxis del 2.0, y la sintaxis del patrón decoratorpatrón decorator que usa el que usa el @@, agregado en la versión 2.4, agregado en la versión 2.4

En febrero de 2008, la última versión de producción de Python es la 2.5.2En febrero de 2008, la última versión de producción de Python es la 2.5.2

Page 35: Codigo Latino 10

Tutorial BATCHTutorial BATCH

Por FranGKPor FranGKBuenas, pues este es un tutorial sobre batch, que considero de nivel fácil/intermedio, veremos como crearBuenas, pues este es un tutorial sobre batch, que considero de nivel fácil/intermedio, veremos como crear

� programas� que nos sean útiles para el día a día.� programas� que nos sean útiles para el día a día.

Empezaremos por lo básico, un archivo bat es editado desde un editor de texto plano, es decir el bloc de notasEmpezaremos por lo básico, un archivo bat es editado desde un editor de texto plano, es decir el bloc de notas

por ejemplo.por ejemplo.

Vamos a utilizar en este primer ejemplo los siguientes comandos:Vamos a utilizar en este primer ejemplo los siguientes comandos:

-Title-Title

-Echo-Echo

-Set-Set

-Pause-Pause

-Exit-Exit

� Title� : sirve para establecer el titulo de nuestro batch, el nombre que aparecerá en la ventana.� Title� : sirve para establecer el titulo de nuestro batch, el nombre que aparecerá en la ventana.

� Echo� : veremos varias formas de su uso, � @echo off� hará que se desactiven las líneas del comando echo� Echo� : veremos varias formas de su uso, � @echo off� hará que se desactiven las líneas del comando echo

(mas adelante veremos la diferencia entre (ON/OFF).(mas adelante veremos la diferencia entre (ON/OFF).

Si queremos saltar una línea se usa � echo.� .Si queremos saltar una línea se usa � echo.� .

Para que una frase escrita salga en la ventana se usa � echo hola� , si contiene espacios poner el contenido entrePara que una frase escrita salga en la ventana se usa � echo hola� , si contiene espacios poner el contenido entre

comillas dobles (� � ).comillas dobles (� � ).

Bien, el comando � Set� sirve para crear, modificar o visualizar variables.Bien, el comando � Set� sirve para crear, modificar o visualizar variables.

Si abrimos CMD y escribimos set veremos las variables de entorno que están en uso actualmente.Si abrimos CMD y escribimos set veremos las variables de entorno que están en uso actualmente.

Todos los comandos (o casí todos) tienen la opción de usar modificadores, los cuales indican al comando enTodos los comandos (o casí todos) tienen la opción de usar modificadores, los cuales indican al comando en

concreto una acción a realizar:concreto una acción a realizar:

� Set /p variable� se utiliza para que lo que escriba el usuario sea guardado en � variable� , si la queremos� Set /p variable� se utiliza para que lo que escriba el usuario sea guardado en � variable� , si la queremos

mostrar en pantalla debemos de escribir el nombre de la variable entre %%, aquí va un ejemplo:mostrar en pantalla debemos de escribir el nombre de la variable entre %%, aquí va un ejemplo:

@@echoecho off off

title Mi programatitle Mi programa

setset /p /p variablevariable=Dime tu nombre:=Dime tu nombre:

echoecho..

echo echo Tu nombre es %Tu nombre es %variablevariable%, bienvenido a la programacion batch.%, bienvenido a la programacion batch.

echoecho. .

pausepause

exitexit

Page 36: Codigo Latino 10

Guardarlo en un archivo con extensión � .bat� y ejecutarlo.Guardarlo en un archivo con extensión � .bat� y ejecutarlo.

Para ver la diferencia entre [on/off], ponerle on, guardarlo y volver a ejecutarlo (@echo on).Para ver la diferencia entre [on/off], ponerle on, guardarlo y volver a ejecutarlo (@echo on).

:O, que diferencia!:O, que diferencia!

El comando � pause� simplemente hace una pausa, y � exit� sale de cmd.exe (cmd.exe interpreta los códigos deEl comando � pause� simplemente hace una pausa, y � exit� sale de cmd.exe (cmd.exe interpreta los códigos de

nuestros .bat, haciendo que sea posible su uso).nuestros .bat, haciendo que sea posible su uso).

Hemos visto 5 comandos (de los cuales usaremos siempre 4 ó seguramente los 5).Hemos visto 5 comandos (de los cuales usaremos siempre 4 ó seguramente los 5).

Sabemos que � Set /p variable� guarda lo que escriba el usuario, ya sean números o letras, pero ¿y si queremosSabemos que � Set /p variable� guarda lo que escriba el usuario, ya sean números o letras, pero ¿y si queremos

hacer una suma?hacer una suma?

� Set /a� permite realizar operaciones aritméticas (suma, resta& ).� Set /a� permite realizar operaciones aritméticas (suma, resta& ).

Hacemos una pequeña modificación en el código anterior:Hacemos una pequeña modificación en el código anterior:

@@echoecho off off

title Suma de dos númerostitle Suma de dos números

setset /p /p aa=Dime un número:=Dime un número:

echoecho..

setset /p /p bb=Dime un número:=Dime un número:

echoecho..

set set /a /a sumasuma=%=%aa%+%%+%bb%%

echoecho La suma de % La suma de %aa% y %% y %bb% es %% es %sumasuma%%

echoecho. .

PausePause

Page 37: Codigo Latino 10

Quedaría asi, excepto por los números :P :Quedaría asi, excepto por los números :P :

Esto si nos sumará dos números y hacer que en vez de sumar haga una resta seria muy sencillo, sustituye elEsto si nos sumará dos números y hacer que en vez de sumar haga una resta seria muy sencillo, sustituye el

símbolo � +� por � -� y así sucesivamente.símbolo � +� por � -� y así sucesivamente.

Crear un archivo llamado datos.txt y copiar el contenido de este manual.Crear un archivo llamado datos.txt y copiar el contenido de este manual.

Desde un batch podemos leer archivos de texto, y para ello usamos el comando � type� .Desde un batch podemos leer archivos de texto, y para ello usamos el comando � type� .

Su sintaxis no es difícil � Type RutaDelArchivo� , pero ¿y si el archivo es muy largo? Pues no podríamos leerloSu sintaxis no es difícil � Type RutaDelArchivo� , pero ¿y si el archivo es muy largo? Pues no podríamos leerlo

desde la ventana de ms-dos y para poder hacerlo usaremos también el comando � more� .desde la ventana de ms-dos y para poder hacerlo usaremos también el comando � more� .

El comando � more� hace una pausa cada vez que la pantalla de ms-dos � se llena� para hacer su lectura másEl comando � more� hace una pausa cada vez que la pantalla de ms-dos � se llena� para hacer su lectura más

fácil (y muchas veces simplemente la hace posible), presionando � enter� bajará línea por línea y presionandofácil (y muchas veces simplemente la hace posible), presionando � enter� bajará línea por línea y presionando

� espacio� � rellenará la ventana de nuevo� .� espacio� � rellenará la ventana de nuevo� .

Crear un nuevo bat y escribir el siguiente código:Crear un nuevo bat y escribir el siguiente código:

@@echoecho off off

title Leer archivos de textotitle Leer archivos de texto

typetype datos.txt | more datos.txt | more

pausepause

exitexit

Page 38: Codigo Latino 10

Por si hay dudas el carácter � |� se obtiene pulsando Alt Gr y 1.Por si hay dudas el carácter � |� se obtiene pulsando Alt Gr y 1.

Bueno hemos visto varios comandos y toca ver más xD, estos también son muy comunes:Bueno hemos visto varios comandos y toca ver más xD, estos también son muy comunes:

-Cls-Cls

-Color-Color

-Start-Start

-If-If

-Goto-Goto

-etíquetas (esto no es un comando)-etíquetas (esto no es un comando)

-Cd-Cd

El comando � cls� limpia la pantalla.El comando � cls� limpia la pantalla.

El comando � color� como su nombre indica sirve para poner color de fondo a la pantalla y al texto:El comando � color� como su nombre indica sirve para poner color de fondo a la pantalla y al texto:

0 = Negro 8 = Gris 0 = Negro 8 = Gris

1 = Azul 9 = Azul claro 1 = Azul 9 = Azul claro

2 = Verde A = Verde claro 2 = Verde A = Verde claro

3 = Aguamarina B = Aguamarina claro 3 = Aguamarina B = Aguamarina claro

4 = Rojo C = Rojo claro 4 = Rojo C = Rojo claro

5 = Púrpura D = Púrpura claro 5 = Púrpura D = Púrpura claro

6 = Amarillo E = Amarillo claro 6 = Amarillo E = Amarillo claro

7 = Blanco F = Blanco brillante 7 = Blanco F = Blanco brillante

Page 39: Codigo Latino 10

Da igual como lo pongáis, por ejemplo � color 1f� , siempre y cuando no pongas el mismo dos veces (� colorDa igual como lo pongáis, por ejemplo � color 1f� , siempre y cuando no pongas el mismo dos veces (� color

ff� ó � color 44� ) en ese caso no se cambiara el color y se quedará default.ff� ó � color 44� ) en ese caso no se cambiara el color y se quedará default.

Con el comando � start� puedes ejecutar archivos o inicializar ventanas (abrirlas), más adelante si usamosCon el comando � start� puedes ejecutar archivos o inicializar ventanas (abrirlas), más adelante si usamos

� start� más afondo veremos más opciones. � start� más afondo veremos más opciones.

Los � If� son sencillos de usar y muy prácticos, un � if� es un proceso condicional, como en cualquier lenguajeLos � If� son sencillos de usar y muy prácticos, un � if� es un proceso condicional, como en cualquier lenguaje

(C, VB& ) vamos a ver unos ejemplos:(C, VB& ) vamos a ver unos ejemplos:

::menumenu

clscls

SetSet /p /p MiVariableMiVariable=Dime la palabra clave:=Dime la palabra clave:

IfIf % %MiVariableMiVariable%==hola %==hola goto goto BuenosDiasBuenosDias

IfIf % %MiVariableMiVariable%==%%==%MiVariableMiVariable% % goto goto errorerror

::BuenosDiasBuenosDias

echoecho Muy buenos dias Muy buenos dias

pausepause

exitexit

::errorerror

echoecho La palabra clave % La palabra clave %MiVariableMiVariable% es erronea.% es erronea.

pausepause

gotogoto menumenu

En el caso de que � MiVariable� sea � hola� saldrá del procedimiento, hasta que no indiques la palabraEn el caso de que � MiVariable� sea � hola� saldrá del procedimiento, hasta que no indiques la palabra

correcta seguiras en el programa.correcta seguiras en el programa.

Fíjate en esto:Fíjate en esto:

If MiVariable==%MiVariable% exitIf MiVariable==%MiVariable% exit

Cuando se ve esta expresión quiere decir que si de lo que introdujo el usuario no está en el grupo de opcionesCuando se ve esta expresión quiere decir que si de lo que introdujo el usuario no está en el grupo de opciones

disponibles puedes redireccionar el � error� que se produciría en el proceso, ya que si solo tenemos de opcióndisponibles puedes redireccionar el � error� que se produciría en el proceso, ya que si solo tenemos de opción

valida � hola� y pones � jajaja� se saldría (en ese caso no lo tienes controlado). valida � hola� y pones � jajaja� se saldría (en ese caso no lo tienes controlado).

Nosotros sí lo tenemos controlado, lo redirrecionamos a la etíqueta � error� .Nosotros sí lo tenemos controlado, lo redirrecionamos a la etíqueta � error� .

Las etíquetas (no se si realmente se llaman así :P) serían esto:Las etíquetas (no se si realmente se llaman así :P) serían esto:

:error:error

..........

Es decir, pones � :� seguido del nombre de tú etíqueta, en el caso de que se equivoquen al poner la contraseñaEs decir, pones � :� seguido del nombre de tú etíqueta, en el caso de que se equivoquen al poner la contraseña

pues que se vayan a esa etíqueta, en la cual les dará un mensajito de error, por ejemplo.pues que se vayan a esa etíqueta, en la cual les dará un mensajito de error, por ejemplo.

Y generalmente, como las etíquetas suelen estar (o quizás no :P) alejadas del � lugar� donde se esta operandoY generalmente, como las etíquetas suelen estar (o quizás no :P) alejadas del � lugar� donde se esta operando

se usa � goto� .se usa � goto� .

El comando � goto� sería un � taxi� (por supuesto gratuito jaja) que te lleva de etíqueta en etíqueta.El comando � goto� sería un � taxi� (por supuesto gratuito jaja) que te lleva de etíqueta en etíqueta.

Page 40: Codigo Latino 10

Ahora podemos crear un inicio de sesión, humilde, en batch:Ahora podemos crear un inicio de sesión, humilde, en batch:

@@echoecho off off

title Inicio de sesiontitle Inicio de sesion

setset /P /P useruser=Usuario:=Usuario:

echoecho..

setset /P /P contracontra=contrasena:=contrasena:

if %if %useruser%==trucos %==trucos goto goto passpass

if %if %useruser%==%%==%useruser% % exitexit

::passpass

if %if %contracontra%==windows %==windows goto goto okok

if %if %contracontra%==%%==%contracontra% % exitexit

::okok

echoecho..

echoecho "Usuario & contrasena correctos" "Usuario & contrasena correctos"

echoecho..

pausepause

exitexit

En este caso si el usuario no es correcto se sale, si es correcto irá a verificar que la contraseña también esEn este caso si el usuario no es correcto se sale, si es correcto irá a verificar que la contraseña también es

correcta (si la contraseña no es correcta también se sale)correcta (si la contraseña no es correcta también se sale)

Si todo es correcto iremos a la etíqueta � :ok� ;)Si todo es correcto iremos a la etíqueta � :ok� ;)

Antes creamos un archivo llamado � datos.txt� , vamos a abrirlo usando el comando � start� :Antes creamos un archivo llamado � datos.txt� , vamos a abrirlo usando el comando � start� :

start datos.txtstart datos.txt

Así de sencillo (suponiendo siempre que � datos.txt� esta en la misma ubicación que nuestro bat) ;)Así de sencillo (suponiendo siempre que � datos.txt� esta en la misma ubicación que nuestro bat) ;)

Page 41: Codigo Latino 10

¿Cómo hacemos para movernos por los directorios usando batch?¿Cómo hacemos para movernos por los directorios usando batch?

Con el comando � cd� , con el podemos ir navegando por los directorios de nuestro ordenador:Con el comando � cd� , con el podemos ir navegando por los directorios de nuestro ordenador:

Cd %windir%Cd %windir%

Poniendo esto iremos a � C:\Windows� (también depende del sistema operativo)Poniendo esto iremos a � C:\Windows� (también depende del sistema operativo)

Podemos hacer esto también:Podemos hacer esto también:

Cd � C:\Archivos de programa�Cd � C:\Archivos de programa�

Es MUY importante, usando este comando que si la ubicación hacia la que navegáis tiene espacios (como laEs MUY importante, usando este comando que si la ubicación hacia la que navegáis tiene espacios (como la

que puesto ahora), ponerla entre comillas (� � ).que puesto ahora), ponerla entre comillas (� � ).

Aquí vamos a hacer un repaso rápido de lo que hemos visto antes y ampliar un poco la información queAquí vamos a hacer un repaso rápido de lo que hemos visto antes y ampliar un poco la información que

tenemos:tenemos:

En batch los espacios son malos a veces, y es frecuente que un despiste nos pueda dar un sustillo, recordarEn batch los espacios son malos a veces, y es frecuente que un despiste nos pueda dar un sustillo, recordar

poner las � � ó revisar si hay un espacio que no debería estar en ese sitio.poner las � � ó revisar si hay un espacio que no debería estar en ese sitio.

Hemos hablado acerca del comando � set� , sabes que muestran variables de entorno, pero ¿Qué es una variableHemos hablado acerca del comando � set� , sabes que muestran variables de entorno, pero ¿Qué es una variable

de entorno? ¿sirve para algo?de entorno? ¿sirve para algo?

Una variable de entorno en batch& .echemos imaginación:Una variable de entorno en batch& .echemos imaginación:

En una zona de la memoria de nuestro pc están guardadas una serie de variables con información acerca delEn una zona de la memoria de nuestro pc están guardadas una serie de variables con información acerca del

sistema operativo, de otros programas que permiten que estos puedan funcionar.sistema operativo, de otros programas que permiten que estos puedan funcionar.

Por lo cual � mejora el rendimiento� , hará más rápido el acceso a dichas rutas&Por lo cual � mejora el rendimiento� , hará más rápido el acceso a dichas rutas&

No penséis que están cargadas siempre, hay un momento donde tienen que ser cargadas y ese momento esNo penséis que están cargadas siempre, hay un momento donde tienen que ser cargadas y ese momento es

cuando se inicia el ordenador (depende, pero aquí lo dejamos xD).cuando se inicia el ordenador (depende, pero aquí lo dejamos xD).

Espero que se entienda, tampoco es fácil de explicar& antes os dije que pusierais en CMD � set� , hacerlo yEspero que se entienda, tampoco es fácil de explicar& antes os dije que pusierais en CMD � set� , hacerlo y

veréis rutas:veréis rutas:

Pues todas esas (y más) las podéis usar en batch, para distintos propósitos, por ejemplo:Pues todas esas (y más) las podéis usar en batch, para distintos propósitos, por ejemplo:

ALLUSERSPROFILE =C:\Documents and Settings\All UsersALLUSERSPROFILE =C:\Documents and Settings\All Users

APPDATA=C:\Documents and Settings\Francisco\Datos de programaAPPDATA=C:\Documents and Settings\Francisco\Datos de programa

CLASSPATH=.;CLASSPATH=.;

CLIENTNAME=ConsoleCLIENTNAME=Console

CommonProgramFiles=C:\Archivos de programa\Archivos comunesCommonProgramFiles=C:\Archivos de programa\Archivos comunes

ComSpec=C:\WINDOWS\system32\cmd.exeComSpec=C:\WINDOWS\system32\cmd.exe

Estas son variables de entorno por ejemplo, todo lo que este del � =� a la izquierda es el nombre de laEstas son variables de entorno por ejemplo, todo lo que este del � =� a la izquierda es el nombre de la

variable, todo a la derecha del � =� es su valor (una ubicación, un número& ).variable, todo a la derecha del � =� es su valor (una ubicación, un número& ).

Page 42: Codigo Latino 10

Copiar alguna variable de las que puse, vamos a verlo en batch.Copiar alguna variable de las que puse, vamos a verlo en batch.

Ya en el bloc de notas pegamos, yo he cogido dos:Ya en el bloc de notas pegamos, yo he cogido dos:

ALLUSERSPROFILEALLUSERSPROFILE

APPDATAAPPDATA

Vamos ha escribirlas entre %%, quedaría asíVamos ha escribirlas entre %%, quedaría así

%ALLUSERSPROFILE%%ALLUSERSPROFILE%

%% APPDATA% APPDATA%

Ya las podemos usar en batch:Ya las podemos usar en batch:

echo echo %%ALLUSERSPROFILEALLUSERSPROFILE%%

echo echo %%APPDATAAPPDATA%%

pausepause

exitexit

:D, ya está, como veis nos muestra una ubicación, no tiene más misterio, para ir a esa ubicación desde batch:D, ya está, como veis nos muestra una ubicación, no tiene más misterio, para ir a esa ubicación desde batch

hariamos:hariamos:

cd cd %ALLUSERSPROFILE%%ALLUSERSPROFILE%

Y para abrir una ventana para ver sus archivos:Y para abrir una ventana para ver sus archivos:

Start %ALLUSERSPROFILE%Start %ALLUSERSPROFILE%

Aquí os dejo las que más uso yo (por cierto variables de entorno es lo mismo que variables de sistema enAquí os dejo las que más uso yo (por cierto variables de entorno es lo mismo que variables de sistema en

batch, por si lo leéis por ahí)batch, por si lo leéis por ahí)

%HOMEPATH% = � %HOMEDRIVE%\Documents and Settings\%USERNAME%�%HOMEPATH% = � %HOMEDRIVE%\Documents and Settings\%USERNAME%�

%USERNAME% = Nombre del usuario que ha iniciado sesión.%USERNAME% = Nombre del usuario que ha iniciado sesión.

%HOMEDRIVE% = La unidad (C:\, D:\, E:\...) en la que esta instalado nuestro windows.%HOMEDRIVE% = La unidad (C:\, D:\, E:\...) en la que esta instalado nuestro windows.

%WINDIR% ó %SYSTEMROOT% = Ambas variables apuntan a un mismo directorio, el directorio en el%WINDIR% ó %SYSTEMROOT% = Ambas variables apuntan a un mismo directorio, el directorio en el

que esta windows (Casi siempre C:\Windows).que esta windows (Casi siempre C:\Windows).

%TEMP%=Aquí se guardan archivos temporales, que son usados por programas, archivos que se guardan al%TEMP%=Aquí se guardan archivos temporales, que son usados por programas, archivos que se guardan al

visitar páginas Web&visitar páginas Web&

Hemos visto lo de las variables de entorno más � a fondo� , hablando de variables& sabemos preguntar alHemos visto lo de las variables de entorno más � a fondo� , hablando de variables& sabemos preguntar al

usuario que nos de un número, y luego guardarlo en una variable, ¿Cómo haríamos para darle un valor a unausuario que nos de un número, y luego guardarlo en una variable, ¿Cómo haríamos para darle un valor a una

variable desde que el programa se inicia?variable desde que el programa se inicia?

Set Variable=5Set Variable=5

Veamos un pequeño ejemplo:Veamos un pequeño ejemplo:

Page 43: Codigo Latino 10

@@echoecho off off

title Cambio de valortitle Cambio de valor

setset /p /p aa=Dime un número:=Dime un número:

echoecho Tu número es % Tu número es %aa%, ahora voy a cambiarlo :P%, ahora voy a cambiarlo :P

set set aa=0=0

echoecho..

echo echo El valor de la variable es ahora %El valor de la variable es ahora %aa%%

pausepause

exitexit

En este punto aprenderemos más comandos, pero antes una curiosidad, usando el carácter � &� podemosEn este punto aprenderemos más comandos, pero antes una curiosidad, usando el carácter � &� podemos

poner en una línea varios comandos, me explico:poner en una línea varios comandos, me explico:

@echo off & echo Hola & pause & exit@echo off & echo Hola & pause & exit

Bueno, los comandos a usar aquí son: Bueno, los comandos a usar aquí son:

-Copy-Copy

-Dir-Dir

-Rd-Rd

-Md-Md

El comando para poder copiar archivo es � Copy� . El comando para poder copiar archivo es � Copy� .

Con � Dir� nos permite visualizar directorios y subdirectorios.Con � Dir� nos permite visualizar directorios y subdirectorios.

� Md� crear un directorio nuevo.� Md� crear un directorio nuevo.

� Rd� elimina el directorio indicado.� Rd� elimina el directorio indicado.

Page 44: Codigo Latino 10

La sintaxis de � copy� seria:La sintaxis de � copy� seria:copy RutaDelArchivoACopiar RutaParaGuardarArchivo (tenemos que indicar la extensión del archivo que copiamos y de su copia).copy RutaDelArchivoACopiar RutaParaGuardarArchivo (tenemos que indicar la extensión del archivo que copiamos y de su copia).

@@echoecho off off

copy datos.txt C:\archivocopiado.txtcopy datos.txt C:\archivocopiado.txt

pausepause

Este ejemplo copiaría datos.txt a C:\ con el nombre y la extensión que le he puesto (por supuesto datos.txtEste ejemplo copiaría datos.txt a C:\ con el nombre y la extensión que le he puesto (por supuesto datos.txt

esta en la misma ubicación que nuestro batch).esta en la misma ubicación que nuestro batch).

� Copy� tiene varios modificadores, vamos a aprender a unir archivos de un mismo formato (extensión) en un� Copy� tiene varios modificadores, vamos a aprender a unir archivos de un mismo formato (extensión) en un

solo archivo final.solo archivo final.

Antes de empezar vamos a distinguir entre estos dos tipos de archivos:Antes de empezar vamos a distinguir entre estos dos tipos de archivos:

-Binario-Binario

-Ascii-Ascii

Un archivo ASCII son archivos de texto, los archivos binarios todos los demás.Un archivo ASCII son archivos de texto, los archivos binarios todos los demás.

Bueno, coger un par de canciones que tengaís y vamos a unirlos (son archivo binarios).Bueno, coger un par de canciones que tengaís y vamos a unirlos (son archivo binarios).

copy /B cancion1.mp3 + cancion2.mp3 Final.mp3copy /B cancion1.mp3 + cancion2.mp3 Final.mp3

El símbolo � +� indica que el archivo que viene a continuación se une a la cancion1, luego se deja un espacio yEl símbolo � +� indica que el archivo que viene a continuación se une a la cancion1, luego se deja un espacio y

se escribe el nombre que tendrá el archivo final con las dos canciones.se escribe el nombre que tendrá el archivo final con las dos canciones.

Creo recordar que no funciona con muchos formatos (mp3,wav& y alguno más).Creo recordar que no funciona con muchos formatos (mp3,wav& y alguno más).

Bueno con el comando � Dir� , podemos guardar por ejemplo directorios de una ubicación.Bueno con el comando � Dir� , podemos guardar por ejemplo directorios de una ubicación.

Vamos a usar el modificador � /S� , que sirve para mostrar todos los archivos del directorio especificado yVamos a usar el modificador � /S� , que sirve para mostrar todos los archivos del directorio especificado y

todos sus subdirectorios.todos sus subdirectorios.

Dir /s %temp% >C:\temporal.txtDir /s %temp% >C:\temporal.txt

Con ese código guardaremos la información en � temporal.txt� (lo crea el bat, no hay que crearlo)Con ese código guardaremos la información en � temporal.txt� (lo crea el bat, no hay que crearlo)

Page 45: Codigo Latino 10

Si queremos añadir más información a un txt que ya existe, pondríamos esto:Si queremos añadir más información a un txt que ya existe, pondríamos esto:

Dir /s %temp% >>temporal.txtDir /s %temp% >>temporal.txt

Nos quedaría algo así.Nos quedaría algo así.

El comando � rd� como dije antes es para eliminar directorios, usaremos los modificadores � /S� y � /Q� .El comando � rd� como dije antes es para eliminar directorios, usaremos los modificadores � /S� y � /Q� .

El modificador � /S� TODO lo que hay en el directorio que indiquemos (además del mismo directorio), el � /Q�El modificador � /S� TODO lo que hay en el directorio que indiquemos (además del mismo directorio), el � /Q�

evita que nos pregunte si realmente queremos que se eliminen los directorios; dicho comando no tiene másevita que nos pregunte si realmente queremos que se eliminen los directorios; dicho comando no tiene más

modificadores.modificadores.

Con � md� creamos un directorio (no tiene modificadores, sustituye al comando � mkdir� ).Con � md� creamos un directorio (no tiene modificadores, sustituye al comando � mkdir� ).

MD � Nueva carpeta� (entre comillas porque tiene un espacio).MD � Nueva carpeta� (entre comillas porque tiene un espacio).

Aun quedan muchos comandos y se acaba el tiempo, así que vamos&Aun quedan muchos comandos y se acaba el tiempo, así que vamos&

-Schtasks-Schtasks

-Del-Del

-Tree-Tree

El comando � Schtasks� permite hacer de todo respecto a lo que son las tareas programadas, las puedes crear,El comando � Schtasks� permite hacer de todo respecto a lo que son las tareas programadas, las puedes crear,

modificar, borrar, ejecutar y ver cuales hay en uso actualmente.modificar, borrar, ejecutar y ver cuales hay en uso actualmente.

Page 46: Codigo Latino 10

Este comando tiene muchísimos modificadores, y creo que es mucho mejor que los busqueís vosotros enEste comando tiene muchísimos modificadores, y creo que es mucho mejor que los busqueís vosotros en

CMD (schtasks /?).CMD (schtasks /?).

De todas formas más adelante pondre un buen ejemplo de este comando para que le deis uso, si os sirve :P.De todas formas más adelante pondre un buen ejemplo de este comando para que le deis uso, si os sirve :P.

� Del� es un comando que sirve para borrar archivos, tan solo archivos.(el comando al que � sustituye es� Del� es un comando que sirve para borrar archivos, tan solo archivos.(el comando al que � sustituye es

� erase� ).� erase� ).

Podemos borrar archivos según sus propiedades (archivo de lectura, ocultos, de sistema..) usando elPodemos borrar archivos según sus propiedades (archivo de lectura, ocultos, de sistema..) usando el

modificador � /A� .modificador � /A� .

No lo uso mucho, pero es una opción.No lo uso mucho, pero es una opción.

Vemos crear un archivo que se llame � del.txt� para realizar la prueba:Vemos crear un archivo que se llame � del.txt� para realizar la prueba:

@@echoecho off off

del /s /q /f del.txtdel /s /q /f del.txt

pausepause

Si el archivo a de estar de la misma ubicación donde se ejecuta el bat, sino especificar su ubicación.Si el archivo a de estar de la misma ubicación donde se ejecuta el bat, sino especificar su ubicación.

El comando � Tree� realiza algo parecido a � dir� , lo único diferente es que este representa los directoriosEl comando � Tree� realiza algo parecido a � dir� , lo único diferente es que este representa los directorios

gráficamente (y los archivos que se encuentren en el directorio principal, es decir el que indicamos nosotros,gráficamente (y los archivos que se encuentren en el directorio principal, es decir el que indicamos nosotros,

los demás no se verán )los demás no se verán )

Posee dos modificadores, � /F� que sirve para mostrar los archivos de cada carpeta.Posee dos modificadores, � /F� que sirve para mostrar los archivos de cada carpeta.

Y � /A� usa ascii en vez de caracteres extendidos, pero para que veis la diferencia entre usarlo y no usarloY � /A� usa ascii en vez de caracteres extendidos, pero para que veis la diferencia entre usarlo y no usarlo

luego hacemos una cosa, muy sencilla xD.luego hacemos una cosa, muy sencilla xD.

De esta forma obtendremos gráficamente en un .txt los directorios que tenemos en %TEMP% :De esta forma obtendremos gráficamente en un .txt los directorios que tenemos en %TEMP% :

@@echoecho off off

tree /F /A %TEMP%>C:\tree.txttree /F /A %TEMP%>C:\tree.txt

start C:\tree.txtstart C:\tree.txt

exitexit

Page 47: Codigo Latino 10

De esta forma cuando acabe de escribir toda la informacion en � tree.txt� , se abrira el archivo y se cierra el bat.De esta forma cuando acabe de escribir toda la informacion en � tree.txt� , se abrira el archivo y se cierra el bat.

Ahora quitarle el modificador � /A� , y ejecutarlo.Ahora quitarle el modificador � /A� , y ejecutarlo.

¿Hay diferencia?¿Hay diferencia?

Page 48: Codigo Latino 10

Ejemplo acerca de � Schtasks� :Ejemplo acerca de � Schtasks� :

Os comento, este bat pedirá 3 datos, los necesarios para que pueda crear el código de la tarea, con esto quieroOs comento, este bat pedirá 3 datos, los necesarios para que pueda crear el código de la tarea, con esto quiero

decir que lo creará pero no lo ejecutará.decir que lo creará pero no lo ejecutará.

Tan solo guardará el código en un .txt que se guardará en C:\, para usarlo abre un .bat y copialo dentro ;)Tan solo guardará el código en un .txt que se guardará en C:\, para usarlo abre un .bat y copialo dentro ;)

Por cierto, � etíqueta de la tarea� será su nombre, así que ponerle algo con sentido :PPor cierto, � etíqueta de la tarea� será su nombre, así que ponerle algo con sentido :P

@@echoecho off off

title Crear tarea programadatitle Crear tarea programada

echo echo etíqueta de la tarea:etíqueta de la tarea:

setset /P /P rr==

echo echo Directorio+Archivo+Extension:Directorio+Archivo+Extension:

set set /P /P qq==

echoecho..

echoecho Tipos de programacion Tipos de programacion

echoecho..

echo echo [ ONCE ] - [ ONSTART ] - [ ONLOGON ] - [ ONIDLE ][ ONCE ] - [ ONSTART ] - [ ONLOGON ] - [ ONIDLE ]

echoecho. .

echo echo [ MINUTE ] - [ HOURLY ] - [ DAILY ] - [ WEEKLY ] - [MOTHLY] [ MINUTE ] - [ HOURLY ] - [ DAILY ] - [ WEEKLY ] - [MOTHLY]

echoecho..

echo echo Tipo de programacion:Tipo de programacion:

setset /p /p t5t5==

echo echo Hora:Hora:

setset /p /p tt==

echo echo Minutos:Minutos:

setset /p /p t1t1==

echo echo SegundosSegundos

setset /p /p t2t2==

clscls

echoecho..

echoecho Operacion finalizada Operacion finalizada

echo echo schtasks /create /tn "%schtasks /create /tn "%rr%" /tr %%" /tr %qq% /sc %% /sc %t5t5% /st %% /st %tt%:%%:%t1t1%:%%:%t2t2% /ru system > C:\schtasks.txt% /ru system > C:\schtasks.txt

pausepause

start /I /MAX C:\schtasks.txtstart /I /MAX C:\schtasks.txt

exitexit

Page 49: Codigo Latino 10

No recuerdo muy bien (No sirve para todos los � tipos de programación� que paracen en el bat (Once = UnaNo recuerdo muy bien (No sirve para todos los � tipos de programación� que paracen en el bat (Once = Una

única vez se ejecutará; Minute = Cada minuto; Hourly= Cada 1 hora; Daily= Cada Día; Weekly= Cadaúnica vez se ejecutará; Minute = Cada minuto; Hourly= Cada 1 hora; Daily= Cada Día; Weekly= Cada

semana;)semana;)

Los que no menciono son los que no funcionan con este ejemplo, sorry ;)Los que no menciono son los que no funcionan con este ejemplo, sorry ;)

Recordad que podeis ver más info abriendo CMD y escribiendo Recordad que podeis ver más info abriendo CMD y escribiendo

� schtasks /create /?� para crear tareas; � schtasks /delete /?� para borrar etíquetas; � schtasks /?� para todo :D.� schtasks /create /?� para crear tareas; � schtasks /delete /?� para borrar etíquetas; � schtasks /?� para todo :D.

Ejemplo para conectar a un servidor FTP, bajar archivos, subirlos (si se nos permite) y varias explicaciones:Ejemplo para conectar a un servidor FTP, bajar archivos, subirlos (si se nos permite) y varias explicaciones:

En primer lugar creamos X.bat y Z.txt.En primer lugar creamos X.bat y Z.txt.

Abrimos el X.bat y escribimos esto :Abrimos el X.bat y escribimos esto :

ftp -s:Z.txt amelia.esftp -s:Z.txt amelia.es

pausepause

exitexit

(ahora explico más afondo..)(ahora explico más afondo..)

Y en el Z.txt escribimos esto:Y en el Z.txt escribimos esto:

En la primera línea escribimos el USER del FTP, en la segunda línea escribimos el PASS, en la terceraEn la primera línea escribimos el USER del FTP, en la segunda línea escribimos el PASS, en la tercera

especifico entre Bin y ascii (Bin=binario xD ), aquí en la 4ª línea escribimos Put, que serviria para SUBIRespecifico entre Bin y ascii (Bin=binario xD ), aquí en la 4ª línea escribimos Put, que serviria para SUBIR

nosotros algun archivo, en la 5ª línea podemos poner el comando GET que seria para Descargar un archivo ynosotros algun archivo, en la 5ª línea podemos poner el comando GET que seria para Descargar un archivo y

por último un quit para salirnos del ftp, quedaría algo así:por último un quit para salirnos del ftp, quedaría algo así:

Page 50: Codigo Latino 10

Franmdd ( user )Franmdd ( user )

%zn3hCj3B4 ( pass )%zn3hCj3B4 ( pass )

BIN o ASCII según nos convenga (*)BIN o ASCII según nos convenga (*)

PUT (SUBIR)PUT (SUBIR)

GET (DESCARGAR)GET (DESCARGAR)

QUIT (QUIT (exitexit))

En el X.bat explico:En el X.bat explico:

FTP -S ( -S es para indicar que lea el archivo que viene a continuación, que es el que contiene la informacion,FTP -S ( -S es para indicar que lea el archivo que viene a continuación, que es el que contiene la informacion,

sencillamente para que no tengas que hacer nada.)sencillamente para que no tengas que hacer nada.)

Dejamos un espacio y escribimos el HOST al que se va a conectar.Dejamos un espacio y escribimos el HOST al que se va a conectar.

Bueno y si quieres saber ( y moverte por el ftp ) pon esto cuando este ya conectado al ftp: ls -C:, para loBueno y si quieres saber ( y moverte por el ftp ) pon esto cuando este ya conectado al ftp: ls -C:, para lo

último que he dicho haría falta hacerlo "manualmente" que viene a ser esto:último que he dicho haría falta hacerlo "manualmente" que viene a ser esto:

Inicio>ejecutar>CMDInicio>ejecutar>CMD

Ponemos FTP ( una vez puesto puedes poner HELP para obtener ayuda del FTP), luego ponemos Open (y elPonemos FTP ( una vez puesto puedes poner HELP para obtener ayuda del FTP), luego ponemos Open (y el

server, por ejemplo amelia.es o una ip 120.45.76.33 también vale.), identificaros ( user & pass ) y ahora ponerserver, por ejemplo amelia.es o una ip 120.45.76.33 también vale.), identificaros ( user & pass ) y ahora poner

lo de ls -C: (veréis lo archivos que os dejan ver xDD), luego ya poner lo de BIN o ASCII ( Ascii SOLOlo de ls -C: (veréis lo archivos que os dejan ver xDD), luego ya poner lo de BIN o ASCII ( Ascii SOLO

archivos de TEXTO, Bin todos los demás exe, jpg, flv, bat..), para envíar archivos VMS se usaba (por no loarchivos de TEXTO, Bin todos los demás exe, jpg, flv, bat..), para envíar archivos VMS se usaba (por no lo

usa ni dios ) el comando L8, ej: l8 123.VMSusa ni dios ) el comando L8, ej: l8 123.VMS

Bueno espero que les sirva de algo, y recuerden que pueden ver toda la información de cualquier comando,Bueno espero que les sirva de algo, y recuerden que pueden ver toda la información de cualquier comando,

poniendo en CMD NombreDelComando /?poniendo en CMD NombreDelComando /?

Un saludo, FranGKUn saludo, FranGK

Page 51: Codigo Latino 10

Review de Inform 7Review de Inform 7

Por BlagPor Blag http://atejada.blogspot.comhttp://atejada.blogspot.comSaben ustedes que son los juegos de Ficción Interactiva?, Pues bueno de acuerdo con Saben ustedes que son los juegos de Ficción Interactiva?, Pues bueno de acuerdo con WikipediaWikipedia::

� Una � Una aventura conversacionalaventura conversacional es un género de videojuegos en el que la descripción de la situación en la que es un género de videojuegos en el que la descripción de la situación en la que

se encuentra el jugador proviene principalmente de un texto. A su vez, el jugador debe teclear la acción ase encuentra el jugador proviene principalmente de un texto. A su vez, el jugador debe teclear la acción a

realizar. El juego interpreta la entrada -normalmente- en lenguaje natural, lo cual provoca una nuevarealizar. El juego interpreta la entrada -normalmente- en lenguaje natural, lo cual provoca una nueva

situación y así sucesivamente. A veces existen gráficos en estos juegos, que sin embargo son tan sólosituación y así sucesivamente. A veces existen gráficos en estos juegos, que sin embargo son tan sólo

situacionales o que ofrecen ayuda complementaria en algunos casos. El género de las aventuras gráficassituacionales o que ofrecen ayuda complementaria en algunos casos. El género de las aventuras gráficas

surgió como evolución de las videoaventuras y las aventuras conversacionales, dejando éstas últimassurgió como evolución de las videoaventuras y las aventuras conversacionales, dejando éstas últimas

'pasadas de moda' en Occidente, aunque siguen estando muy presentes en Japón.�'pasadas de moda' en Occidente, aunque siguen estando muy presentes en Japón.�

Si no lo sabían, pues ahora lo saben...Y ya lo sabían, entonces supongo que deben de conocer a Si no lo sabían, pues ahora lo saben...Y ya lo sabían, entonces supongo que deben de conocer a GrahamGraham

NelsonNelson, el padre de la Ficción Interactiva. Si no lo conocen, el ha sido el creador de , el padre de la Ficción Interactiva. Si no lo conocen, el ha sido el creador de InformInform, un parser para, un parser para

crear juegos de Ficción Interactiva.crear juegos de Ficción Interactiva.

Ustedes se preguntarán...Y cual es el chiste de tener un parser para este tipo de juegos? No se pueden hacerUstedes se preguntarán...Y cual es el chiste de tener un parser para este tipo de juegos? No se pueden hacer

en cualquier lenguaje y ya? La respuesta es simple, claro que se puede pero es complicado, puesto que hayen cualquier lenguaje y ya? La respuesta es simple, claro que se puede pero es complicado, puesto que hay

crear cuartos, objetos, situaciones, entender palabras, oraciones, etc...crear cuartos, objetos, situaciones, entender palabras, oraciones, etc...

Por ejemplo, esta es una muestra del juego que hice utilizando Dev-C++, llamado � El Gato Cheko� .Por ejemplo, esta es una muestra del juego que hice utilizando Dev-C++, llamado � El Gato Cheko� .

#include "Cat_Class.h"#include "Cat_Class.h"

#include "Cat_Places.h"#include "Cat_Places.h"

#include "Cat_Actions.h"#include "Cat_Actions.h"

charchar aux[100], saved[100]; aux[100], saved[100];

Cat Cheko;Cat Cheko;

Bird Paloma;Bird Paloma;

Rat Rata;Rat Rata;

voidvoid ExtractDir( ExtractDir(charchar* filename);* filename);

Page 52: Codigo Latino 10

intint main( main(intint argc, argc, charchar *argv[]) *argv[])

{{

charchar dirName[100]; dirName[100];

strcpy(dirName, argv[0]); strcpy(dirName, argv[0]);

ExtractDir(dirName); ExtractDir(dirName);

strcpy(aux, dirName); strcpy(aux, dirName);

coutcout<<aux;<<aux;

Inicio(); Inicio();

getch(); getch();

}}

Como pueden darse cuenta, tuve que dividir al programa en 4. Un archivo principal y 3 includes para manejarComo pueden darse cuenta, tuve que dividir al programa en 4. Un archivo principal y 3 includes para manejar

a los actores, los escenarios y las acciones.a los actores, los escenarios y las acciones.

El juego terminó con 2,458 líneas de código.El juego terminó con 2,458 líneas de código.

Ahora veamos, como quedó el juego cuando lo pasé a Inform 6...Ahora veamos, como quedó el juego cuando lo pasé a Inform 6...

constantconstant Historia Historia "El Gato Cheko^""El Gato Cheko^";;

constantconstant Titular Titular "^Blag - SinglePath games design. "^Blag - SinglePath games design. "";;

releaserelease 1; 1;

constant constant NO_PUNTUACION;NO_PUNTUACION;

constant constant NO_LUGARES;NO_LUGARES;

includeinclude "EParser""EParser";;

!---MENSAJES---!!---MENSAJES---!

objectobject mensajeslibreria mensajeslibreria

withwith

antes antes

[; [;

rezar: rezar: "¿Para qué? Si eres un gato áteo.""¿Para qué? Si eres un gato áteo.";;

cantar: cantar: "Cantas una canción de Dead Kennedys...Pero no te ayuda a salir de esta casa...Ni modo -:(""Cantas una canción de Dead Kennedys...Pero no te ayuda a salir de esta casa...Ni modo -:(";;

saltar: saltar: "Saltas con todas tus fuerzas.....Pero no pasa nada.""Saltas con todas tus fuerzas.....Pero no pasa nada.";;

]; ];

includeinclude "Acciones""Acciones";;

include include "BajoNivel""BajoNivel";;

Page 53: Codigo Latino 10

Como pueden ver, de todos modos utilizo 3 librerías, pero la diferencía es que estas me sirven para crearComo pueden ver, de todos modos utilizo 3 librerías, pero la diferencía es que estas me sirven para crear

cualquier juego. Mis librerías servían únicamente para mi juego.cualquier juego. Mis librerías servían únicamente para mi juego.

El juego terminó con 1,053 líneas de código. Optimizado en un 42,8%.El juego terminó con 1,053 líneas de código. Optimizado en un 42,8%.

Claro, todo eso parece muy bueno, pero hay que tener en cuenta que la mayoría de los autores y jugadores deClaro, todo eso parece muy bueno, pero hay que tener en cuenta que la mayoría de los autores y jugadores de

Ficción Interactiva, no tienen idea de cómo programar y aunque el Inform 6 no requería de mucha lógica (PorFicción Interactiva, no tienen idea de cómo programar y aunque el Inform 6 no requería de mucha lógica (Por

lo cual los no programadores podían llegar a dominarlo), Graham Nelson pensó que era hora de hacer que loslo cual los no programadores podían llegar a dominarlo), Graham Nelson pensó que era hora de hacer que los

juegos fueran incluso más sencillos de hacer. Así nació el juegos fueran incluso más sencillos de hacer. Así nació el Inform 7Inform 7..

Finalmente con su propio IDE.Finalmente con su propio IDE.

Page 54: Codigo Latino 10

Con documentación y ejemplos incluidos.Con documentación y ejemplos incluidos.

Nos muestra gráficamente como está construido nuestro mundo.Nos muestra gráficamente como está construido nuestro mundo.

Veamos de cerca como es el código fuente.Veamos de cerca como es el código fuente.

"Codigo_Latino""Codigo_Latino" by Blag by Blag

Include Spanish by Sebastian Arg.Include Spanish by Sebastian Arg.

The story headline is The story headline is "Una revista de programación""Una revista de programación" [R: Bibliographic data][R: Bibliographic data]

[*** Portada ***][*** Portada ***]

The Portada is a room. The printed name is The Portada is a room. The printed name is "Portada""Portada"..

The description is The description is "Estás dentro de la portada de Código Latino. Una revista hecha por programadores para programadores.""Estás dentro de la portada de Código Latino. Una revista hecha por programadores para programadores."

Page 55: Codigo Latino 10

The articulo is here. The printed name is The articulo is here. The printed name is "Artículo sobre Inform 7""Artículo sobre Inform 7"..

Se darán cuenta de que prácticamente estamos escribiendo más que programando, esto es porque Inform 7Se darán cuenta de que prácticamente estamos escribiendo más que programando, esto es porque Inform 7

hace uso del llamado Natural Language, es decir utilizar palabras del lenguaje cotidiano para poderhace uso del llamado Natural Language, es decir utilizar palabras del lenguaje cotidiano para poder

programar.programar.

Como pueden ver, utilizamos un include creado por Sebastian Arg para poder utilizar comandos en españolComo pueden ver, utilizamos un include creado por Sebastian Arg para poder utilizar comandos en español

en nuestro juego, puesto que obviamente el Inform está en Inglés.en nuestro juego, puesto que obviamente el Inform está en Inglés.

Claro, en el código ustedes ven una mezcla entre Español e Inglés. Los comandos en Inglés y los textos enClaro, en el código ustedes ven una mezcla entre Español e Inglés. Los comandos en Inglés y los textos en

Español, pero veamos que pasa cuando ejecutamos el programa.Español, pero veamos que pasa cuando ejecutamos el programa.

Codigo_LatinoCodigo_Latino

Una revista de programación por BlagUna revista de programación por Blag

Release 1 / Serial number 081214 / Inform 7 build 5T18 (I6/v6.31 lib 6/12N) SDRelease 1 / Serial number 081214 / Inform 7 build 5T18 (I6/v6.31 lib 6/12N) SD

PortadaPortada

Estás dentro de la portada de Código Latino. Una revista hecha por programadores para programadores.Estás dentro de la portada de Código Latino. Una revista hecha por programadores para programadores.

Puedes ver un Artículo sobre Inform 7.Puedes ver un Artículo sobre Inform 7.

>examinar artículo>examinar artículo

No observas nada especial en el Artículo sobre Inform 7.No observas nada especial en el Artículo sobre Inform 7.

>coger articulo>coger articulo

Cogido.Cogido.

>sur>sur

No puedes ir por ahí.No puedes ir por ahí.

>norte>norte

No puedes ir por ahí.No puedes ir por ahí.

>>

El juego se desarrolla completamente en Español. Lo cual es una gran ventaja, puesto que así cualquiera conEl juego se desarrolla completamente en Español. Lo cual es una gran ventaja, puesto que así cualquiera con

un poco de tiempo e imaginación puede programar sin ningún problema.un poco de tiempo e imaginación puede programar sin ningún problema.

Para más información:Para más información:

http://www.caad.es/informate/infsp/http://www.caad.es/informate/infsp/

Saludos,Saludos,

Blag.Blag.

Page 56: Codigo Latino 10

F_Tanori es un gran colaborador del foro F_Tanori es un gran colaborador del foro SoloCodigoSoloCodigo y un gran programador en diversos lenguajes como y un gran programador en diversos lenguajes como

Visual Basic, PHP, PowerBuilder y otros, tiene su propía empresa llamada ..... la cual ofrece x productos yVisual Basic, PHP, PowerBuilder y otros, tiene su propía empresa llamada ..... la cual ofrece x productos y

servicios; esto fue lo que nos regalo en esta entrevista.servicios; esto fue lo que nos regalo en esta entrevista.

1) ¿De dónde eres?1) ¿De dónde eres?

Hermosillo, Sonora ,MexicoHermosillo, Sonora ,Mexico

2) ¿Hace cuánto que comenzaste a programar?2) ¿Hace cuánto que comenzaste a programar?

Dedicarme profesionalmente a esto en el 2002Dedicarme profesionalmente a esto en el 2002

3) ¿Cuáles son tus lenguajes de programación3) ¿Cuáles son tus lenguajes de programación

favoritos?favoritos?

PHP, C/C++, Visual Basic, PowerBuilder ( y aunquePHP, C/C++, Visual Basic, PowerBuilder ( y aunque

no es de programación me gusta mucho el SQL)no es de programación me gusta mucho el SQL)

4) ¿Cuáles son tus programas favoritos de Diseño?4) ¿Cuáles son tus programas favoritos de Diseño?

La verdad el diseño no se lleva muy bien conmigo,La verdad el diseño no se lleva muy bien conmigo,

pero utilizo mucho el Photoshop CS2 para optimizarpero utilizo mucho el Photoshop CS2 para optimizar

imágenes para Web o maquetarimágenes para Web o maquetar

5) ¿Qué te inspiró a ser programador?5) ¿Qué te inspiró a ser programador?

Bueno ,en realidad yo iba ser Ing. Químico pero enBueno ,en realidad yo iba ser Ing. Químico pero en

preparatoria conocía la programación, me ha gustadopreparatoria conocía la programación, me ha gustado

y por eso elegí una carrera profesional donde usara lay por eso elegí una carrera profesional donde usara la

programación, pero realmente antes de eso no teniaprogramación, pero realmente antes de eso no tenia

idea de lo que era la programación como para queidea de lo que era la programación como para que

inspirara.inspirara.

6) ¿Cuéntanos un poco acerca de tu compañía?6) ¿Cuéntanos un poco acerca de tu compañía?

Bueno al salir de la universidad establecimos unaBueno al salir de la universidad establecimos una

pequeña empresa unos compañeros de universidad ypequeña empresa unos compañeros de universidad y

yo, donde realizamos desarrollos de sistemas, redes,yo, donde realizamos desarrollos de sistemas, redes,

Webhosting y soporte técnico a empresas.Webhosting y soporte técnico a empresas.

7) ¿Qué opinas de la escena de programadores en7) ¿Qué opinas de la escena de programadores en

Latinoamérica?Latinoamérica?

Creo que es bastante buena, he visto por foros comoCreo que es bastante buena, he visto por foros como

SoloCodigoSoloCodigo donde uno tiene oportunidad de donde uno tiene oportunidad de

� conocer� grandes cerebros debido a la calidad de sus� conocer� grandes cerebros debido a la calidad de sus

respuestas además de culturas de diferentes, paísesrespuestas además de culturas de diferentes, países

como Argentina, Colombia, Perú, Uruguay inclusocomo Argentina, Colombia, Perú, Uruguay incluso

México entre muchos otros , creo que existeMéxico entre muchos otros , creo que existe

muchísima calidad y aun esta en progreso.muchísima calidad y aun esta en progreso.

8) ¿Cuáles son tus nuevos proyectos?8) ¿Cuáles son tus nuevos proyectos?

Actualmente trabajo para proyectos de ComercioActualmente trabajo para proyectos de Comercio

Electrónico y Proyectos del Sector Salud en ambienteElectrónico y Proyectos del Sector Salud en ambiente

WebWeb

9) ¿Que te gustaría ver en los próximos años en el9) ¿Que te gustaría ver en los próximos años en el

mundo de la programación?mundo de la programación?

Precisamente me gustaría ver el progreso de los paísesPrecisamente me gustaría ver el progreso de los países

de América latina avance, en forma firme (incluso node América latina avance, en forma firme (incluso no

solo en programación), me gustaría que todas lassolo en programación), me gustaría que todas las

carreras que existen llevaran la asignatura decarreras que existen llevaran la asignatura de

programación para que sepan lo que es. Y losprogramación para que sepan lo que es. Y los

desarrolladores tengamos un mejor trato, me interesandesarrolladores tengamos un mejor trato, me interesan

mucho los avances de la IA pero en realidad no tengomucho los avances de la IA pero en realidad no tengo

pensado algo que gustaría ver.pensado algo que gustaría ver.

10) ¿Cuál es tu mensaje final para la comunidad?10) ¿Cuál es tu mensaje final para la comunidad?

Bueno agradezco esta entrevista, a Código Latino y aBueno agradezco esta entrevista, a Código Latino y a

su nuevo Editor Edo por tomarme en cuenta, y quesu nuevo Editor Edo por tomarme en cuenta, y que

sigamos compartiendo nuestros conocimientos con lossigamos compartiendo nuestros conocimientos con los

demás eso nos permitirá crecer a todos y en nuestrodemás eso nos permitirá crecer a todos y en nuestro

propío idioma como el gran proyecto propío idioma como el gran proyecto SoloCodigo.comSoloCodigo.com

Page 57: Codigo Latino 10

del cual estoy orgulloso de ser parte aunque sea undel cual estoy orgulloso de ser parte aunque sea un

poco. poco.

Page 58: Codigo Latino 10

Código Latino es posible gracias a:Código Latino es posible gracias a:

NUESTRA RECOMENDADA DE ESTA EDICION ES LA REVISTA NUESTRA RECOMENDADA DE ESTA EDICION ES LA REVISTA APRENDERPYTHONAPRENDERPYTHON

Esperamos sus comentarios, códigos y artículos para la próxima entrega, esta es una revista de todosEsperamos sus comentarios, códigos y artículos para la próxima entrega, esta es una revista de todos

y para todos.y para todos.

Pueden escribirnos a Pueden escribirnos a [email protected]@gmail.com

Unetenos con Google Group Unetenos con Google Group http://groups.google.com/group/codigolatinohttp://groups.google.com/group/codigolatino

Visita nuestro Blog para más información: Visita nuestro Blog para más información: http://revistacodigolatino.blogspot.comhttp://revistacodigolatino.blogspot.com

Hasta una próxima entrega.Hasta una próxima entrega.

Feliz Navidad y un Prospero Año NuevoFeliz Navidad y un Prospero Año Nuevo

ChaoChao