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.
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.
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í:
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).
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).
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...