PowerShell – III
April 22nd, 2008 by JuanK
PowerShell
Entegas Anteriores:
Parte III – PowerShell para IT’s
En 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 seguir adelante.
Instalar PowerShell
Requerimientos
- Net Framework 2.0
- 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:
Link de descarga
Integració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 de muchos 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 acceder 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, ISA Server, 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 a hacer lo que queramos, el framework nos lo permite.
Beneficios para crear scripts
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 se mostraran algunas cosas interesantes de manera general.
Let’s begin!!!
Primeros scripts
Antes de empezar les recomiendo que tengan fresca la información de la entrega anterior, iremos al grano así que las explicaciones serán breves.
Nivel de seguridad
PowerShell 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:
- Unrestricted : todo script es permitido
- RemoteSigned : todo script local es permitido, pero si son remotos deben estar firmados digitalmente
- AllSigned : todo script debe estar firmado digitalmente
Se debe ejecutar este comando como administrador o en Windows Vista inicializando la aplicaion con elevación de privilegios.
Set-ExecutionPolicy RemoteSigned
1- Nombre de los procesos que tienen ventana con nombre no vacío
get-process | where-object{$_.MainWindowTitle -ne ""}
Aquí podemos observar el pipe ‘|’ que redirecciona la salida de get-process a where-object, dentro de where object ({}) utilizamos $_ 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 no sea igual (-ne =not equal) a vacío.
La salida arrojara algo parecido a esto:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
448 37 70908 85920 287 832,44 5964 Dreamweaver
302 26 64152 73592 181 36,07 5808 firefox
642 62 112576 128432 415 28,88 5616 Fireworks
638 40 65780 66892 239 25,18 5720 iexplore
796 74 41960 23080 234 40,39 4196 msnmsgr
783 81 59944 25084 353 31,26 2880 POWERPNT
283 14 56836 47896 562 0,67 1256 powershell
2- Procesos que comienzan por letras y tienen números, este es aparentemente mas complejo, pero es realmente básico la parte compleja son las expresiones regulares ("^[a-z]+[^0-9]+$") perobasicamente es solo un patrón de busqueda.
get-process | where-object{ $_.Name -match "^[a-z]+[0-9]+$"}
La salida
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
61 5 1988 4532 52 0,02 2164 MSCamS64
42 6 3984 6140 79 0,05 4152 rundll32
93 8 5200 8088 83 0,05 4432 rundll32
75 5 2184 4984 54 0,09 3964 splwow64
Prueben esta variante, es muy parecida pero hace lo contrario, trae procesos que comiencen por letras y que no tengan números.
get-process | where-object{ $_.Name -match "^[a-z]+[^0-9]+$"}
3- Generar la salida filtrada y direccionarla luego en un archivo html y luego adicionarle un estilo. Vamos a ponerle mas detallitos, tal ves se les complique para algunos IT’s pero para otros…. sera genial, debemos crear un archivo de texto con este contenido:
<style>
.fila_par
{ background-color:#FFFFCC;}
.fila_impar {background-color:#CCFFFF;}
</style>
<script type="text/javascript">
<!--
function AplicarCebra ()
{
tables = document.getElementsByTagName("table");
for ( i = 0; i < tables.length; i++)
{
ColoreaFilas(tables[i]);
}
}
function ColoreaFilas(tabla)
{
filasTabla = tabla.rows;
for(j=0; j < filasTabla.length; j++)
{
if(j%2==0)
{
filasTabla[j].className="fila_par";
}else
{
filasTabla[j].className="fila_impar";
}
}
}
// -->
</script>
<body onload="AplicarCebra();"/>
Guardemos esto en un archivo de texto llamado EstiloYScript.txt, básicamente hemos creado una pequeña hoja de estilos, 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, conformense con saber que es para crear una tabla en una pagina web y hacer que quede coloreada automáticamente.
Ahora desde la consola de PowerShell nos vamos a la carpeta donde guardamos el archivo (si… se hace igual que en una consola DOS, recuerden que PowerShell extiende las funcionalidades de los antiguos bat). Ahora vamos a aprender varias cosas:
Acá vemos como definir una variable ( head, para definirla se le pone $), y también vemos como leer un archivo y asignar sus contenidos a la variable:
$head =get-content "EstiloYScript.txt"
Ahora 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 comando select.
get-process |
where-object{ $_.Name -like "r*"} |
select-object id, processname, handles
La salida:
Id ProcessName Handles -- ----------- ------- 2556 rosetta_beta_5.96_windows_intelx86 52 3740 rosetta_beta_5.96_windows_intelx86 53 2520 Rtvscan 594 4152 rundll32 42 4432 rundll32 93
Espero que les este gustando, ahora veamos como redireccionar la salida en formato html
get-process |
where-object{ $_.Name -like "r*"} |
select-object id, processname, handles |
convertto-html
La salida html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>HTML TABLE</title>
</head><body>
<table>
<colgroup>
<col>
<col>
<col>
</colgroup>
<tr><th>Id</th><th>ProcessName</th><th>Handles</th></tr>
<tr><td>2556</td><td>
rosetta_beta_5.96_windows_intelx86
</td><td>52</td></tr>
<tr><td>5776</td><td>
rosetta_beta_5.96_windows_intelx86
</td><td>53</td></tr>
<tr><td>2520</td><td>Rtvscan</td><td>594</td></tr>
<tr><td>4152</td><td>rundll32</td><td>42</td></tr>
<tr><td>4432</td><td>rundll32</td><td>93</td></tr>
</table></body></html>
Como 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 >>:
get-process |
where-object{ $_.Name -like "r*"} |
select-object id, processname, handles |
convertto-html > htmlFile.html
Este 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:
get-process |
where-object{ $_.Name -like "r*"} |
select-object id, processname, handles |
convertto-html -head $head > htmlFile.html
Y al abrirlo desde el explorador… revísenlo uds mismos.
4- 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:
$a = get-wmiobject win32_process |
where-object {$_.name -eq "notepad.exe"}
$a.terminate()
5- 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 select para determinar que datos serán procesados en la salida.
get-wmiobject Win32_PerfFormattedData_PerfProc_Process |
select-object name, PercentProcessorTime |
where-object { $_.Name -eq "powershell"} |
format-table @{Label="Nombre del Proceso"; Expression={$_.name}},
@{Label="Tiempo de CPU"; Expression={$_.PercentProcessorTime}} -auto
La salida…
Nombre del Proceso Tiempo de CPU ------------------ ------------- powershell 0
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 enviar una excepción en un programa.
$a = "white"
if ($a -eq "red")
{"The color is red."}
elseif ($a -eq "white")
{"The color is white."}
else
{"The color is blue."}
Ejecutenlo…creo que es claro. Hagan pruebas cambiando el valor de la variable $a para que vean como cambia el flujo de las instrucciones.
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.
function ElColor($color)
{
"El color es: "
if ($color -eq "amarillo")
{ write-host "amarillo" -foregroundcolor "yellow” }
elseif ($color -eq "azul")
{ write-host "azul" -foregroundcolor "blue" -backgroundcolor "white”}
elseif ($color -eq "rojo")
{ write-host "rojo" -foregroundcolor "red”}
else
{ throw "No reconozco ese color”}
}
Con lo anterior hemos creado la función, ahora probemosla
ElColor("amarillo");
El color es: amarillo
ElColor("azul");
El color es:azul
ElColor("rojo");
El color es:rojo
ElColor("xxx");
No reconozco ese color
En línea:11 carácter:10
+ { throw <<<< "No reconozco ese color"}
8- Switches de funciones, ahora rescribamos la función de esta forma:
function ElColor($color, [switch] $comoWarning)
{
if($comoWarning)
{ write-warning "El color es: “ }
else
{ "El color es: “ }
if ($color -eq "amarillo")
{ write-host "amarillo" -foregroundcolor "yellow” }
elseif ($color -eq "azul")
{ write-host "azul" -foregroundcolor "blue" -backgroundcolor "white”}
elseif ($color -eq "rojo")
{ write-host "rojo" -foregroundcolor "red”}
else
{throw "No reconozco ese color”}
}
La función ahora recibe un parametro 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 seria igual al ejemplo anterior desde que no se use el switch. Para usar el switch se debe hacer de la siguiente forma:
ElColor("azul") -comoWarning
ADVERTENCIA: El color es:
azul
Bien eso es todo, como verán aunque esto es PowerShell para IT’s hubo bastante desarrollo, sin embargo lo que tengo preparadopara 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 comandos no se digiten en una consola sino desde una pagina web u otra aplicación?… pues de eso tratara la próxima entrega.
- Parte IV – PowerShell para Developers
Hasta la próxima.
- 10 Comentarios »
- Publicado en la categoría 'PowerShell'

Wordpress
10 comentarios to “PowerShell – III ”
April 22nd, 2008 at 1:00 am
[...] Parte III – PowerShell para IT’s [...]
April 22nd, 2008 at 1:01 am
[...] Parte III – PowerShell para IT’s [...]
April 22nd, 2008 at 8:33 am
Hola JuanK,
Excelente esta tercera entrega de powershell, de hecho super ilustrativa para conocer las bondades de powershell, en tan solo 25 minutos. Se hacen todas las prácticas entendiendo cada sentencia. Y lo mejor de todo, todas sirven jejejeje.
Bueno soy un IT, espero que la próxima entrega no me quede grande. De nuevo muchas gracias por tus aportes a la difusión del conocimiento tecnológico.
April 22nd, 2008 at 8:59 am
Con gusto, trataré de hacer entradas al blog respecto a todas las conferencias que he dictado acerca de este y muchos otros temas, pero te pido un poco de paciencia con las entregas pues últimamente por cuestiones laborales ando sin mucho tiempo.
Saludos,
April 22nd, 2008 at 5:00 pm
Cuales, siempre con la misma historia de que no tenes tiempo, además miré a ver si me vuelve a meter al msn o no se le ha pasado la vaina por su presidente???
PD. Excelente Entrega
April 22nd, 2008 at 5:14 pm
De verdad no tengo tiempo, publique este hilo anoche cerca de las 2 de la mañana, porque no tengo mas cuando. Y lo de msn ya te tengo en gmail pasame por ahi tu msn.
April 24th, 2008 at 9:59 pm
OPTIMIZACION DE CODIGO – Utilizando Generics…
OPTIMIZACION DE CODIGO Utilizando Generics Habitualmente en el proceso de desarrollo de nuestros procesos…
November 5th, 2009 at 11:28 am
Muy buen artículo, pero veo que no has tenido tiempo para publicar la cuarta parte
Saludos
June 10th, 2010 at 2:47 am
Please, publica la cuarta parte…
Gracias
September 23rd, 2011 at 5:50 pm
Muchas gracias por compartir informacion de mucho interes