🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. PowerShell Core y Windows PowerShell
  3. Descubrimiento de PowerShell
Extrait - PowerShell Core y Windows PowerShell Los fundamentos del lenguaje (2a edición)
Extractos del libro
PowerShell Core y Windows PowerShell Los fundamentos del lenguaje (2a edición)
2 opiniones
Volver a la página de compra del libro

Descubrimiento de PowerShell

Presentación de PowerShell

PowerShell es a la vez un intérprete de comandos y un potente lenguaje de scripts. Saca su potencia gracias en gran parte al Framework .NET en el que se apoya. Conocido por los desarrolladores, el Framework .NET lo es menos por parte de los administradores de sistemas y del resto de desarrolladores de scripts; lo cual es normal... Para entenderlo en pocas palabras, el Framework .NET es una biblioteca de clases inmensa a partir de la cual crearemos objetos; objetos que nos permitirán actuar sobre el conjunto del sistema operativo con un mínimo esfuerzo. Todos los que han probado la potencia del Framework .NET no escatimarán en halagos sobre él. Es por lo tanto gracias a este último como PowerShell desarrolla toda su inteligencia y su orientación a objetos. Y es esta característica de manipular objetos la que hace de PowerShell ¡una shell de excepción!

Con PowerShell no trabajará únicamente con texto, como es el caso con la mayoría de las demás shells, sino con objetos; y esto sin apenas darse cuenta. Por ejemplo, cuando use una pipe «|» para pasar datos a un comando, no transmitirá texto, sino un objeto con todo lo que lo caracteriza (sus propiedades y sus métodos). Gracias a esto es cómo los scripts PowerShell son, por lo general, más concisos que en los demás lenguajes tales como VBScript por citar solo...

Histórico de versiones

En los años 2003-2004, la firma de Redmond comprende que le falta un lenguaje de script de verdad, homogéneo pero sobre todo que ya era hora que todos sus productos de la gama System Center pudieran administrarse completamente por línea de comandos. 

Por este motivo, el proyecto Monad vio la luz, proyecto que producirá a finales del 2006 la primera versión de PowerShell. Hasta la versión 3, el ritmo de aparición de versiones se realizaba cada tres años, que se correspondía con la aparición de las versiones de Windows. Desde 2012, el ritmo se ha acelerado claramente y el ciclo se ha reducido a la mitad, lo que supone contar con una nueva versión cada dieciocho meses. Este ritmo sostenido no es producto del azar; es el fruto de la adopción de un enfoque Agile dentro de Microsoft, que consiste en publicar productos más a menudo, aunque con menos nuevas funcionalidades. Este enfoque se contrapone al utilizado hasta el momento, que consistía en publicar una nueva versión principal con muchísimas evoluciones pero a un ritmo mucho más lento. Este nuevo paradigma se enmarca de lleno en el enfoque DevOps, del que tendremos ocasión de hablar más detenidamente... Monad.

images/EI01-01.PNG

Histórico de la aparición de versiones

En el mundo de PowerShell, 2016 es una fecha clave, pues ese año apareció la primera versión...

Plataformas soportadas

1. Plataformas cliente

Versiones soportadas

Windows 7 SP1

Windows 8.1

Windows 10

V3 / Frarmework .NET 4.0

A instalar

V4 / Frarmework .NET 4.5

A instalar

Nativo

V5.1 / Frarmework .NET 4.5.2

A instalar

A instalar

Nativo

V6.0 (Core) / .NET Core 2.0

A instalar

A instalar

A instalar

Las celdas vacías significan que la configuración no está soportada. La mención «A instalar» significa que es posible instalar PowerShell (en la versión precisada en la línea correspondiente) sobre esta plataforma. «Nativo» indica que PowerShell está instalado de manera nativa.

Cabe destacar que Windows PowerShell 2.0 ya no está soportado por Microsoft desde agosto de 2017.

2. Plataformas servidor

Versiones soportadas

Windows Server 2008 R2

Windows Server 2012/R2

Windows Server 2016

Mac OS

Linux

V3 / Frarmework  .NET 4.0

A instalar

V4 / Frarmework  .NET 4.5

A instalar

Nativo

V5.1 / Frarmework  .NET 4.5.2

A instalar

A instalar

Nativo

V6.0 (Core) /  .NET Core 2.0

A instalar

A instalar

A instalar

A instalar

A instalar

Antes de utilizar PowerShell en las versiones mencionadas arriba, tendrá que realizar dos operaciones. La primera, obligatoria, es verificar la versión del Framework .NET instalada, y realizar una actualización de la versión si lo necesita. En efecto, como mencionamos en la introducción, PowerShell...

Comenzando con PowerShell

Además de la consola por línea de comandos, existe desde la versión 2.0 un excelente entorno de desarrollo de scripts PowerShell en modo gráfico llamado PowerShell ISE. La ventaja de este es que se instala de base en todas las versiones de Windows. Su «inconveniente» es que solo es compatible con Windows PowerShell. Por consiguiente, deja de lado a PowerShell Core.

Por este motivo, desde hace poco, Microsoft da preferencia a un ordenador personal de desarrollo multiplataforma llamado Visual Studio Code. Este entorno de desarrollo es polivalente, pues es compatible con todas las ediciones de PowerShell y está disponible para todas las plataformas (Windows, Mac, Linux).

En un primer momento, nos interesaremos en la consola «clásica», consola que podríamos calificar de «histórica» por el hecho de que existe desde la primera versión.

1. Consola Windows PowerShell clásica

a. Arranque de la consola

Cuando arrancamos la consola PowerShell, debemos saber que esta se ejecuta con permisos simples de usuario y por lo tanto limitados; y eso aunque abramos nuestra sesión con una cuenta de administrador. No se sorprenda por lo tanto si se le deniega el acceso a ciertos directorios, a ciertas claves de registro o a ciertos comandos. Esto es debido a un conocido mecanismo de seguridad llamado «User Access Control» (UAC), en castellano «control de cuentas de usuario»

Para abrir una consola clásica o gráfica (ISE) con permisos de Administrador, debe sistemáticamente hacer clic con el botón derecho en el icono de PowerShell (o PowerShell ISE) y elegir Ejecutar como Administrador (o Run as Administrator en un sistema en inglés) como sigue.

images/EIN01-RunAs.PNG

Ejecutar como Administrador - Menú contextual

Verá la diferencia entre las consolas PowerShell abiertas como administrador y las que no lo son observando el título de la ventana arriba a la izquierda de estas, como se muestra aquí:

images/01EIT01.png

Ejecutar como Administrador - título de la ventana

b. Descubrir la conola

A simple vista, no es posible distinguir una ventana «consola PowerShell» de una ventana «línea de comandos CMD.exe», salvo por el color de fondo, que difiere (azul para una y negro para la otra).

images/01EIT02.png

Consola Windows PowerShell «clásica» al arrancar

El año...

Una transición suave con el pasado

Los scripts son retro compatibles, es decir que, por ejemplo, los scripts escritos para la versión 1 de PowerShell funcionarán con la versión 5.x. Al menos en principio... ya que cada nueva versión aporta potencialmente nuevas palabras claves, comandos y variables y por lo tanto si por mala suerte los ha empleado como nombres de variables o funciones podría entonces encontrar algunos problemas... Pero no se preocupe ya que en más de un 99% de los casos no existe ningún problema, o es que no ha tenido suerte.

Sin embargo, conviene matizar esto un poco, pues desde PowerShell 6 las cosas han cambiado ligeramente. En efecto, como dijimos al principio del capítulo, PowerShell 6 representa en cierto modo una renovación dentro del ecosistema PowerShell debido a que actualmente es open source y multiplataforma. Microsoft ha autorizado numerosos «breaking changes», entendiéndolos como cambios que podrían producir un mal funcionamiento en scripts existentes.

En cuanto a los incondicionales de CMD que todavía no se han convertido a PowerShell, que no se preocupen: PowerShell no elimina lo del pasado. Prácticamente todos los comandos que se encontraban en CMD lo están también en PowerShell; algunos se encuentran en forma de alias, de funciones, o de archivos externos. Estos últimos son entonces los comandos originales....

Sistema de ayuda integrado

Desde PowerShell 3.0, la filosofía de Microsoft en cuanto al sistema de ayuda integrado ha cambiado mucho. En las anteriores versiones, la ayuda venía instalada de forma estándar y estaba disponible en español. Ya no es el caso desde la versión 3...

Así para poder aprovechar el sistema de ayuda, muy completo por otro lado (pero exclusivamente en inglés), debe descargar la ayuda. Aunque esto parezca una limitación a primera vista, nos garantiza disponer de las últimas versiones de los archivos de ayuda disponibles. En efecto, Microsoft actualiza la ayuda con regularidad y es posible obtener dichas actualizaciones, cosa que no era posible anteriormente. Solo existe un pequeño inconveniente: la máquina sobre la que queremos descargar la ayuda, debe disponer de acceso directo a Internet, es decir sin pasar por un proxy, o que un administrador la haya descargado con antelación y la comparta por red. Además, debe ser administrador de su equipo para poder actualizar la ayuda.

Pero no se preocupe demasiado ya que PowerShell proporciona todos los comandos para disponer de la ayuda en un entorno empresarial.

Si la ayuda no está instalada en su sistema, se dará cuenta rápidamente ya que propone únicamente la ayuda sintáctica. Dicho de otro modo, solo tendrá acceso a las proposiciones de los nombres de los parámetros sin más explicación.

Ejemplo

Petición de ayuda de un comando cuando esta no se encuentra instalada.

PS > help update-help 
 
NAME 
   Update-Help 
 
SYNTAX 
   Update-Help [[-Module] <string[]>] [[-SourcePath] <string[]>] 
[[-UICultur... 
 
   Update-Help [[-Module] <string[]>] [[-UICulture] <cultureinfo[]>] 
[-Liter... 
 
 
ALIASES 
   None ...

Comandos básicos

Antes de todo, PowerShell es un entorno en línea de comandos al servicio del sistema operativo pero también y sobre todo al servicio de los usuarios. Y como tal, se instala con una serie de comandos que debe conocer, o por lo menos saber cómo encontrarlos cuando falla la memoria...

1. Estructura de los comandos

Los comandos PowerShell con llamados cmdlets (por command-applets), aunque la mayor parte del tiempo diremos, simplemente, comandos. Están estructurados de la siguiente manera: un verbo seguido de un nombre separado por un guión (-): verbo-nombre. Por ejemplo, Get-Command.

El verbo (evidentemente en inglés) describe la acción a realizar sobre el nombre. En el anterior ejemplo, recuperamos (Get) los comandos (Command).

Con PowerShell encontramos numerosos verbos genéricos tales como Get, Set, Add, Remove, etc. que se combinan con diferentes nombres como Path, Variable, Item, Object, Computer, etc.

Los nombres que constituyen los comandos están siempre en singular; y esto es válido también para los parámetros.

Por lo tanto, es posible, mezclando verbos y nombres, acordarse fácilmente de un buen número de comandos. Tenga en cuenta que los comandos, así como sus parámetros asociados, pueden escribirse indistintamente en mayúsculas o en minúsculas. El analizador sintáctico PowerShell no es case sensitive (salvo en el caso de PowerShell 6 para Mac OS o Linux).

Encuentre la lista completa de verbos oficiales y sus grupos de aplicación usando el comando Get-Verb.

Es habitual, y es siempre una buena práctica, elegir siempre un verbo aprobado cuando creamos funciones o scripts que vayan a usar otros usuarios, y incluso con el fin de preservar una cierta homogeneidad global entre sus propios comandos y los de Microsoft.

2. Get-Command

Si solo fuera a quedarse con uno, entonces quédese con este: Get-Command. Este comando permite descubrir todos los comandos PowerShell. Sin precisar parámetro alguno. Get-Command devuelve también los alias y las funciones de la sesión. De momento, nos interesaremos solamente en los comandos, y para ello añadimos el parámetro -CommandType seguido del tipo de comando elegido, a saber cmdlet.

PS > Get-Command -CommandType cmdlet 
 
CommandType Name                  ...

Gestión de carpetas y archivos

Hemos visto que podíamos utilizar los viejos comandos DOS/CMD para desplazarnos en la jerarquía de carpetas. Aunque se pueda hacer todavía y permita ganar tiempo a quienes los utilizan, esto no le quita nivel a sus conocimientos de PowerShell.

Cuando teclea DIR en PowerShell, en realidad llama a un alias. El alias ejecuta el comando Get-ChildItem. Para verificarlo, teclee el siguiente comando:

PS > Get-Alias dir 
 
CommandType     Name                     ModuleName 
-----------     ----                     ---------- 
Alias           dir -> Get-ChildItem 

Debajo presentamos una tabla con los principales comandos CMD y sus equivalentes en PowerShell.

DOS/CMD

Equivalente PowerShell (alias)

Cmdlet PowerShell

Descripción

dir

dir, qci, ls

Get-ChildItem

Muestra el contenido de una carpeta.

cd

cd, chdir, sl

Set-Location

Cambia de carpeta.

md

md, ni

New-Item

Crea un archivo/carpeta.

rd

del, erase, rd, ri, rm, rmdir

Remove-Item

Suprime un archivo/carpeta.

move

mi, move, mv

Move-Item

Mueve un archivo/carpeta.

ren

ren, rni

Rename-Item

Renombra un archivo/carpeta.

copy

copy, cp, cpi

Copy-Item

Copia un archivo/carpeta.

Como el objetivo de este libro es el aprendizaje de PowerShell, nos esforzaremos en no utilizar los antiguos comandos CMD, ¡y animamos a que haga lo mismo!

Nos damos cuenta de que existen muchos alias vinculados al mundo Unix, tales como ls, rm, cp. Estos se han creado para facilitar el acceso a PowerShell a aquellas personas que provengan de estos entornos. Cabe destacar que estos alias solo existen en PowerShell para Windows. En efecto, se han eliminado en PowerShell 6 únicamente sobre las plataformas Mac OS y Linux (y solo en estas plataformas) para dejar la posibilidad de invocar los verdaderos comandos nativos.

1. Get-ChildItem (alias: gci, ls, dir)

Este comando permite obtener los archivos y carpetas presentes en el sistema de archivos.

Por ejemplo, observemos el resultado del siguiente comando:

PS > gci C:\ 
 
   Directory : C:\ 
 
Mode         LastWriteTime  Length Name 
----         -------------  ------ ---- 
d---- 26/07/2012     09:44         PerfLogs 
d-r-- 28/10/2012...

Proveedores PowerShell

Ahora que está familiarizado con la serie de comandos que permiten navegar y gestionar una jerarquía de archivos y carpetas, podemos confesar que estos comandos permiten realizar muchas otras cosas...

Todos los comandos que hemos visto anteriormente (familias *-Item y *-Location) permiten la manipulación no solo del sistema de archivos, sino también:

  • de la base de registro,

  • de las variables,

  • de las variables de entorno,

  • de los alias,

  • de la base de certificados X.509 de su equipo,

  • de las funciones,

  • y de la continuación WSMan (útil para la funcionalidad Remote PowerShell).

Un certificado X.509 permite firmar y/o cifrar datos.

Esto explica la generalización en los nombres de los comando *-Item, en la medida en la que un «item» puede representar por ejemplo un archivo, una carpeta, una clave de registro, una variable o cualquier otra cosa.

Todas las fuentes de datos que acabamos de enumerar antes son accesibles por medio de lo que llamamos en la jerga PowerShell los proveedores (encontramos también con bastante frecuencia los términos Provider o PSProvider). Son dieciocho, aunque por defecto solo se muestran seis. Para obtener la lista y los detalles asociados, teclee el comando Get-PSProvider.

PS > Get-PSProvider 
 
Name        Capabilities                       Drives 
----        ------------                       ------ 
Alias       ShouldProcess                      {Alias} 
Environment ShouldProcess                      {Env} 
FileSystem  Filter, ShouldProcess, Credentials {C, E, D, F} 
Function    ShouldProcess                      {Function} 
Registry    ShouldProcess...