windows power shell
DESCRIPTION
Este manual se puede encontrar en version web en: http://www.aprendeinformaticaconmigo.com/powershellTRANSCRIPT
Windows Powershell – 1-. Introduccion
Indice:
1. Introduccion
2. ¿Donde puedo conseguir Windows Powershell 1.0?
3. Requisitos.
4. Instalar Powershell en Windows XP.
5. Similitudes.
6. ¿Que puedo hacer con Powershell?
7. Bibliografia.
8. Windows Powershell en la web.
1.1 Introduccion:
Windows Powershell es un programa basado en linea de comandos que ayuda a los
administradores de una red a lograr una mejor y rapida administracion e implementacion en
su entorno, ya que, al hace uso de comandos interactivos y comandos base denominados
―cmdlets‖ (commandlets), permite una mayor eficiencia y menor trabajo por parte de los
profesionales o administradores de sistemas.
Powershell amplia las capacidades y caracteristicas de ―cmd‖, pero ademas incorpora la
posibilidad de escribir y ejecutar scripts de forma nativa y automatizar tareas facilmente.
Powershell no viene instalado por defecto. Esta disponible, o mejor dicho, se instala como
una actualizacion del sistema. Está disponible a partir de Windows XP Sp2, Windows
2003, Windows Vista y Windows 2008.
Con Powershell vamos a poder realizar tareas como examinar el registro del sistema,
navegar por las clases WMI y por supuesto configurar y administrar todo el entorno
Windows.
Lo que antes haciamos con Visual Basic Script lo vamos a poder hacer ahora con Windows
Powershell en muchas menos lineas de codigo.
1.2 ¿Dónde puedo conseguir Windows Powershell 1.0?
Para descargarnos Windows Powershell 1.0 podemos hacerlo desde este enlace.
Podemos encontrar las diferentes versiones disponibles hasta ahora para los diferentes
sistemas operativos soportados.
1.3 Requisitos:
Como ya hemos comentado anteriormente, Windows Powershell solo se puede instalar a
partir de Windows XP service pack 2.
Antes de instalarlo debemos tener instalado en el equipo la versión 2 del .Net Framework.
Windows Powershell se considera una actualizacion del sistema operativo Windows.
1.4 Instalar Powershell en Windows XP:
Aunque ya sabemos los sistemas operativos en los que podemos instalar Windows
Powershell y seguramente acabará instalado en la mayoria de los equipos que tenemos
(sino en todos), para hacer pruebas lo voy a instalar en mi windows XP, mas adelante ya lo
instalare en otros equipos.
En este enlace disponeis de un manual sencillo de instalación.
1.5 Similitudes:
No puedo decir que soy un entendido en Windows Powershell ni en linux y mas
concretamente en shell de bash (nada mas lejos de la realidad), pero lo poco que conozco
de ambas me lleva a sacar conclusiones y estas conclusiones son que Microsoft no queria
quedarse sin un buen sistema de comandos como el de Unix.
En cuanto os pongais manos a la obra podeis probar ciertos comandos de consola de linux
que tambien funcionan correctamente en Windows Powershell. Es cierto que son alias (ya
los estudiaremos mas adelante), pero esto quiere decir, creo yo, que Microsoft pretende
acercar un poco mas a la gente que se ve atraida por el shell de linux.
Como ejemplo os puedo comantar los comando ls y man. Probadlos.
1.6 ¿Que puedo hacer con Powershell?
Aunque todavía no he hecho mas que asomarme un poco a Windows Powershell, os puedo
decir que podemos realizar infinidad de tareas relacionadas con la administracion. Tened en
cuenta que en el momento que escribo esto, la version estable es la 1.0. Actualmente estan
trabajando en la 2.0 que esta en fase de pruebas, pero estoy seguro (por la pinta que tiene)
que la nueva versión traerá consigo muchas mejoras.
De momento nos centraremos en la version 1.0 y cuando saquen la 2.0 ya la estudiaremos a
fondo.
Otra de las cosas que me ha hecho fijarme en Windows Powershell ha sido que Vmware
sacó un Toolkit con diferentes cmdlets para gestionar los ESXs. Esto es algo que me llama
mucho la atención, pero antes de meternos con ello mejor aprendemos a movernos un poco
en el entorno de Powershell y sus entresijos, ya vermos mas adelante las diferentes
extensiones que le podemos añadir a Powershell.
1.7 Bibliografía:
Hay bastante informacion sobre Windows Powershell en formato libro, la mayoria (por no
decir toda) en ingles. Aunque esta seccion la ire ampliando a lo largo del tiempo os puedo
aconsejar algunos libros que os pueden ayudar:
Windows Powershell in action (Bruce Payette – 2007).
Windows Powershell step by step (Ed. Wilson – 2007).
Essential Powershell (Holger Schwichtenberg – 2008).
Windows Powershell scripting guide (Microsoft Press – 2008).
Windows Powershell programming (Wrox – 2008).
Tambien hay un manualillo o guia que a mi me ha gustado mucho ya que en unas pocas
hojas nos permite introducirnos y probar Powershell sin complicarnos mucho la vida. Nos
da una idea basica y ademas este manual o guia lo podemos descargar sin conse alguno
El manual lo podeis descargar desde aqui.
1.8 Windows Powershell en la web:
PowerShell Pro!
PowerShell.com
Powershell Rocks!!!
Powershell en Delicious
Powershell en Microsoft
Windows Powershell Blog
Powershell Code Respository
Venga, espero que os anime a meteros en este entorno.
Powershell – 2-. Empezando con
Powershell 1.0
2.1 Esto me recuerda a algo…
A primera vista es inevitable pensar que ―esto es igual que el CMD―…
En algunos aspectos esto es cierto. Podemos utilizar comando tipicos del ―CMD‖ como por
ejemplo ―cd‖ para cambiar de directorio o ―mkdir‖ para crear un directorio de la misma
forma en que lo haríamos en el ya clasico ―CMD―.
Ademas tenemos tambien disponibles utilidades mas ―modernas‖ como ―fsutil―.
Hay que decir que Powershell lo podemos utilizar de dos maneras diferentes. La primera es
de forma ―interactiva―. Esta forma es la que vamos a utilizar de momento y la otra ya la
veremos mas adelante, cuando tengamos mas conocimientos. En este modo introducimos
los comandos despues del prompt del sistema operativo.
Como va a ser costumbre a lo largo de esta serie de articulos sobre Powershell, los
diferentes apartados los intentare completar con ejemplos que lo clarifiquen un poco mejor.
Y para empezar con ellos que mejor que hacerlo desde el principio con unos ejemplos bien
sencillos:
Ejemplo 1:
Listar el contenido del directorio en el que nos encontramos.
dir
En la imagen podemos ver la forma en que nos muestra la información de la carpeta.
Ejemplo 2:
Posicionarnos en el directorio raiz del disco c: (si es que no estamos ya en el).
cd \
En este caso, si no dejamos espacio entre ―cd‖ y la barra invertida (\), no dara un error.
Osea que recordad que debemos dejar un espacio.
Ejemplo 3:
Crear el directorio ―power―.
mkdir power
Ejemplo 4:
Hacer un listado del directorio raiz de c:, pero esta vez se lo indicaremos.
dir c:\
Ahora podemos observar que está creado el directorio ―power―.
Ejemplo 5:
Cambiar al directorio ―power―.
cd power
Si queremos, podemos hacer otro listado del directorio actual y ver el resultado.
Como conclusion de este apartado sacamos que es muy parecido en aspecto al ―CMD―,
pero ya vermos que le podemos dar muchas mas funcionalidad que a este.
2.2 Command Completion:
Como podeis observar, el titulo de este apartado esta en ingles, no por nada, simplemente
por que no se como traducirlo exactamente. Podriamos llamarlo: ―completando comandos‖
o ―finalizando comandos―, pero bueno, seguro que vais a entender bien la explicacion que
voy a dar al respecto y os va a quedar muy claro.
Una caracteristica importante de la linea de comandos es esta (tab-completion). Esto nos
permite introducir un comando parcialmente y pulsar la tecla ―tabulador‖ para que
Powershell intente completar el resto del comando.
A parte de poder utilizar esta caracteristica con los comandos de Powershell, tambien
podemos utilizarla con ficheros. Si introducimos el comienzo de un fichero y pulsamos la
tecla ―tabulador―, Powershell completara el comando hasta donde pueda. Digo hasta
donde pueda porque es bastante normal que tengamos varios ficheros cuyo nombre
comience de la misma manera. En este caso, Powershell nos completaria hasta el ultimo
caracter antes de la coincidencia.
Podemos pulsar la tecla ―tabulador‖ mas veces para que nos vaya mostrando las diferentes
opciones que tenemos hasta que coincida con la que nosotros necesitamos.
La mejor forma de entender esto es haciendo. Manos a la obra…
Ejemplo 6:
Abrimos Windows Powershell y tecleamos ―get-―.
A continuacion pulsamos la tecla ―tab‖ una vez y nos percatamos que ahora nos muestra:
―Get-Acl―.
Si pulsamos nuevamente la tecla ―tab‖ nos mostrara: ―Get-Alias―.
Y si lo hacemos por tercera vez: ―Get-AuthenticodeSignature―.
Bueno, y asi todas las entradas que coincidan en que su comienzo se ―get-―. Al llegar al
ultimo comando y volver a pulsar ―tab―, volvera a empezar por el principio.
Os animo a que probeis por vuestra cuenta ya que es algo que utilizaremos mucho y cuanto
antes nos acostumbremos a esta caracteristica, mejor que mejor.
2.3 Historial de comandos introducidos:
Otra caracteristica muy util que incorpora ―Windows Powershell 1.0‖ es el ―historial de
comandos―.
El historial de comandos, por si no lo sabes ya, es una lista de los comandos que hemos
ido introduciendo en la sesion actual de ―Windows Powershell―. Imaginaos que teneis que
volver a ejecutar un comando que sabeis que habeis introducido hace poco y quereis volver
a introducirlo, sino completamente igual, moficiando algun parametro o argurmento. Para
esto nos va a venir muy bien lo que voy a explicar a continuacion.
Si hemos introducido en la sesion actual algun que otro comando, podemos pulsar la tecla
―flecha arriba― para nos muestre el comando que acabamos de introducir. Si pulsamos
varias veces mas nos ira mostrando los anteriores.
Si encontramos el que nos interesa y queremos volver a ejecutarlo ―tal cual―, simplemente
pulsamos ―Intro―. Si por el contrario tenemos que modificar algun parametro o argumento,
basta con hacerlo moviendonos por el comando con las teclas ―flecha izquierda‖ y ―flecha
derecha―, borrar lo que no nos interesa e introducir lo que queremos añadir en el lugar
adecuado y pulsar ―Intro‖.
F7.
Si pulsamos F7 nos abrira un ―pop-up‖ en la ventana de Powershell en la que podemos ver
una lista de los ultimos comandos instroducidos en la sesion actual. Para movernos por esta
lista utilizaremos las teclas ―flecha arriba‖ y ―flecha abajo―.
Una vez posicionados en el comando que nos interesa, pulsamos ―intro―.
Get-History
Todavia no hemos visto los commandlets de Powershell, pero como encaja en este
apartado, no puedo dejar de mencionar este, aunque ya lo veremos en profundidad mas
adelante.
Ahora vale simplemente con que sepamos lo que hace. Y lo que hace es mostrarnos la lista
de los ultimos 32 comandos introducidos en la sesion actual. En los ejemplos que pondre
mas adelante seguro que os queda mas claro, pero ya os digo que lo veremos en
profundidad en otro articulo posterior. Para comprobar lo que hace, basta con introducir
―get-history‖ en la linea de comandos de Powershell.
2.4 Formato de los comandos en Powershell.
En todo shell que nos podamos encontrar, los comandos tienes un formato especifico para
que puedan ser interpretados correctamente. Y claro, Powershell no iva a ser diferente.
Como ya comente en el articulo anterior, los comandos en Powershell se llaman ―cmdlets‖
(commandlets).
Normalmente un commandlet consiste en tres partes, aunque yo voy a añadir una cuarta:
1. Un verbo. 2. Un nombre. 3. Uno o varios parametros (opcional). 4. Uno o varios argumentos (opcional).
El verbo y el nombre estan separados por el caracter ―guion‖ (-) y los parametros y
argumentos por el caracter ―espacio―. mas o menos podria quedar así:
verbo-nombre -parametro1 argumento1 -parametro2 argumento2
Espero que se vea bien, pero no os preocupeis que a medida que avancemos, entenderemos
mejor todo este asunto.
Como ejemplos:
get-history
Nos muestra un lista de los ultimos comandos ejecutados (por defecto 32).
get-history -count 10
Este nos muestra los ultimos 10 comandos introducidos en la sesion actual. Podemos
observar que en este caso hemos introducido el parametro ―-count‖ y el argumento 10.
get-history 7
Muestra solo el comando numero 7, el que tiene el ID 7. Como ya he dicho antes, hay
parametros que se asumen por defecto y auque no los escribamos en la consola, es como si
lo hicieramos.
El comando anterior podria haberse escrito:
get-history -id 7
Y el resultado seria el mismo.
Para hacernos una idea, creo que es suficiente por ahora. Ya tendremos tiempo mas
adelante de ajecutar commandlets mas complejos.
Seguro que os habeis dado cuenta, pero por si acaso os lo comento yo. El uso de
mayusculas y minusculas es indiferente. Da igual que igual da.
————————————–
Venga, por ahora ya tenemos para practicarnos un poco con esto. Probad lo que hemos
visto y si teneis alguna duda me la comantais, a ver si yo os puedo ayudar.
A pasarlo bien!!
Powershell – 3 – Obtener ayuda
La ayuda es muy importante en el mundo en el que nos movemos y Windows Powershell
tiene un buen sistema de ayuda a la vez que sencillo.
Vamos a ver como obtener ayuda en este entorno.
3.1- El cmdlet get-help
El commmandlet que Powershell pone a nuestra disposicion para obtener ayuda es: ―get-
help―.
Si introducimos ―get-help‖ en la consola de Powershell, nos mostrara un resumen de la
utilizacion de este cmdlet.
Podemos probarlo:
Esto es un resumen del commandlet ―get-help―, si queremos que la ayuda este un poco mas
detallada utilizaremos el parametro ―-detailed‖ de la siguiente forma:
> get-help -detailed
o
> get-help -detailed get-help
En el commandlet anterior podemos identificar tres partes. Primero el commandlet ―get-
help‖ que es el comando en si. Despues el parametro ―-detailed‖ que lo que hace es
modificar la salida de ―get-help‖ y en este caso lo que hace es darnos una version de la
ayuda mas detallada con informacion adicional. Añadiendo este parametro podemos
obtener un resultado mas amplio que si no lo utilizamos.
Y despues de ―-detailed‖ escribimos el argumento, que es de lo que queremos obtener
ayuda. En este caso queremos obtener ayuda del cmdlet ―get-help―. Si no lo ponemos nos
dará ayuda de la ayuda, que es lo mismo.
Para comparar el resultado de ―get-help‖ con y sin el parametro ―-detailed‖ podemos hacer
la prueba. Antes lo hemos hecho sin detailed, pues ahora lo vamos a hacer con el:
Observamos que en este ultimo caso, la ayuda es bastante mas completa. You suelo utilizar
siempre el parametro ―-detailed―.
Como ultima parte del commandlet ―get-help‖ debemos añadir el cmdlet o concepto del
que queremos ayuda. En el ejemplo que hemos visto antes, le hemos indicado que
queriamos ayuda precisamente del comando ―get-help‖ (get-help -detailed get-help―).
No, no me he equivocado. Ademas de poder obtener ayuda de los diferentes commandlets
de Windows Powershell, tambien podemos hacerlo con conceptos diferentes a comandos.
Por ejemplo, para obtener ayuda sobre los operadores aritmeticos en Windows Powershell
pondremos:
> Get-help about_arithmetic_operators
3.2- Parametros de Get-help.
Tenemos disponibles varios parametros para usar junto con el cmdlet ―get-help‖. Los mas
insteresantes pueden ser:
-name <String>
Muestra ayuda sobre un tema conceptual o cmdlet que le especifiquemos. <String>
representa el nombre de un cmdlet o un concepto. Se premite el uso de caracteres comodin.
Este parametro es opcional, Esto quiere decir que si queremos indicarlo lo haremos y sino,
pues no.
ejemplo: get-help -name get-command (muestra ayuda del cmdlet ―get-command‖
-detailed <SwitchParameter>
Este ya lo hemos visto antes. Muestra informacion adicional.
-examples <SwithcParameter>
Muestra unicamente el apartado de ejemplos de la ayuda de un cmdlet o concepto. Este
apartado de la ayuda de Powershell es muy interesante a la vez que util.
ejemplo: get-help -examples get-help (muestra los ejemplos de la ayuda del cmdlet ―get-
help―)
-full <SwitchParameter>
Muestra la ayuda completa de un cmdlet.
Hay varios parametros mas diponibles pero para hacernos una idea nos vale de momento
con estos. De todas formas, como ya he comentado antes, podemos obtener informacion
sobre el comando ―get-help‖ de la siguiente forma: get-help -detailed get-help.
3.3- Otras formas de obtener ayuda.
En este apartado, solo comentar las funciones: help y man. Ya veremos mas adelante lo que
son las funciones y los Alias, pero por ahora nos quedamos con que existen y si queremos
podemos probarlas:
> man
> help
Tambien disponemos de ayuda en forma de ficheros de texto en el directorio en el que esta
instalado Windows Powershell que normalmente es: %windir%\system32\windows
powershell\1.0\
Ahora deberiamos tener un poco mas claro el tema de como obtener ayuda en Windows
Powershell.
De todas formas, ya sabeis, si teneis alguna duda sobre este u otro tema que se trata en este
blog, pedeis enviarme un e-mail a: oscar(arroba)aprendeinformaticaconmigo.com
Venga, a pasarlo bien y nos vemos en el proximo articulo.
Otros articulos sobre Powershell:
1-. Introduccion. 2-. Empezando con Powershell 1.0
Powershell – 4 – Get-command
Ya hemos comentado en articulos anteriores sobre Windows Powershell lo que son los
commandlets. Hoy vamos a ver uno de ellos que nos facilitara en un momento dado el
trabajo.
4.1- Get-command
Este cmdlet obtiene informacion basica acerca de los cmdlets y otros elementos de
comandos de Windows Powershell como archivos, funciones y proveedores de Windows
Powershell.
Parametros:
-name
Obtiene informacion unicamente de los cmdlets o elementos de comando con el nombre
especificado. Se permite el uso de caracteres comodin.
-verb
Obtiene informacion basica acerca de los commandlets con nombres que incluyan el verbo
especificado.
-noun
Obtiene los cmdlets con nombres que incluyan el sustantivo especificado.
Hay varios parametros mas, pero de momento nos vale con estos.
Vamos a praticar un poco con algun ejemplo:
Ejemplo1:
> get-command
Como podemos ver en la captura, este comando nos muestra una lista de todos los
comandos que tenemos disponibles en Windows Powershell. Los ordena en varias
columnas.
Ejemplo2:
> get-command -verb set
Nos muestra los cmdlets con el verbo ―set‖.
Ejemplo 3:
> get-command -noun file
Este nos muestra los cmdlets cuyo nombre tiene la palabra ―file‖.
Ejemplo 4:
> get-command -name set-*
Muestra todos los cmdlets que comiencen por ―set-‖. En este caso, la salida esa la misma
que si hubieramos puesto: ―get-command -verb set‖.
Dado que el parametro ―-name‖ es opcional, tambien podemos poner: ―get-command set-*‖
Por ahora ya es suficiente sobre este cmdlet.
Es bueno que vayamos practicando lo que vamos aprendiendo hasta ahora.
Venga, a pasarlo bien.
Otros articulos sobre Powershell:
1-. Introduccion. 2-. Empezando con Powershell 1.0. 3-. Obtener ayuda.
Powershell – 5 – Tuberias y redireccion
5.1- Tuberias o canalizacion.
Esto seguro que os suena a todos los que tengais algun conocimiento de linux, ¿que no?
Al igual que linux, Powershell permite combinar dos o mas comandos en uno solo.
Tuberia o canalizacion, cualquiera de ellos nos sirve para entendernos.
Cuando se combinan comandos en una canalizacion, se pasan datos entre si en forma de
objetos. El primer comando devuelve uno o mas objetos a traves de la canalizacion al
segundo comando. El segundo comando procesa estos objetos y a continuacion pasa
objetos nuevos o revisados al tercer comando. Este proceso continua hasta que se hayan
ejecutado todos los comandos de la canalizacion.
Para encadenar comandos en una canalizacion, tenemos que especificar cada comando en
el orden que tiene que ejecutarse. Los comandos los separamos entre si con el simbolo (“|”
barra vertical). Los comandos se ejecutaran de izquierda a derecha.
Ejemplo 1:
>get-help * | get-help -detailed
El primer comando nos mostraria toda la ayuda, pero le pasamos el resultado al segundo
comando y al final nos mostrara toda la ayuda, pero detallada. Ya se que no es un buen
ejemplo pero como todavia no hemos visto otros cmdlets… No os preocupes que esto lo
vamos a utilizar mucho a partir de ahora.
Ejemplo 2:
>get-command -verb set | get-help -examples
Si pensamos un poco con detenimiento vemos que el primer comando nos mostraria los
comandos cuyo verbo fuese ―set―. Vale, ahora le pasamos esta lista al segundo comando
que hace que nos muestre la ayuda, pero solo el apartado ―examples‖ de cada una.
Si juntamos todo esto tenemos que finalmente nos mostrara por pantalla el apartado
―examples‖ de la ayuda solo de aquellos cmdlets cuyo verbo sea ―set―.
5.2- Redireccion:
Redireccion de la salida desde Windows Powershell a archivos de texto.
De manera predeterminada, Powershell dirige la salida de comandos a la pantalla de
Powershell. De todas formas, podemos modificar este comportamiento dirigiendo la salida
a un archivo de texto.
Para hacer esto, tenemos que utilizar el simbolo ―mayor que‖ (>) y el nombre del archivo
al final.
Ejemplo 1:
>get-help -detailed get-command > c:\power\docs\get-command.txt
Esto comando crea un fichero de texto en la ruta especificada cuyo contenido es la ayuda
del cmdlet get-command de Powershell.
Ahora podemos revisar el fichero todas las veces que queramos e incluso imprimirlo si es
nuestro deseo.
Ejemplo 2:
>get-command -verb get > c:\power\listadoget.txt
Crea un fichero de texto cuyo contenido es el listado de todos los cmdlets de powershell
cuyo verbo coincida con ―get―.
5.3- Anexar:
Al redireccionar la salida a un fichero de texto, si este fichero ya existe, se eliminara lo que
habia en el para introducir el nuevo texto que le enviamos.
Si no queremos hacer esto y lo que queremos es añadir nuevos datos al fichero,
utilizaremos el simbolo ―>>―. con esto la salida que le enviamos se añadira al final del
fichero.
Ejemplo 1:
> get-command *file > c:\power\listadofile.txt
Con esto creamos un fichero de texto que contiene:
Ahora vamos a añadir a este fichero, otro listado:
>get-command *item >> c:\power\listadofile.txt
Y vemos el resultado en el fichero de texto:
Se nota el añadido, ¿no?
Bueno, pues por hoy ya hemos tenido bastante, otro dia mas…
A pasarlo bien!!
Otros articulos sobre Powershell:
1-. Introduccion.
2-. Empezando con Powershell 1.0.
3-. Obtener ayuda.
4-. Get-Command.
Powershell – 6 – Get-childitem
6.1- Get-childitem
Ya comente (creo) en un articulo anterior sobre Powershell, que podiamos utilizar
comandos del ―cmd‖ como ―dir―. Pues bien, si utilizamos ―dir‖ en Powershell es gracias a
que esta definido como alias del cmdlet ―Get-childitem‖ que es el cmdlet que Powershell
ha definido para estas funciones.
Entonces, como ya sabremos, Get-childitem muestra los elementos y elementos
secundarios de una o varias ubicaciones especificadas. Una ubicacion puede ser una
ubicacion del sistema de archivos, como un directorio o una ubicacion expuesta por un
proveedor como un subarbol del registro o un almacen de certificados.
Sintaxis
Get-Childitem -parametro argumento1, argumento2 -parametro2 argumento1 …
Parametros
-Path <String[]>
Especifica una o mas rutas de ubicaciones. Se permite el uso de caracteres comodin. La
ubicacion predeterminada es el directorio actual (.). Este parametro es opcional.
-include <String[]>
Recupera unicamente los elementos especificados. Escribir en este apartado un patron
como ―*.exe‖.
-exclude <String[]>
Omite los elementos especificados. Escribiremos tambien un patron.
-name <Switchparameter>
Recupera unicamente los nombres de los elementos de la o las ubicaciones.
-recurse <Switchparameter>
Obtiene los elementos y elementos secundarios de las ubicaciones especificadas. Este
parametro es muy util.
Tenemos disponibles algun que otro parametro mas para utilizar con Get-Childitem. Si
quieres profundizar mas en ello, consulta la ayuda que ofrece Powershell sobre este
cmdlet: get-help -detailed get-childitem.
6.2- Ejemplos.
Ejemplo 1:
>get-childitem
Nos muestra un listado de la ubicacion actual. Muestra todos los elementos que haya en
ella.
Ejemplo 2:
>get-childitem -recurse
Este comando recupera los elementos del directorio actual y de sus subdirectorios.
Podemos definir mejor el listado utilizando un patron.
Ejemplo 3:
>get-childitem -include “*.txt” -recurse
Igual que el ejemplo anterior, pero solo mostrara los ficheros con extension ―txt‖.
Ejemplo 4:
>get-childitem -path c:\windows -include *.txt -recurse
Este comando es mas completo que los ateriores. Nos muestra un listado de los ficheros con
extension ―txt‖ que hay en el directorio ―c:\windows‖ y en sus subdirectorios.
Ejemplo 5:
>get-childitem -path c:\, d:\ -include “*.txt” -recurse > c:\power\listado.txt
El proceso tarda un rato, ya que tiene que pasar por todo el disco C y el D.
A continuacion podeis ver un fragmento del fichero que ha generado.
Este hace un listado de los ficheros con extension ―txt‖ que hay en los discos C y D y nos
crea un fichero ―listado.txt‖ con este contenido.
6.3- Alias de Get-Childitem
Get-childitem tiene tres alias definidos en Powershell, que son:
gci
ls
dir
Podeis probarlos de la misma forma que get-childitem.
Bueno, espero que hasta ahora se entienda la mayor parte de lo que voy explicando. Ya se
que no soy ningun fenomeno de hacer tutoriales y menos de la enseñanaza, pero el objetivo
es ofrecer una base para que luego, cada uno, profundice lo que le apetezca.
Venga, lo dejamos por hoy.
A pasarlo bien!!
Otros articulos sobre Powershell:
1-. Introduccion.
2-. Empezando con Powershell 1.0.
3-. Obtener ayuda.
4-. Get-Command.
5-. Tuberias y redireccion.
Powershell – 7 – Formateando la salida
En este articulo vamos a ver unos cmdlets que nos van a servir para formatear la salida de
otros cmdlets.
Normalmente, siempre vamos a utilizar estos cmdlets para manejar el resultado de otro
cmdlet. La verdad es que estos commandlets por si solos no tienes mucha utilidad.
7.1- Format-List (fl)
Este commandlet aplica a la salida el formato de una lista de propiedades en la que cada
propiedad aparece en una linea diferente. Ya que cada elemento dispone de mas espacio en
una lista que en una tabla, Powershell muestra mas propiedades del objeto en un lista y hay
menos posibilidades de que se trunquen los valores de las propiedades.
Para conocer todas las propiedades del objeto, podemos utilizar el cmdlet:
> cmdlet | Format-List *
Parametros
-property <object[]>
Especifica las propiedades del objeto que se va a mostrar y el orden en el que van a
aparecer. Se pueden utilizar caracteres comodin.
Este parametro es opcional pero si se omite, las propiedades que aparezcan dependeran del
objeto que se esta mostrando.
Los parametros ―-property‖ y ―view‖ no se pueden utilizar en el mismo comando.
-view <String>
Especifica el nombre de una vista o un formato de lista alternativo.
Hay mas parametros disponibles para este cmdlet. Para obtener mas informacion sobre
ellos:
>get-help -detailed format-list
Ejemplo1:
>get-childitem | format-list
Podemos ver como es el formato que genera ―format-list―.
Para compararlo, ahora podemos ejecutar:
>get-childitem
Se nota la diferencia, ¿no?
Ejemplo2:
>get-childitem | format-list -property name, length
El resultado es un listado formateado en el que se muestran las propiedades name y length
(el que las tenga) de los elementos pasados por el cmdlet get-chilitem.
Ejemplo 3:
>get-childitem | format-list -property name > c:\power\listadoformat-list.txt
En este caso utilizamos el simbolo ―>‖ que ya vimos para redireccionar la salida a un
fichero de texto.
En estos ejemplos utilizamos get-childitem. Este cmdlet tiene unas propiedades pero
recordad que cada cmdlet tiene sus propiedades osea que si el commandlet que pasa la
informacion es otro, tenemos que utilizar las propiedades de este cmdlet.
No os preocupeis por que vamos poco a poco. Mejor asi…
7.2- Format-wide (fw)
Aplica a los objetos el formato de una tabla ancha en la que se muestra unicamente una
propiedad de cada objeto. Podemos utilizar el parametro ―property‖ para determinar que
propiedad se va a mostrar.
Parametros
-property <objetct[]>
Especifica las propiedades del objeto que se van a mostrar. Permite el uso de caracteres
comodin. Es opcional. Los parametros ―property‖ y ―view‖ no pueden utilizarse en el
mismo comando.
-autosize <SwitchParameter>
Ajusta el tamaño de columna y el numero de columnas en funcion del ancho de los datos.
De forma predeterminada, el tamaño y el numero de columnas viene determinado por la
vista. Los parametros ―autosize‖ y ―column‖ no pueden usarse en el mismo comando.
-column <int>
Especifica el numero de columnas de la presentacion.
-groupby <object>
Da formato a la salida de los grupos en funcion de un valor o de una propiedad compartida.
Indicar una expresion o una propiedad de la salida.
-inputobject <psobject>
Especifica los objetos a los que se les va a dar formato. Tenemos que indicar la variable que
contiene los objetos o escribir un comando u objeto que obtenga los objetos.
Para obtener mas informacion sobre estos y otros parametros del cmdlet ―format-wide―,
escribid el comando:
>get-help -detailed format-wide
Ejemplo 1:
>get-childitem
>get-childitem | format-wide
Vemos la diferencia a poco que nos fijemos…
Ejemplo 2:
>get-childitem | format-wide -column 3
En este caso le indicamos que la salida la formatee en 3 columnas. Se ve, ¿no?
Ejemplo 3:
>get-childitem -path c:\ -include “*.txt” -recurse | fw -property name -column 3
Este comando nos muestra en pantalla todos los ficheros del disco C con extension ―txt―.
La salida sera solo de los nombres de los ficheros y en 3 columnas.
Recordemos que fw es el alias de Format-Wide.
7.3- Format-Table (ft)
Aplica a la salida de un comando el formato de una tabla con las propiedades seleccionadas
del objeto en cada columna.
Tambien se puede usar format-wide para agregar las propiedades calculadas a un objeto
antes de mostrarlo. Para ello deberemos usar el parametro property para especificar una
tabla hash. La tabla hash puede contener 2 claves: label y expression.
Parametros
-property <object[]>
Especifica las propiedades del objeto que se va a mostrar y el orden en el que van a
aparecer. Se permite el uso de caracteres comodin.
-autosize <SwitchParameter>
Ajusta el tamaño de columna y el numero de columnas en funcion del ancho de los datos.
Otros parametros: hidetableheaders, groupby, wrap, view, force, inputobject, expand,
displayerror, showerror.
Par obtener mas informacion sobre format-wide, escribiremos en la linea de comandos de
Powershell: get-help -detailed format-table.
Ejemplo 1:
>get-childitem | format-table
En este caso podemos ver que la salida es la misma que si no hubiesemos utilizado format-
wide.
Ejemplo 2:
>get-childitem -path c:\power -include “*.txt” -recurse | format-table -property name,
length
Ahora si que vemos la diferencia ya que solo vemos las propiedades name y length.
Bueno, hasta aqui llega el articulo sobre el formateo de la salida en Windows Powershell.
Disponemos de otro cmdlet relacionado con este tema: format-custom, pero de momento no
lo vamos a comentar. Creo que con lo que hemos visto tenemos suficiente para practicar un
poco con este asunto.
Venga, a pasarlo bien!!!
Otros articulos sobre Powershell:
1-. Introduccion. 2-. Empezando con Powershell 1.0. 3-. Obtener ayuda. 4-. Get-Command. 5-. Tuberias y redireccion. 6-. Get-childitem.
Powershell – 8- Get-member
8.1- Get-member
El cmdlet get-member obtiene informacion acerca de los miembros de los objetos.
Recordemos que todo lo devuelto por un commmandlet es un objeto. Podemos utilizar get-
member para conocer los metodos y propiedades de los objetos.
Cuando usamos el cmdlet get-member junto con get-childitem en el sitema de ficheros,
devuelve una lista de todos los metodos y propiedades disponibles para trabajar con el
objeto.
Si canalizamos la entrada a get-member, se genera un objeto ―memberdefinition‖ para
cada objeto de entrada. Por ejemplo, si canalizamos la salida de get-childitem a get-
member en un directorio que contenga al menos un subdirectorio y un archivo, devolvera
dos objetos memberdefinition. Uno de los objetos contendra informacionsobre el objeto
―FileInfo―, mientras que el otro contendran informacion sobre el objeto ―DirectoryInfo―.
Get-member solo genera dos objetos memberdefinition, independientemente del numero
de ficheros y directorios.
Si utilizamos get-member a traves del parametro InputObject, devolvera un unico objejo
memberdefinition que representa el unico objeto de entrada.
Para recuperar informacion sobre miembros estaticos tendremos que utilizar el parametro -
static.
Parametros
-name <String[]>
Especifica los nombres de los miembros sobre los que se va a recuperar informacion.
-inputobject <psobject>
Especifica los objetos sobre los cuales se va a recuperar informacion.
Si utilizamos la canalizacion para recuperar informacion sobre el contenedor, tenemos que
agregar una coma (,) a la entrada canalizada.
-membertype <psmembertype>
Indica el tipo de miembros sobre los que se va a recuperar informacion.
Los tipos de miembros validos son: Aliasproperty, Codeproperty, Property, Noteproperty,
Scriptproperty, Properties, PropertySet, Method, Codemethod, Scriptmethod, Methods,
Parametrizedproperty, Memberset y All.
-static <Switchparameter>
Especifica las propiedades y los miembros estaticos que deben recuperarse.
Ejemplo 1:
>get-childitem | get-member
Este comando nos muestra todos los atributos posibles de los miembros del sistema de
ficheros. En mi caso me da informacion sobre los objetos FileInfo y DirectoryInfo.
Esto nos puede dar una idea del alcance que puede tener Windows Powershell.
Ejemplo 2:
>get-childitem *.txt | get-member
En este caso obtenemos la lista de atributos posibles del objeto FileInfo.
No tenemos muchas mas posibidades de hacer ejemplos con este cmdlet debido a la
reducida informacion que tenemos ahora de Powershell, pero segun vayamos aumentando
la lista de cmdlets, aumentaran las posibilidades de nuestos programitas.
Venga, a pasarlo bien!!
Otros articulos sobre Powershell:
1-. Introduccion. 2-. Empezando con Powershell 1.0. 3-. Obtener ayuda. 4-. Get-Command. 5-. Tuberias y redireccion. 6-. Get-childitem. 7-. Formateando la salida.
Powershell – 9 – Politica de ejecucion
Este articulo nos va a ser de gran ayuda cuando comencemos a escribir y / o ejecutar
scripts en nuestro entorno, ya que podemos saber y establecer la politica de ejecucion de
scripts de Powershell para evitar males mayores.
9.1- Get-Executionpolicy
Obtiene la directiva de ejecucion vigente en el shell. Esta directiva de ejecucion esta
determinada por las preferencias del usuario que establezca mediante ―Set-
Executionpolicy‖ y la configuracion de directiva de grupo de ejecucion de Windows
Powershell. La configuracion predeterminada es ―restricted―.
Los valores que podemos encontrarnos y utilizar son: restricted, allsigned, remotesigned
y unrestricted que ya los comentare en la proxima seccion de este articulo.
Parametros
Este cmdlet no tiene ningun parametro especifico para el, pero si que podemos utilizar los
parametros comunes: -verbose, -debug, -erroraction, -errorvariable, -outvariable.
Para saber mas sobre estos parametros podemos escribir el siguiente comando:
>get-help about_commonparameters
Ejemplo 1
No hay muchos ejemplos que podamos hacer con este commandlet…
>get-executionpolicy
9.2- Set-Executionpolicy
Cambia la preferencia del usuario para la directiva de ejecucion del shell. Esta directiva
determina si puede cargar archivos de configuracion (incluido su perfil de Windows
Powershell) y ejecutar scripts, asi como los scripts, si los hubiera, que deben estar firmados
digitalmente para que se puedan ejecutar.
A modo de resumen y para que nos entendamos un poco mejor, si ejecutamos un script de
Powershell y nos da error diciendo que no podemos ejecutarlo, tendremos que revisar la
politica de ejecucion con ―get-executionpolicy‖ y establecer la nueva con ―set-
executionpolicy―.
Parametros
-executionpolicy <executionpolicy>
Especifica una nueva directiva de ejecucion del shell. El nombre del parametro es opcional.
Los valores validos para <executionpolicy> son:
Restricted: No carga archivos de configuracion ni ejecuta scripts. La configuracion
predeterminada es ―restricted‖.
Allsigned: Requiere que todos los scripts y archivos de configuracion esten firmados por un
editor de confianza incluidos los scripts que escribamos en el equipo local.
sobre esto, prometo informarme mejor.
Remotesigned: Requiere que todos los scripts y archivos de configuracion descargados de
internet esten firmados por un editor de confianza.
Unrestricted: Carga todos los archivos de configuracion y ejecuta todos los scripts. Si
ejecutamos un script sin firmar descargado de internet, nos pedira permiso antes de
ejcutarlo.
-Whatif
Describe lo que ocurrira si ejecuta el comando, sin ejecutarlo realmente.
Este parametro es comun a muchos cmdlets.
-confirm
Solicita confirmacion antes de ejecutar el comando.
Ejemplo 1
>set-executionpolicy -executionpolicy remotesigned
>get-executionpolicy
9.3- Adelanto sobre scripts.
Todavia no hemos creado ni ejecutado ningun script porque aun tenemos pocos
conocimiento y es mejor esperar un poco para no amontonar conceptos sin mas.
De todas formas nos viene bien saber que los scripts en Powershell (por lo menos en la
verion 1.0) tienen la extension .ps1. Se pueden escribir tranquilamente con el Notepad de
windows.
Mas adelante ya veremos que disponemos de alguna opcion de software para escribir
scripts de Powershell y manejarlos mas comodamente.
Venga, os espero en el proximo articulo.
A pasarlo bien!!
Otros articulos sobre Powershell:
1-. Introduccion. 2-. Empezando con Powershell 1.0. 3-. Obtener ayuda. 4-. Get-Command. 5-. Tuberias y redireccion. 6-. Get-childitem. 7-. Formateando la salida. 8-. Get-Member.
Powershell – 10 – Alias
10.1- Alias
En articulos anteriores hemos comentado o ha salido el termino de Alias, sin especificar lo
que son y para que sirven.
Bueno, pues ha llegado el momento de que lo veamos un poco en detalle por que es algo
que podemos utilizar para facilitar el trabajo.
Un alias es un nombre alternativo o sobrenombre para un cmdlet o un elemento de un
comando, como una funcion, un script, un archivo o un archivo ejecutable. El tema es que
podemos utilizar el alias en lugar de el nombre completo del cmdlet.
Ya comentamos que podemos utilizar en Windows Powershell comandos como ―dir‖ o
―ls‖ y muchos mas. Estos no son mas que alias definidos a otros comandos de Powershell.
En el caso de ―dir‖ y ―ls‖ el cmdlet al que hacen referencia es ―get-childitem―.
Cmdlets de Alias
Powershell incluye varios cmdlets diseñados para trabajar con Alias.
Get-alias, new-alias, set-alias, export-alias e import-alias.
Nombres alternativos para comandos con parametros.
Es posible asignar una lias a un cmdlet, un script, una funcion o un archivo ejecutable,
pero no podemos asignar un lias a un comnado y sus parametros. Por ejemplo, podemos
asignar un alias a ―get-command―, pero no podemos asingnar un alias a ―get-command -
name get-*―.
Para hacer esto, crearemos una funcion. Pero esto de las funciones es otra historia que ya
veremos mas adelante.
Objetos de Alias.
Los alias de Windows Powershell estan representados por objetos que son instancias de la
clase System.Management.Automation.AliasInfo.
Para ver las propiedades y metodos de los objetos de alias, obtenemos los alias y los
canalizamos a traves de ―get-member―.
Por ejemplo:
>get-alias | get-member
Para obtener una lista de los cmdlets relativos a alias:
>get-help *-alias
10.2- Get-Alias.
Get-alias obtiene los nombres alternativos de los cmdlets, las funciones y los archivos
ejecutables que se han establecido e la sesion actual. Este conjunto incluye los alias
integrados, los alias importados o definidos por el usuario y los alias que se han agregado al
perfil de Windows Powershell.
Si especificamos uno o varios alias, ―get-alias‖ obtiene el objeto de alias y muestra sus
propiedades, incluido el objeto al que se asigna un alias, como el nombre completo de un
cmdlet.
Parametros
-name <String[]>
Especifica el alias que se va a recuperar. De manera predeterminada, recupera todos los
alias definidos para la sesion actual. El nombre de esta parametro es opcional.
-scope <String>
Especifica el ambito en el que el alias es valido. Los valores validos son: ―global―, ―local―,
―script‖ o el numero correspondiente al ambito, donde 0 es el ambito actual y 1 su ambito
principal. ―local‖ es el valor predeterminado.
-exclude <String[]>
Omite los elementos especificados. Se permite el uso de caracteres comodin para introducir
un patron.
Ejemplo1
>get-alias
Muestra todos los alias de la sesion actual.
Ejemplo 2
>get-alias -name g*
Muestra los alias cuyo nombre comienza por ―g‖ y le sigue cualquier otro u otros
caracteres.
Esto lo hacemos para poder ver los alias que se refieren normalmente a los cmdlets que
comienzan por ―get-―.
Ejemplo 3
>get-alias | where-object {$_.Definition -match “get-command”}
En este ejemplo hemos incluido el cmdlet ―where-object‖ que todavia no hemos visto,
pero nos basta con saber que este comando completo nos mostrara los alias que tenga
definidos el cmdlet ―get-command―.
10.3- Set-Alias
Crea o cambia un alias. Tambien podemos utilizar ―set-alias‖ para reasignar el alias actual a
un nuevo comando o cambiar cualquiera de sus propiedades. A menos que se agregue el
alias al perfil de Windows Powershell, los cambios que realicemos en el, se perderan al
finalizar la sesion o cerrar windows powershell.
Parametros
-name <String[]>
Especifica el nuevo alias. Pueden utilizarse caracteres alfanumericos en los alias pero el
primer caracter no puede ser un numero.
-value <String>
Especifica el nombre del elemento del cmdlet o el comando al que se le está asignando un
alias.
-description <Sting>
Especifica una descripcion del alias. Si la descripcion contiene espacios, la escribiremos
entre comillas.
-scope <String>
Especifica el ambito en el que es valido este alias. Los valores posibles son: ―global‖,
―local‖, ―scrip‖ o el numero correspondiente al ambito actual. ―local‖ es el valor
predeterminado.
Para obtener mas informacion al respecto:
>get-help -detailed set-alias
Ejemplo 1
>set-alias
Este comando nos permite crear un alias de forma interactiva. Tendremos que facilitar el
nombre y el valor del mismo.
En este ejemplo crearemos el alias ―np‖ cuyo valor sera ―notepad.exe‖.
Ahora, para saber si hemos establecido correctamente el alias, podemos introcucir el
siguiente comando:
>get-alias -name “n*”
Nos muestra todos los alias cuyo nombre comienza por ―n‖.
Y por ultimo, podemos probar el alias escribiendo:
>np
No pongo la captura, pero lo que debe hacer es abrirnos el block de notas, igual que si
escribimos ―notepad.exe‖.
Ejemplo 2
Podemos hacer lo mismo que en el ejemplo anterior en un solo comando, sin que sea
interactivo de la siguiente forma:
>set-alias -name np2 -value notepad.exe
o
>set-alias np2 notepad.exe
10.4- New-Alias
Este cmdlet es practicamente identico al aterior, a set-alias. Lo unico que los diferencia es
que en el caso de ―new-alias‖ no permite sobreescribir un alias existente. En el caso de que
intentasemos esto, nos mostraria un mensaje de error como el de la siguiente captura:
Sin embargo, ―set-alias‖ si nos permite sobreescribir un alias sin comentarnos nada.
Cada uno tiene lo suyo, por eso es que tenemos que andar con cuidado cuando estemos
utilizando ―set-alias‖ y pretendamos establecer un nombre que ya existe. En estos casos es
aconsejable utilizar el cmdlet ―get-alias‖ para comprobar que no existe el alias que vamos a
crear.
10.5- Export-Alias
Exporta informacion sobre los alias definidos actualmente dentro del ambito del espacio de
nombres espeficiado a un archivo.
Parametros
-path <String>
Especifica la ruta de acceso al archivo en que se almacenara la informacion sobre los alias.
Se puede utilizar caracteres comodin.
-name <String>
Especifica los nombres de los alias que se van a exportar. Para indicar varios alias, los
separaremos por comas (,). Si no especificamos ningun alias, exportaremos la informacion
de todos los alias.
-scope <String>
Especifica el ambito dsde el que se deben exportar los alias.
Para mas informacion al respecto:
>get-help -detailed export-alias
Ejemplo 1
>export-alias -path alias.txt
Este comando exportara la informacion de todos los alias disponibles al fichero ―alias.txt‖.
Si abrimos el fichero ―alias.txt‖ veremos algo parececido a lo siguiente:
Ejemplo 2
>export-alias -name np -path np.txt
Si abrimos el fichero ―np.txt―:
10.6- Import-Alias
Importa una lista de alias desde un archivo.
Nos puede servir para cargar unos alias que tengamos definidos en un equipo en concreto y
queramos tenerlos disponibles en otros equipos.
Parametros
-path <String>
Especifica la ruta de acceso al archivo que contienen la informacion sobre los alias.
-scope <String>
Especifica el ambito que tendran estos alias.
Para obtener mas infomacion sobre ―import-alias―:
>get-help -detailed import-alias
Ejemplo 1
>import-alias -path np.txt
Si ejecutamos este comando en la misma sesion de Windows Powershell en la que la hemos
creado, nos dara un error puesto que ya existe dicho alias.
Para probarlo, cerramos Windows Powershell, lo volvemos a abrir e introducimos el
comando.
Comprobamos que efectivamente existe el alias:
Bueno, hasta aqui el tema de los alias, espero que os haya aclarado un poco este asunto.
Venga, hasta la proxima!
Otros articulos sobre Powershell:
1-. Introduccion. 2-. Empezando con Powershell 1.0. 3-. Obtener ayuda. 4-. Get-Command. 5-. Tuberias y redireccion. 6-. Get-childitem. 7-. Formateando la salida. 8-. Get-Member. 9-. Politica de ejecucion
Powershell – 11 – Scripting (1)
11.1- Introduccion.
Windows Powershell tambien pone a nuestra disposicion su propio lenguaje de scripting
para crear secuencias de comandos en el estilo clasico de programacion imperativa.
No creo que haya que decirlo, pero para el que no lo sepa, me gusta mucho la programacion
aunque, por motivos diversos de la vida, nunca he podido desempeñar esta funcion en el
terreno laboral y es una pena que me corroe desde hace mucho tiempo.
Pues bien, con Windows Powershell se me abre una puerta que me es muy grata. Aunque
salvando las distancias con un leguaje de programacion como Java, C++, etc… creo que, si
no hay otra cosa, Windows Powershell puede darme muchas satisfacciones en este sentido
y espero que tambien lo haga con alguno de vosotros.
Bien es cierto que ahora mismo no estoy capacitado para establecer el alcance del mismo,
pero lo que voy descubriendo dia a dia me hace barruntar que podemos realizar un sinfin de
tareas, que de otra manera serian muy laboriosas, de una forma facil y sencilla.
El lenguaje de Script que Powershell (PSL) pone a nuestra disposicion incluye variables,
bucles, condicionales, funciones y manejo de errores. Por supuesto aun estoy empezando
con el, osea que no he podido trabajar con todas estas caracteristicas aunque si con alguna
de ellas.
Tengo que recordar que todos los tutoriales que llevo realizados hasta la fecha sobre
Powershell y los que continuare realizando, estan basados en la version 1.0 del mimo. El
apartado del lenguaje de Script no creo que sufra muchos cambios en versiones posteriores,
osea que nos vamos a centrar en esta version.
A modo de comentario os dire, para que lo sepais, que este lenguaje de script no es algo
creado desde cero, sino que esta ―inspirado‖ en los lenguajes shell de Unix como PERL,
PHP, PYTHON…
11.2- Obtener ayuda
Ya comente en otro tutorial anterior sobre el mismo tema la forma o formas de que
disponemos para obtener ayuda sobre los diferentes cmdlets. Pues bien, tambien podemos
obtener ayuda sobre algunos de las caracteristicas del lenguaje de script.
Por ejemplo, si queremos obtener ayuda sobre el bucle ―for―, podemos escribir:
>get-help about_for
Si escribimos:
>get-help about
Nos mostrara la lista de todos los coumentos ―about―.
Otra forma de ver estos documentos es desde el directorio ―es‖ dentro de la ruta en que esta
instalado Windows Powershell.
En mi caso es: ―c:\windows\system32\windowspowershell\v1.0\es―
11.3- Separacion de comandos.
Cada linea en un script de Windows Powershell es un comando. Un comando puede
contener varios cmdlets separados po el simbolo ―|―.
Tambien podemos escribir varios comandos en una misma linea separandolos con ―punto y
coma‖ (;).
Cuando una linea de un comando es muy larga, podemos escribir el caracater ―`‖ al final de
la linea para indicar que en la siguente linea continua el comando. Osea, que no acaba ahi.
Ejemplo.
Get-Command | where-object `
{$_.Name -like “get-*”}
Este comando, aunque son dos lineas, se comportara como uno solo como podeis observar
en la captura que viene a continuacion:
En el ejemplo anterior, he creado un script llamado
―separacion.ps1″ que contien las dos lineas que he escrito antes.
Ejecuto el script de la forma que se ve en la captura: ―.\separacion.ps1‖ y ejecuta el
comando que contiene el mismo.
Poco a poco, no nos agobiemos…
11.4- Comentarios
Los comentarios en WPS se escriben utilizando el simbolo de almoadilla (#). Todo lo que
se encuentre despues de este caracter, no sera interprestado por Powershell.
Ejemplo
#Este es un comentario.
11.5- Variables
Las variables comienzan con el caracter ―$―.
Las variables en WPS pueden contener letras, numeros e incluso el caracter de subrayado
(_).
Las variables en WPS, como en todo lenguaje de programacion, pueden ser de varios tipos,
pero por ahora y para no complicarnos en demasia la vida, que es bastante complicada,
vamos a realizar scripts sencillos en los que obviaremos este tipo de caracteristicas,
aunque, si se tercia, ya las comentaremos mas adelante, pero bastante mas adelante.
Ejemplo 1
Si queremos crear una variable que contenga el numero 23, haremos lo siguiente:
$numero = 23
o si queremos guardar una frase:
$frase = “Esta es una frase”
y para mostrar el contenido de la variable basta con especificarla junto con el caracter ―$―.
$frase
Vale, para que nos quede mas claro este asunto en un script, creamos un fichero llamado
―variables.ps1‖ cuyo contenido podemos ver en la siguiente captura:
Podemos tener alguan duda con la ultima linea.
Pero no he hecho mas que concatenar dos variables para que veais que se puede hacer de
forma sencilla. El resultado de este script lo podeis ver a continuacion:
Se entiende, ¿no?
Si teneis alguna duda, me la comentais.
Las variables seran validas en el ambito en el que han sido creadas o declaradas. Esto
quiere decir que si hemos declarado una varible dentro de un bucle ―for―, esta varible
existira o estara accesible siempre que estemos dentro del bucle ―for―, una vez que haya
finalizado el bucle o antes de comenzarlo, esta variable no existira. ¡Queda claro, ¿no?!
11.5.2- Variables predefinidas
Windows Powershell dispone de muchas variables predefinidas tambien llamadas
―variables integradas‖ o ―variables internas―.
A continuacion os muestro algunas de estas ―variables internas―:
$true Valor true.
$false Valor false.
$home El directorio home del usuario actual.
$pshome Directorio de insalacion de windows powershell.
$host Informacion de instalacion del host.
$error Lista de los errores que han ocurrido desde que se ha iniciado WPS.
Para obtener una lista de todas las variables disponibles en la sesion actual de Windows
Powershell, tanto las internas como las que hemos definido nostros mismos:
>get-childitem variable:*
Y si lo que queremos es obtener todas las variable cuyo nombre comience por ―p‖:
>get-childitem variable:p*
Pero para obtener informacion sobre las variables, disponemos de otro cmdlet ―get-
variable‖ que vamos a ver en siguiente articulo relacionado con scripting en Powershell.
Por ahora basta con que nos quedemos con que existe.
11.5.3 Constantes
Las constantes, como a sabremos, son un tipo de variables un poco especiales, ya que su
contenido no cambia.
El comando a utilizar para crear una constante seria:
Set-Varible -name nombreconstante -option readonly -value contenido
Ejemplo
>set-variable -name Pi -option readonly -value 3.14
Observando que en este caso no hemos utilizado el caracter $. Con Set-Variable no lo
utilizaremos.
Sin embargo, si queremos trabajar con la constante, si que tendremos que utilizarlo.
Para ver el contenido de la constante Pi, haremos igual que si fuera una variable:
>$Pi
Bueno, creo que por ahora es suficiente. En
el proximo tutorial sobre este tema, seguiremos descubriendo mas caracteristicas para poder
realizar scripts que nos sirvan para nuestra labor cotidiana.
Venga, a pasarlo bien!!
Otros articulos sobre Powershell:
1-. Introduccion. 2-. Empezando con Powershell 1.0. 3-. Obtener ayuda. 4-. Get-Command. 5-. Tuberias y redireccion. 6-. Get-childitem. 7-. Formateando la salida. 8-. Get-Member. 9-. Politica de ejecucion.
10-. Alias.
Powershell – 12 – cmdlets para manejar
variables
En el articulo anterior, en el cual comenzamos a ver un poco el tema de los scripts en
Powershell ya comentamos un poco lo que son las variables y constantes. Ademas vimos
algunos ejemplos.
En este articulo vamos a ver los diferentes cmdlets que tenemos disponibles en Windows
Powershell 1.0 para trabajar con variables.
12.1- Get-Variable
Obtiene las variables de Windows Powershell de la consola actual. Podemos obtener los
valores de las variables y filtrar las variables devueltas por nombre.
Parametros
-name <String[]>
Especifica el nombre de la variable.
-include <String[]>
Especifica unicamente aquellos elementos sobre los que actuara el cmdlet y excluye a
todos los demas. Se permite el uso de caracteres comodin.
-exclude<String>
Omite los elementos especificados.
-valueonly <SwitchParameter>
Obtiene solo el valor de la variable o variables indicadas.
-scope <String>
Restringe las variables recuperadas al ambito especificado.
Ejemplo 1
>get-variable
Obtiene todas las variables.
Ejemplo 2
>get-variable -name p*
Obtiene las variables cuyo nombre
comienza por ―p―.
Ejemplo 3
>get-variable -name pshome -valueonly
Obtiene unicamente el valor de la variable ―pshome―.
Si no hubiesemos especificado ―-valueonly―, nos mostraria lo siguiente:
Ejemplo 4
>get-variable -include r*, h*, v* | format-list
Este comando nos muestra todas las variables cuyo nombre comienza por ―r―, ―h―, o ―v―.
El resultado se mostrara en formato de lista gracias a las redireccion que efectuamos al
cmdlet ―format-list―.
12.2- Set-Variable
Establece el valor de una variable. Podremos crear la variable si no existe ninguna con el
nombre que le especificamos.
Parametros
-name <String[]>
Especifica el nombre de la variable
-include <String[]>
Especifica unicamente aquellos elementos sobre los que actuara el cmdlet y excluye todos
los demas.
-exclude <String[]>
Especifica aquellos elementos sobre los que no actuara el cmdlet
-option <scopeitemoptions>
Cambia el valor de la propiedad options de la variable. Los valores validos son:
none: ninguna opcion. readonly: no se puede modificar ni eliminar sin el parametro “-force“. constant: similar al anterior. private: solo esta visible en el ambito especificado en el parametro “-scope“. allscope: la variable se copia a todos los ambitos que se crean.
-description <String>
Nos permite facilitar una descripcion de la variable.
-value <object>
Valor que se va a asingnar a la variable.
-force <Switchparameter>
Lo usaremos para forzar la operacion que queramos llevar a cabo, como por ejemplo,
modificar el valor de una constante.
Otros parametros:
-scope
-passthru
-whatif
-confirm
Ejemplo 1
>Set-Variable -name dia -value Domingo -description “dia festivo”
Con este comando creamos una nueva variable con el nombre ―dia‖ cuyo valor es
―Domingo‖ y su descripcion es ―dia festivo―.
Para ver el contenido de esta variable que acabamos de crear, haremos lo siguiente tal y
como hemos aprendido en el apartado anteriror:
>get-variable -name dia
Para ver todas las propiedades de nuestra
nueva variable podemos utilizar el cmdlet ―format-list‖ para redireccionar la salida del
anterior comando a este cmdlet de la siguiente manera:
>get-variable -name dia | format-list
Ejemplo 2
En este ejemplo vamos a crear una constante.
>set-variable -name omega -value 168 -description “valor de prueba” -option
readonly
A continuacion, verificamos las propiedades de estanueva constante:
>get-variable -name omega | format-list
12.3- New-Variable
Por mas que lo reviso, no encuentro ninguna diferencia significativa entre este cmdlet y
―set-variable―.
Por eso, podemos utilizar la descripcion que hemos realizado de ―set-variable‖ para ―new-
variable―. Creo que son mas que similares. Yo diria que iguales.
12.4- Clear-Variable
Borra los datos almacenados en una variable, pero no elimina la variable. Como resultado,
el nuevo valor de la variable es NULL (vacio).
Si se ha especificado un tipo de objeto o dato para la variable, clear-variable mantiene el
tipo del objeto almacenado en la variable.
Parametros
-include <String[]>
Borra unicamente los elementos especificados. Se permite el uso de caracteres comodin.
-exclude <String[]>
Omite los elementos especificados.
-name <String[]>
Especifica el nombre de la variable que se va a borrar.
Otros parametros:
-scope <String>
-force <Switchparameter>
-passthru <Switchparameter>
-whatif
-confirm
Ejemplo 1
>get-variable dia | format-list
>clear-variable -name dia
>get-variable -name dia | format-list
Ya teniamos creada esta variable de un apartado anterior, osea que la aprovechamos.
En primer lugar, mostramos las propiedades de la variable ―dia‖ mediante una redireccion a
―format-list―.
Despues borramos el contenido de esta variable.
Por ultimo, mostramos todas las propiedades de dicha variable, comprobamos este
resultado con el que nos dio antes de borrarla y vemos que la propiedad ―value‖ ahora esta
vacis, es decir NULL.
Se ve claro que la variable sigue exsistiendo aunque no tiene ningun valor, ¿no?
Ejemplo 2
Recordamos que creamos ha bien poco una constante llamada ―omega―. Vamos a jugar un
poco con ella…
En primer lugar intentamos borrarla o borrar su valor:
>clear-variable -name omega
Nos da un terrible error porque, si recordamos, las constantes no pueden cambiar de valor
asi como asi. Para esto debemos utilizar el parametro ―-force‖ como se muestra a
continuacion:
>clear-variable -name omega -force
Ahora si!
Mostramos las propiedades de la variable ―omega‖ para cerciorarnos que lo ha realizado
correctamente.
>get-variable -name omega | format-list
Todo ha salido a la perfeccion. ¿contento?
Ejemplo 3
Continuando con el ejemplo anterior, ahora que la constante ―omega‖ tiene valor NULL,
vamos a asignarle otro valor.
Primero lo intentamos como si de una variable normal y corriente se tratase.
>set-variable -name omega -value omega2
Pues no. Nos da otro terrible error por que no podemos modificar el valor de una constante.
Para hacerlo, debemos utilizar, igual que anteriormente hicimos, el parametro ―-force―.
>set-variable -name omega -value omega2 -force
Ahora parece que si. Por lo menos no nos ha mostrado ningun mensaje de error. Lo
comprobamos:
>get-variable -name omega | format-list
Pues si, ahora si que lo ha hecho bien.
12.5- Remove-Variable
Este cmdlet elimina una variable y su valor del ambito en el que esta definida, como la
consola actual.
La diferencia entre este cmdlet y el anterior que hemos comentado (clear-variable) es que
este si que elimina la variable completamente y no solo el valor, como hacia ―clear-
variable―.
No voy a explicar los parametros de este cmdlet por que es practicamente identico en
cuanto a funcionamiento a ―clear-varible―, y no vamos a repetir todo el rato lo mismo, que
ya aburre, ¿que no?
Ejemplo 1
Vamos a aprovechar que aun disponemos de la variable ―dia‖ que habiamos creado en otro
apartado de este articulo para hacer este ejemplo. Eliminaremos la variable ―dia‖ con
―remove-item―. Pero antes, para estar seguros, vemos las propiedades de la misma.
>get-variable -name dia | format-list
Vemos que si que existe, aunque no tiene ningun valor.
Seguidamente procedemos a eliminarla.
>remove-variable -name dia
Todo bien, de momento. Aunque para estar seguros, hacemos una consulta de las
propiedades de la variable a ver que nos dice…
>get-variable -name dia | format-list
Nos dice que no existe esta variable. Esto quiere decir, que se ha eliminado correctamente,
que es lo que queriamos hacer.
Podeis ver todo el proceso en la siguiente captura de pantalla:
Ejemplo 2
Ahora vamos a intentar hacer lo propio con la otra variable, o mejor dicho, constante que
habiamos creado anteriormente. Recordamos que la habiamos llamado ―omega―.
Primero, para ponernos en situacion, hacemos una consulta de sus propiedades.
>get-variable -name omega | format-list
Vale, esta tiene de todo.
Ahora intentamos eliminarla como si fuera una variable normal:
>remove-variable -name omega
¡Anda! no podemos borrarla! Bueno, esto es normal porque para algo es una constante.
Para eliminarla utilizaremos el parametro ―-force―.
>remove-variable -name omega -force
Ahora no nos muestra el mensaje de error de antes. ¿la habra eliminado?
Para estar seguros de esto, volvemos a realizar una consulta de sus propiedades.
>get-variable -name omega | format-list
¡Eso es! Nos dice que no existe. ¡Somos unos fenomenos!
Bueno, hasta aqui llega el tema correspondiente a los cmdlets que tenemos disponibles en
Powershell para trabajar con variables.
No os pongais nerviosos por que ya estoy pensando en el siguiente articulo.
Venga, a pasarlo bien!!
Para ver mas articulos sobre powershell en el blog, puedes hacerlo en la pagina dedicada a
Powershell.
Powershell – 13 – Sort-Object
13.1- Sort-Object
Ordena un conjunto de objetos por los valores de las propiedades. Podemos especificar una
propiedad o un conjunto de propiedades con el fin de ordenar mediante el parametro ―-
property―.
Si especificamos varias propiedades, los objetos se ordenaran en funcion de la primera
propiedad. El resto de propiedades se utilizan en el caso de que un grupo de objetos
coincidan con el mismo nombre en las ateriores propiedades.
En el proceso de ordenacion se distingue entre mayusculas y minusculas a menos que se
especifique el parametro ―-casesensitive―.
Por defecto, este cmdlet ordena los objetos en orden ascendente, pero este comportamiento
se puede modificar mediante la utilizacion del parametro ―-descending―.
Si un objeto no tiene una de las propiedades especificadas, ―sort-object‖ interpreta como
nulo el valor de la propiedad correspondiente de ese objeto. Los objetos con un valor nulo
se situan al final en el criterio de ordenacion.
Si no especificamos ninguna propiedad por la que realizar la ordenacion, ―sort-object‖
llevara a cabo una ordenacion con metodos predeterminados que dependen del tipo de
objeto que se esta ordenando.
Este cmdlet por si solo no nos va a server para mucho. Se utiliza casi siempre como
receptor de otro u otros cmdlets y realiza la ordenacion del conjunto de objetos recibido.
Esto quiere decir, simplemente, que ―sort-object‖ normalmente estara situado despues de
un caracter de tuberia (|).
Las unicas ocasiones en que esto ultimo no sera asi es cuando utilicemos el parametro ―-
inputobject―.
13.2- Parametros
-property <objedt[]>
Especifica la propiedad o propiedades que se van a utilizar para la ordenacion.
-inputobject <psobject>
Especifica los objetos que se van a ordenar. Podemos utilizar este parametro o utilizar la
canalizacion de otro cmdlet. Personalmente me parece que es mejor no utilizar este
parametro.
-casesensitive <switchparemeter>
En la ordenacion se distinguira entre mayusculas y minusculas.
-unique <switchparameter>
Ordena unicamente segun los valores unicos de las propiedades
-desending <switchparameter>
Ordena los objetos de forma descendente.
-culture <string>
especifica la configuracion cultural que se va a usar durante la ordenacion.
13.3- Ejemplos
Ejemplo 1
>get-command | sort-object -descending
Con este comando conseguimos, primero la lista de todos los cmdlets, y posteriormente, al
pasarle este resultado a ―sort-object―, los odena en orden descendente gracias al parametro
―-descending―.
Ejemplo 2
>get-alias | sort-object -property name
Obtenemos la lista de todos los alias
definidos en la sesion actual de Windows Powershell y posteriormente los ordenamos de
forma ascendente por el parametro ―name―.
Ejemplo 3
Get-chilitem -recurse | sort-object
En este caso, ordenamos el listado de archivos y directorios recursivo que realizamos con
―get-childitem―.
Ejemplo 4
>get-childitem | sort-object -property LastWriteTime > sort.txt
Ordenamos el listado de fichero y directorios del directorio actual por la propiedad
―LastWriteTime―. Este listado lo guardamos en un fichero de texto ―sort.txt‖ que
posteriormente podremos revisar.
Venga, pues esto es todo lo que tenia que comentaros sobre ―sort-object―.
A pasarlo bien!!
Para ver mas articulos sobre powershell en el blog, puedes hacerlo en la pagina dedicada a
Powershell.
Powershell – 14 – Where-Object
14.1- Where-Object
Crea un filtro que controla los objetos que se van a pasar con una canalizacion de
comandos. Filtra los objetos que recibe, bien como entrada canalizada o a traves del
parametro ―-inputobject―. Determina que objetos se van a pasar a traves de la canalizacion
mediante la evaluacion de un bloque de script que puede incluir una referencia a un objeto
que se va a filtrar. Si el resultado de la ejecucion es True, el objeto que se va a procesar se
pasa a traves de la canalizacion, en caso contrario, el objeto queda descartado.
Este cmdlet lo vamos a usar mucho, por lo tanto es bueno comprender su funcionamiento
correctamente. Para ello, voy a dedicar especial atencion al apartado de ejemplos de este
cmdlet para que quede lo mas claro posible.
Ademas, este cmdlet lo usaremos en ejemplos a partir e ahora con otros cmdlets.
14.2- Parametros
-filterscript <scriptblock>
Especifica el bloque de script que se va a evaluar, Para determinar que objetos de entrada se
van a pasar a traves de la cananlizacion de comandos.
-inputobject <psobject>
Especifica los objetos que se van a filtrar.
Si guardamos el resultado de un comando en una variable, podemos utilizar ―-inputobject‖
para pasar la variable a “where-object”.
14.3- Ejemplos
Ejemplo 1
>get-command | where-object {$_.Name -like “get-*”}
Aparentemente no tiene muy buena pinta y nos puede intentar desistir de seguir adelante
viendo estos signos ―raros‖ ¿no?
Pero no os preocupeis por que es bien sencillo y a medida que vayamos utilizando
Powershell ya vereis que nos vamos a acomodar a este tipo de comandos.
El mayor problema que podemos encontrar al principio en este comando es: {$_.Name -
like “get-*”}.
En primer lugar tengo que decir que el argumento de ―where-object―, al ser una
comparacion, ira entre llaves ({}).
Bien, el primer operando dentro de las llaves es: ―$_.Name‖ que se refiere al conjunto de
objetos recibidos a traves de la tuberia y en este caso a su propiedad ―Name―. Es decir, que
vamos a utilizar solo la propiedad ―Name‖ de los objetos recibidos para la comparacion.
El segundo, es un operador de comparacion (como ya habreis intuido). Este en concreto (-
like), lo que hace es comparar los objetos recibidos con el patron y nos mostrara todos los
que coindidan con este. Cuando utilizamos ―-like―, normalmente el patron tendra algun
caracter comodin.
Y del tercer argumento ya hemos hablado, es el patron a buscar y no creo que sea necesario
explicar nada sobre esto.
Ahora, si juntamos todo, tenemos que nos mostrara los comandos cuyo nombre comience
por ―get-―. Si teneis alguna duda sobre esto, me lo comentais.
Aunque los operadores de comparacion merecen un apartado proipo, voy a indicar a
continuacion algunos de ellos para que podamos probarlos.
-eq igual
-ne no igual
-gt mayor que
-ge mayor o igual que
-lt menor que
-le menor o igual que
-like comparacion de caracteres comodin
-notlike lo contrario que el anterior.
-match Que coincida el segundo operando exactamente
-notmatch Lo contrario de ―-match‖
De todas formas, no estaria de mas que le deis una vuelta a este tema y para ello podeis
utilizar el siguiente comando:
>get-help about_comparison_operators.
Ejemplo 2
>get-childitem | where-object {$_.Length -ge 10000}
Como podemos observar, nos muestra los ficheros que tienen 10000 bytes o mas de los que
hay en el directorio actual.
Ejemplo 3
Recordad que para conocer las diferentes propiedades que posee un objeto, podemos
hacerlo mediante el cmdlet ―get-member―. Este, ademas de las propiedades, nos puede
mostrar otros elementos como metodos, funciones…
En el caso anterior, podriamos escribir:
>get-childitem | get-member
Pero esto nos devolvera la lista completa de
elementos disponibles en el objeto en cuestion y nosotros queremos algo mas concreto.
Para obtener solamente la lista unicamente de las propiedades hacemos lo siguiente:
>get-childitem | get-member | where-object {$_.MemberType -match “Property”}
Todavia no hemos conseguido
completamente nuestro objetivo. Ahora volvemos a probar, pero esta vez con el operador ―-
eq―:
>get-childitem | get-member | where-object {$_.MemberType -eq “Property”}
¡Ahora si! Ahora hemos conseguido el
listado que andabamos buscando.
Ejemplo 4
Ahora, por lo que sea, queremos saber que servicios estan parados en el equipo local.
Bien, para esto escribimos el siguiente comando:
> get-service | where-object {$_.status -eq “stopped”}
Ya lo veis. Que facil ¿no?
Venga, pues hasta aqui llega este articulo.
A pasarlo bien!!
Para ver mas articulos sobre powershell en el blog, puedes hacerlo en la pagina dedicada a
Powershell.
Powershell – 15 – Get-Wmiobject
15.1 Get-Wmiobject
Obtiene instancias de las clases de WMI o informacion sobre las clases disponibles.
El parametro ―computername‖ se puede usar para especificar un equipo remoto.
Este cmdlet nos sera de gran utilidad para trabajar con las clases WMI y ademas
remotamente.
15.2 Parametros
-class <string>
Especifica el nombre de una clase de WMI. Si se usa este parametro, el cmdlet nos
mostrara instancias de la clase de WMI.
-property <string[]>
Especifica la propiedad o el conjunto de propiedades de la clase de WMI que se va a
recuperar.
-computername <string[]>
Espercifica el o los equipos en los que se ejecutara el cmdlet. Puede ser un nombre de
equipo o una ip. Se puede especificar el equipo local mediante un punto (.).
-filter<string>
Especifica una clausula where que se usara como filtro.
-credential <pscredential>
Usa las credenciales especificadas para autentificar al usuario. Si especificamos un nombre
de usuario, nos pedira la contraseña de este. Tambien podemos utilizar un objeto
―credential‖ creado mediante get-credential, pero eso es otra historia…
-query <string>
Especifica una instruccion del lenguaje de consultas WMI (WQL) que debe ejecutarse.
Otros parametros:
-list
-namespace
14.3 Ejemplos
Ejemplo 1
>get-wmiobject -class win32_process
Este comando nos muestra informacion sobre todos los procesos que se estan ejecutando en
el equipo.
Ejemplo 2
>get-wmiobject -class win32_process -computername equipo1
En este caso, al igual que el anterior, nos mostrar informacion sobre los procesos que se
estan ejecutando. Pero en este caso los procesos corresponderan a los del equipo
―equipo1―, ya que hacemos una consulta remota a la clase ―win32_process‖ de ―equipo1―.
Personalmente veo muy util este cmdlet para realizar tareas administrativas en ordenadores
remotos sin que tengamos que apagarlos ni reiniciarlos. Ademas, el usuario no se entera de
nada de lo que estamos haciendo.
Ejemplo 3
>get-wmiobject -class win32_bios
No creo que sea necesaria ninguna explicacion al respecto, ¿no?
No os preocupes si no entendeis todo sobre este cmdlet. El mayor problema reside en que
trabajaremos con clases WMI normalmente, y de estas hay muchisimas. Pero ya vereis
como haremos algunos ejemplos y/o ejercios de scripts que utilizan este cmdlet y alguna
que otra clase WMI.
Venga, nos vemos en el siguiente…
A pasarlo bien!!
Instalar Vmware Infraestructure Toolkit
para Windows
Como ya vamos teniendo mas conocimientose sobre Powershell, aunque todavia hay
muchisimo que ver, vamos a instalar en este articulo en ―Vmware Infraestructure Toolkit
para Windows‖ o lo que viene siendo lo mismo, cmdlets de powershell para Vmware.
Segun indican en la web de vmware, ―Vmware Infraestructure Toolkit para Windows‖
proporciona una potente pero sencilla interfaz de linea de comandos para la gestion basada
en la plataforma de Vmware Infraestructure. Los administradores Windows pueden majejar
facilmente y desplegar la infraestructura de Vmware con una interfaz de linea de comandos
familiar y facil de usar.
Pagina de vmware sobre VI toolkit for windows.
Si no os habeis dado cuenta, ya os lo digo yo. Para poder instalarlo tenemos que tener
instalado ya el Windows Powershell que lo podeis bajar de aqui si no lo teneis ya.
La version mas actual que tenemos disponible ahora mismo es la 1.5 y la podeis descargar
desde aqui.
Guardamos el fichero.
Ahora ya tenemos el ejecutable. Pues nada, lo ejecutamos…
Bueno, ya veis que no tiene nada.
Cuando finaliza la instalacion dispondremos de este icono en el escritorio:
Lo ejecutamos e inicamos una sesion en powershell con los cmdlets que nos aporta el VI
Toolkit de Vmware.
Si os fijais, en el menu Inicio –> Programas –> Vmware –> Vmware VI Toolkit,
dispondremos del mismo acceso directo. Ademas, tambien dispondremos de varios accesos
directos a documentacion que nos puede ayudar a comprender mejor la forma de utilizacion
del VI Toolkit. Os aconsejo que les echeis un vistazo.
Bueno, hasta aqui lleva el tutorial de instalacion del VI Toolkit 1.5 de Vmware. En
proximos articulos veremos que podemos hacer con esto y como podemos hacerlo.
Venga, nos vemos…
Powergui – Editor para Powershell
Powergui es un software gratuitor desarrollado por Quest Software que nos permite crear y
manejar scripts Powershell de forma mas amena, sencilla y ordenada.
No hay mucho mas que decir. Si quereis, podeis echarle un vistazo a esta demo para que
veais como funciona exactamente.
En la web de Powergui disponemos de mucha ayuda en forma de tutoriales, videotutoriales
y foros. Ademas de disponer de un inmenso numero de scripts ya creados para que los
podamos utilizar nosotros.
Yo todavia no he jugado mucho con Powergui, pero ya lo he puesto en la lista por que me
ha venir muy bien. Hace tiempo que empece a crear scripts y este software me va a ayudar
a realizarlos mejor.
Venga, ¡Fuerza y Honor!
Instalacion de PowerGui 1.7
Una vez que hemos explicado un poco por encima lo que es el software Powergui en un
articulo anterior, vamos ahora a instalarlo en nuestro equipo para intentar aprovechar las
diferentes caracteristicas de este programa.
En primer lugar, nos lo bajamos de esta direccion.
Ejecutamos el .msi.
Aceptamos el tipico contrato de licencia…
Como veis en la captura siguiente, yo he seleccionado y deseleccionado las caracteristicas
que me interesan:
Pues ya lo tenemos. Facil, sencillo y para toda la familia.
Como hemos marcado la opcion ―Start Powergui after I click Finish‖… pues eso, que se
abre Powershell.
A continuacion vemos el aspecto que tiene.
En articulos posteriores veremos como funciona y haremos algun que otro ejemplo.
Venga, A pasarlo bien!!
Script Powershell – Apagar equipos
remotamente
Bueno, como lo prometido es deuda, hoy vamos a escribir nuestro primer script en
Powershell.
En este caso vamos a utilizarlo para apagar equipos remotamente.
A continuacion muestro el codigo completo:
#Script: apagarequipos.ps1
#Version: 1.0
#
#Autor: Oscar Abad Folgueira
#Web: http://www.aprendeinformaticaconmigo.com
#Fecha: 25 de Abril de 2009
#
#Tipo: Powershell
#Funcion: Apagar equipos remotamente.
#
#Parametros: nombre el equipo a apagar.
#Uso: apagarequipos.ps1 equipo
#
#
Param($equipo) #parametro de entrada (Nombre del equipo a apagar).
(get-wmiobject -class win32_operatingsystem -computername
$equipo).win32shutdown(12)
Ahora toca explicar un poco lo que hace el script y como lo hace.
En primer lugar debemos saber, si no lo sabemos ya o nos lo imaginamos, que todo lo que
escribimos despues del caracter almoadilla (#) es un comentario. Por consiguiente, si nos
fijamos, nuestro script consta de 2 lineas unicamente.
La primera linea efectiva: Param($equipo) la utilizamos para recoger en la variable
$equipo el nombre del equipo que hemos tecleado despues de apagarequipos.ps1 y que se
corresponde con el equipo que queremos apagar.
Por ejemplo, cuando utilicemos el script, lo haremos de la siguiente forma:
apagarequipos.ps1 compras1
Esto lo que hara sera intentar apagar el equipo ―compras1‖ si es que esta encendido, claro.
Si no está encendido nos dara un mensaje de error. De todas formas, como este script es
solo para que veamos como funciona esto y no nos compliquemos demasiado, no os
preocupeis por que lo vamos a mejorar un poco en posteriores artiulos.
La segunda linea efectiva lo que hace es utilizar las clases WMI de Windows. En este caso
utilizamos la clase ―win32_operatingsystem‖ la cual, entre otros, dispone de un metodo
llamado ―win32shutdown‖ y admite una serie de valores.
Para saber mas sobre este metodo y sobre los valores que admite, podemos visitar esta
pagina web.
Para poder probar este script, ya sabeis, y si no lo sabeis os lo comento ahora. Teneis que
copiar el codigo que os he puesto arriba y guardarlo en un fichero con extension ―ps1―. El
resto corre de vuestra cuenta.
No estaria de mas que le echarais un vistazo al apartado de Powershell del Blog para que os
aclare algunas cosillas que puede que no las tengamos claras en este momento.
Bueno, creo que con esto tenemos suficiente para empezar con los scripts en Powershell.
Ya iremos viendo mas y mas poco a poco.
Venga, a pasarlo bien!!
#1 escrito por mcmach
hace 1 año
Hola Oscar, te quería preguntar (he buscado por ahí pero no he encontrado) una cosilla. En
mi empresa trabajamos con el Microsoft System Center Operation Manager 2007 que trae
su propia consola de PowerShell. Esta tiene comandos que no están en el PowerShell que
aquí se trata, como por ejemplo get-rule. La pregunta es, hay alguna forma de ejecutar
desde el powershell que aquí tratamos alguna de los comandos únicos del microsoft system
center operation manager???
Si no entiendes la pregunta dímelo y la intento formular de otra manera.
Gracias.
Por cierto, muy bueno tu blog.
#2 escrito por oscar
hace 1 año
Si, y eso es lo bueno de Powershell.
Segun va pasando el tiempo y saliendo nuevas versiones de programas, van
haciendo nuevos cmdlets para las diferentes plataformas.
Por ejemplo, si tu copias un cmdlet de un equipo que lo tenga a otro que no lo tenga
y lo ejecutas en este ultimo, deberia de funcionar. Claro que depende de lo que haga
el cmdlet.
No se si me he explicado bien.
Venga, a pasarlo bien!!
Hola Oscar,
Interesante el script, pero para que funcione entiendo que tiene que estar dentro de un
dominio.. ¿Sabes de algún método que dada la IP, usuario y contraseña se pueda hacer esto
mismo?
Saludos!
#2 escrito por oscar
hace 1 año
Saludos Santi y gracias por visitar el blog.
En el caso que tu comentas, debes utilizar las credenciales. Si haces un: get-help -detailed
get-wmiobject, veras que hay un parametro llamado ―-credential‖. Pues lo que tienes que
hacer es jugar con el.
Al ser diferente el usuario de tu equipo del usuario del equipo remoto y por consiguiente la
contraseña, debes crear un objeto para que sea el quien te identifique el la maquina remota.
Como ejemplo:
————————————
$c = get-credential
get-wmiobject -class win32_bios -compuername ―equipo‖ -credential $c
———————————–
Cuando ejecutamos get-credential, nos pedira que introduzcamos un usuario y una
contraseña. Si es de grupo, asi sin mas, y si es de dominio, podemos indicarle en el campo
usuario: dominio\usuario.
Si quieres hacerlo en una sola linea, siempre puedes incluir la llamada a get-credential
dentro del comando get-wmiobject de la siguiente forma:
——————————
get-wmiobject -class win32_bios -computername ―equipo‖ -credential (get-credential
usuario)
——————————
Espero haberte ayudado.
Si tienes algun problema lo comentas…
Venga, a pasarlo bien!!
Script Powershell – Apagar equipos
remotamente – Ver. 3.0
Esto parece que va funcionando, ¿no?
A mi por lo menos si que me es util este script y espero que a vosotros tambien.
Bueno, como os comente en el articulo de la version 2.0 de este script, ahora vamos a ver
como podemos utilizar un fichero de texto en el que previamente hemos introducido los
nombres de los equpios que queremos apagar para que los vaya comprobando uno a uno y
apagando si es el caso.
En primer lugar creamos un fichero de texto que yo le voy a llamar ―equiposapagar.txt‖ y
en el introducimos los equipos que queramos apagar. Como ejemplo podemos poner:
fabrica1
fabrica2
compras3
Podemos poner todos los equipos que queramos. Ojo con incluir servidores o equipos que
no deberian apagarse, eh!
Lo primero a tener en cuenta es que en este script no necesitamos ningun dato de entrada,
es decir, que al ejecutar el script unicamente escribiremos el nombre del fichero:
apagarequipos.ps1
Una vez que tenemos claro esto, nos ponemos manos a la obra con la novedad de esta
version: el famoso fichero de texto del cual deberemos cargar su contenido. La linea en
custion es la siguiente:
$equiposapagar = get-content -path “c:\power\scripts\equiposapagar.txt”
Interpretamos que, mediante el cmdlet ―get-content―, guardamos la informacion del fichero
―c:\power\scripts\equiposapagar.txt‖ en la variable $equiposapagar.
Esto nos queda claro, ¿no?
Otra de las novedades de este script es que utilizaremos la orden ―foreach-object‖ para
recorrer todos y cada uno de los equipos que ahora tenemos guardados en la variable
$equiposapagar.
A continuacion tenemos el codigo:
#Script: apagarequipos.ps1
#Version: 3.0
#
#Autor: Oscar Abad Folgueira
#Web: http://www.aprendeinformaticaconmigo.com
#Fecha: 25 de Abril de 2009
#
#Tipo: Powershell
#Funcion: Recorre un fichero de texto con nombres de equipo y los va apando uno a uno.
#
#Parametros: No necesita parametros de entrada.
#Uso: apagarequipos.ps1
#
#
#obtener la lista de equipos que se pueden apagar y guardarla en la
variable‖$equiposapagar‖
$equiposapagar = get-content -path ―c:\power\scripts\equiposapagar.txt‖
#
#Bucle ―foreah-object‖ que recorre todos los equipos del fichero para ver si estan apagados
y si es asi
#los apaga
#
$equiposapagar | foreach-object {
$equipo = $_
$estado = get-wmiobject -query ―select statuscode from win32_pingstatus where address =
‗$equipo‘‖
if ($estado.statuscode -eq 0) {
(get-wmiobject -class win32_operatingsystem -computername
$equipo).win32shutdown(12)
}
}
Creo que no es nada dificil entender el fucnionamiento.
Probad tambien este script si podeis. Yo personalmente lo he puesto en varias fabricas para
revisar los equipos que se quedan encendidos por las noches y si estan encendidos,
apagarlos.
Yo he añadido unas lineas para crear un log de los equipos que estan encendidos por que
siempre esta bien saber cuantos equipos apagamos y, de este modo, si el trabajo merece la
pena por el ahorro de consumo.
Venga, espero que me comenteis que tal os ha funcionado.
A pasarlo bien!!
#1 escrito por rcastro
hace 1 año
buenas
Ante todo muchas gracias por compartir tus conocimientos. desde vista, y dentro del PS 2.0
intento ejecutar el script pero me salta el siguiente error:
[PS] C:\power\scripts>.\apagarequipos.ps1
Get-WmiObject : Consulta no válida
En C:\power\scripts\apagarequipos.ps1:20 carácter:24
+ $estado = get-wmiobject <<<< -query ―select statuscode from win32_pingstatus where
address = ‗$equipo‘‖
sabes donde puede estar el error?. Las instrucciones no deben de tener espacios intermedios
vacios?, me refiero a Ej. ..adress=‘$equipo‘‖
Un saludo y felicidades por Blog
#2 escrito por oscar
hace 1 año
Saludos y bienvenido al blog rcastro.
Con estas historias he tenido yo un monton de mensajes como el que te da a ti.
Antes de nada, supongo que tendras los ficheros en las rutas que indican en el script.
c:\power\scripts\ y que tendras creado el fichero ―equiposapagar.txt‖ en el mismo
directorio. Bueno esto supongo que si.
Decirte que yo lo estoy haciendo con la version de Powershell 1.0 por que hace
tiempo probe con la 2.0 y ―get-wmiobject‖ me dio algun que otro disgusto. Pero
bueno, para salir de dudas yo suelo abrir una consola de powershell y voy haciendo
las cosas paso a paso. Seguro que me entiendes.
Me lo curro de tal forma que ejecuto una a una las lineas del script y asi se cual es la
que me da problemas.
Puede ser que te siga dando ese error, entonces yo verificaria que el equipo remoto
esta preparado para aceptar ordenes remotas.
Pero bueno, primero prueba a hacerlo paso a paso y si no te funciona, me dices y te
comento algo que puedes hacer.
Venga, muchas gracias por visitar el blog y nos vemos….
A pasarl bien!!
Script Powershell: software instalado en
equipos remotos
Bueno, vamos a darle un poco mas de vidilla al tema de Powershell, que lo tenemos un
poco parado.
En este caso, vamos a crear un script que nos va a generar un fichero de texto con la lista
del software instalado en un equipo remoto. ¿a que mola?
Os pongo el script completo como lo tengo yo y luego explico un par de cosas.
#Script: Softinstaladoequipo.ps1
#Version: 1.0
#
#Autor: Oscar Abad Folgueira
#Web: http://www.aprendeinformaticaconmigo.com
#
#Tipo: Powershell
#Funcion: Obtener una lista en un fichero de texto de todo el software instalado en un
equipo.
#Parametros: Necesita un nombre de equipo como parametro de entrada.
#Uso: ./softinstaladoequipo.ps1
#
#
Param($equipo) #parametro de entrada
$softinstalado = Get-WmiObject -class win32_Product -computername ‗$equipo‘
$softinstalado > softwareinstalado.txt
———————————————————
Ya se que no es necesario decirlo, pero por si acaso os comento que todo lo que va detras
del caracter almoadilla (#), es un comentario.
Por consiguiente, solo tenemos 3 lineas de codigo en el script.
La primera:
Param($equipo) Ya sabreis del script anterior que esto nos sirve para indicar que nos hace falta un
parametro para ejecutar el script. En este caso un nombre de equipo valido.
La seguna linea efectiva del script:
$softinstalado = Get-WmiObject -class win32_Product -computername „$equipo‟
Gracias a Get-WmiObject, y a la clase win32_product, lo que hacemos es decirle que
guarde en la variable $softinstalado, la informacion del software instalado en el equipo
remoto ―$equipo―.
Y la ultima linea:
$softinstalado > softwareinstalado.txt
Vuelca esa informacion en un fichero de texto para que podamos revisarlo con mas
detenimiento.
Creo que es bastante sencillo pero de mucha utilidad.
La pega que parece tener este script, es que solo nos devuelve el software instalado en el
equipo con MSI, pero no me hagais mucho caso. Podeis probar a sacar un listado del
equipo local y posteriormente compararlo con la lista en ―Agregar o quitar programas‖ del
panel de control de Windows y vereis que hay diferencia.
Aun asi, a mi me hace un gran servicio.
Esto no va a quedar aqui ni mucho menos, en posteriores scripts,veremos como obtener la
informacion de un programa en concreto y no toda la lista. Y si teneis paciencia, mas
adelante desinstalaremos software remotamente. Como mola esto ¿que no?
Venga, de momento es todo por hoy. Lo probais y me comentais si os ha funcionado
correctamente u os ha dado algun tipo de error.
A pasarlo bien!!
Script Powershell en tareas programadas
En este articulo vamos a hacer algo sencillo, pero como seguramente habra quien no lo
haya llevado a cabo nunca, como me pasa a mi, que no he realizado muchas pruebas con las
tareas programadas, creo que con este articulo matamos dos pajaros de un tiro.
Aunque todavia no hemos creado scripts en powershell, no os preocupeis. Yo ya he
realizado varios y este en concreto es un script para apagar los equipos que se quedan
encendidos por la noche y deberian estar apagados.
Buenos, en este caso es indiferente el script que utilicemos, ya que vamos a ver como
programarlo para que se ejecute cuando nosotros queramos.
En primer lugar, ya sabeis… Panel de control –> Tareas programadas.
Hacemos doble-click en ―Agregar tarea programada―:
A continuacion, Windows nos permite seleccionar el programa que deseemos que se
ejecute.
Pulsamos en el boton examinar puesto que nuestro script no esta en la lista que nos ofrece y
buscamos el script (apagarequipos.ps1 en mi caso).
Una vez que hemos elegido el script que queremos programar, indicamos a continuacion el
nombre de la tarea programada y escogemos la periodicidad de su ejecucion.
En la siguiente pantalla elegimos la hora en que se va a ejecutar. Tambien elegimos cuando
se va a realizar la tarea y por ultimo la fecha en que comenzara a ejecutarse.
Nos pide una cuenta para ejecutar el script y su contraseña.
Hasta aqui todo bien.
Antes de finalizar, seleccionamos la opcion para que se abran las propiedades de la tarea
que acabamos de crear y asi modificar o revisar lo que hemos creado.
En la captura siguiente vemos las propiedades de la tarea programada ―apagar equipos―.
Si os fijais, en el apartado ―ejecutar‖ tenemos el path al script.
Esto es algo que nos tiene que quedar claro. De por si, tareas programadas lo va a abrir con
el ―block de notas‖ (esto esta comprobado).
Para solvertar este problema, añadimos ―powershell.exe‖ delante del path para que no haya
confusiones y ―tareas programadas‖ lo ejecute con este programa.
Con esto que hemos realizado, el apartado ―ejecutar‖ nos queda: powershell.exe
c:\power\scripts\apagarequipos.ps1.
En general, indicaremos: powershell.exe path\script.ps1
No debemos olvidar de asegurarnos de que la casilla ―Habilitar…―, por que de lo
contrario, la tarea no se ejecutara.
Al realizar alguna modificacion, nos volvera a pedir que volmamos a idicar una cuenta de
usuario para ejecutar el script y la contraseña del mismo.
Pulsamos en el boton aceptar y ya tenemos la ―tarea programada‖ ―apagar equipos‖
creada.
En el caso, como este, de que la tarea programada se ejecute a unas horas intespestivas en
las que no vamos a saber si se ejecuta correctamente, podemos hacer pruebas cambiando la
hora de ejecucion de la misma.
Bueno, hasta aqui ha llegado este asunto.
No os preocupeis por el tema de crear scripts por que nos queda bien poco para empezar a
crearlo y ver algunos ejemplos practicos.
Venga, a pasarlo bien!!
Conocer la version de Windows Powershell
que tenemos instalada
Ya se que puede parecer una tontería, pero en alguna ocasión necesitaremos saber la
versión de Windows Powershell que tenemos instalada en un equipo o servidor porque no
sabemos qué versión es.
Para esto, basta con ejecutar el siguiente comando en una sesión de Windows Powershell:
get-host
El resultado debe ser parecido al que podemos ver en la siguiente captura de pantalla:
Sin nos fijamos, entre otros datos nos muestra el apartado Version a continuación la versión
del Powershell que estamos ejecutando. En mi caso, como podéis observar, tengo la 2.0.
En las versiones de Windows Server 2008 R2 viene instalada por defecto esta versión. Ya
veremos mas adelante cómo sacarle partido a esta versión.
Saludos.
Crear Unidades Organizativas con
Windows Powershell
A la hora de intentar sacarle el mayor partido a Window Powershell, se me antojó que
quería poder crear Unidades Organizativas con un script de Powershell.
Todavía no me he metido con Windows Powershell 2.0, pero lo haré pronto.
Este script es válido para las dos versiones.
Bueno, a lo que vamos… Para crear una Unidad Organizativa mediante Windows
Powershell tenemos que realizar los pasos habituales que realizamos a la hora de crear
cualquier otro objeto del Directorio Activo. Salvando las distancias, eso si.
En primer lugar guardaremos en una variable la conexión al dominio en el que crearemos la
Unidad Organizativa. Os informo, por si no lo sabeis ya, que yo utilizo en dominio
―aic.local‖.
$objDominio=[ADSI]“LDAP://DC=aic,DC=local”
A continuación guardaremos en otra variable el comando de creación de la unidad
organizativa, de la siguiente forma:
$objOU=$objDominio.Create(“OrganizationalUnit”,”ou=prueba”)
Ahora, ya que estamos, incluiremos un comando para rellenar el campo ―descripción‖ de la
Unidad Organizativa.
objOU=Put(“description”,”Unidad Organizativa de prueba”)
Ahora, como siempre, ejecutamos el comando para que se apliquen los anteriores.
$objOU.SetInfo()
Ya está creada la nueva Unidad Organizativa ―prueba‖.
En la captura siguiente podeis ver el script al completo:
Para comprobar lo que acabamos de hacer, abrimos ―Usuarios y Equipos de Active
Directory‖
Hasta aquí llega este tutorial.