Contenidos
Desde el año 2006 Microsoft dispone de una línea de comandos mejorada que se denomina PowerShell (aunque los orígenes de PowerShell datan de años anteriores y el nombre del proyecto se conocía como MONAD), es más potente y rica que la consola de MS-DOS.
PowerShell es una línea de comandos con tecnología de scripting basada en tareas que proporciona a los administradores de tecnologías de la información (TI) un control integral y la posibilidad de automatizar las tareas de administración del sistema.
PowerShell se ha creado sobre .NET Framework, Common Language Runtime (CLR) y .NET Framework, y acepta y devuelve objetos de .NET.
Los comandos (cmdlets, se pronuncia command-let) de PowerShell son sencillos de recordar usan el sistema verbo-nombre para llamar a los cmdlets, los verbos y los nombres están en inglés.
Características
Las principales características de PowerShell son:
- Es un lenguaje de scripting.
- Diseñado para administradores de sistemas.
- Entorno interactivo y shell básica.
- Basado en .NET.
- Controlar y automatizar el sistemas operativo.
- Permite controlar también aplicaciones de Windows.
- Mejora de la antigua shell de Windows y elimina problemas antiguos.
- Incorpora conceptos y ventajas de distintos entornos.
- Realizar tareas de administración relacionadas con el registro, procesos, servicios, eventos, etc.
- Gestión de WMI.
- Diseño sencillo.
- Orientación a objetos. Aunque los cmdlets se escriben como texto, se comportan como objetos.
- Coherencia en los cmdlets, cada cmdlet se puede utilizar siempre de la misma forma. Si hay un cmdlet que ordena no es necesario añadir esa funcionalidad a un nuevo cmdlet.
- Seguridad. Tiene sistemas que controlan la ejecución de scripts y así se evita la ejecución de scripts no deseados.
- Se pueden administrar remotamente.
- Los proveedores de Windows PowerShell permiten obtener acceso a almacenes de datos (como el Registro y el almacén de certificados) con la misma simplicidad con que se obtiene acceso al sistema de archivos.
- Permite realizar automatizaciones al tener el control del sistema operativo.
- Se puede ejecutar en cualquier sistema operativo.
Consola
El programa que sirve para ejecutar PowerShell se llama powershell.exe y la versión versión ISE (el entorno de script integrado) se llama powershell_ise.exe.
Versiones
Hay varias versiones de PowerShell, la última versión estable es la 7.1.2.
Microsoft ha liberado una edición de PowerShell llamada: PowerShell Core.
PowerShell Core es una PowerShell más pequeña que la PowerShell convencional y es multiplataforma, quiere decir que puede instalarse en sistemas operativos: MacOS y Linux, también en Windows.
Ejemplos
Cmdlet que sirve para conocer la versión actual de PowerShell
1 | Get-Host |
¿Cómo puedo saber si una sesión es de PowerShell convencional o bien de PowerShell Core?
Ejecutando en la consola
1 | $PSVersionTable.PSEdition |
Cmdlets
PowerShell tiene comandos que ayudan al usuario a realizar operaciones y obtener resultados, los comandos en PowerShell se conocen como cmdlets.
Los comandos en PowerShell se consideran objetos, el resultado a la hora de ejecutar un cmdlet no es un texto sino un objeto.
Cada cmdlet se puede utilizar por separado pero la principal potencia radica en enlazar varios cmdlets para realizar tareas complejas.
Hay cmdlets básicos y también se pueden crear nuevos.
Cmdlet que sirve para listar todos los cmdlets soportados
1 | Get-Command |
Alias
1 | gcm |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Name {} Verb {} Noun {} Module {PSSnapin} FullyQualifiedModule {} CommandType {Type} TotalCount {} Syntax {} ShowCommandInfo {} ArgumentList {Args} All {} ListImported {} ParameterName {} ParameterType {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Descubrir cmdlets
1 | Get-Command -Name *-Service |
Los cmdlets se pueden ejecutar y verificar el resultado de la ejecución para saber si se ha ejecutado correctamente o no.
Ejemplo
Mostrar algunos cmdlets de PowerShell
1 2 | Get-Process #Ver procesos que se están ejecutando en el sistema |
1 2 | Stop-Process -Name notepad #Parar el proceso Bloc de notas |
1 2 | Get-Date #Ver la fecha actual |
Alias
Los usuarios pueden llamar a los cmdlets como ellos quieren.
Utilizar los nombres de los comandos de otras shells.
Mostrar todos los alias que hay en PowerShell
1 | alias |
Ejemplo
El cmdlet que tiene el alias cls es
1 | alias cls |
Los cmdlet tienen parámetros, también podemos utilizar alias de los parámetros con el siguiente cmdlet
1 | (Get-Command Get-Command).Parameters.Values | Select-Object Name,Aliases |
Ejemplo
Ver los alias de los parámetros del cmdlet Get-Process
1 | (Get-Command Get-Process).Parameters.Values | Select-Object Name,Aliases |
Ayuda
PowerShell dispone de ayuda para utilizar cmdlets, proveedores, funciones, scripts, etc.
Cmdlet de ayuda
1 | Get-Help |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Name {} Path {} Category {} Component {} Functionality {} Role {} Detailed {} Full {} Examples {} Parameter {} Online {} ShowWindow {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ayuda detallada
1 | Get-Help Get-ChildItem -Detailed |
Mostrar todo el contenido de la ayuda
1 | Get-Help Get-ChildItem -Full |
Buscar ayuda online
1 | Get-Help -Name Get-Acl -Online |
Actualizar ayuda
1 | Update-Help |
Canalizaciones
Se realiza entre varios cmdlets, la salida de un segmento del cmdlet es la entrada de otro.
Es uno de los conceptos más útiles de PowerShell porque permite relaciones unos cmdlets con otros.
La canalización se produce con objetos y no con textos.
Ejemplo
Mostrar los procesos ordenador por nombre
1 | Get-Process | Sort-Object Name |
Operaciones
Las operaciones que se pueden realizar con cmdlets son:
Seleccionar
Cmdlet
1 | Select-Object |
Alias
1 | select |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | InputObject {} Property {} ExcludeProperty {} ExpandProperty {} Unique {} Last {} First {} Skip {} SkipLast {} Wait {} Index {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplos
Seleccionar el nombre de los procesos que se están ejecutando
1 | Get-Process | Select-Object Name |
Seleccionar el nombre de los cinco primeros procesos que se están ejecutando
1 | Get-Process | Select-Object Name -First 5 |
Agrupar
Cmdlet
1 | Group-Object |
Alias
1 | group |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | NoElement {} AsHashTable {AHT} AsString {} InputObject {} Property {} Culture {} CaseSensitive {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplo
Agrupar el nombre de los procesos que se están ejecutando
1 | Get-Process | Group-Object |
Ordenar
Cmdlet
1 | Sort-Object |
Alias
1 | sort |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Descending {} Unique {} InputObject {} Property {} Culture {} CaseSensitive {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplos
Ordenar por el nombre los procesos que se están ejecutando
1 | Get-Process | Sort-Object Name |
Ordenar procesos por nombre descendente y uso de CPU ascendente
1 | Get-Process | Sort-Object -Property @{E='Name'; A=$False},@{E='CPU';A=$True} |
Contar
Método en PowerShell
1 | count |
Ejemplo
Contar el número de procesos que se están ejecutando
1 | (Get-Process).count |
Comparar
Cmdlet
1 | Compare-Object |
Alias
1 2 | compare diff |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ReferenceObject {} DifferenceObject {} SyncWindow {} Property {} ExcludeDifferent {} IncludeEqual {} PassThru {} Culture {} CaseSensitive {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplo
Ver los nombres procesos que se están ejecutando en dos momentos distintos y comprar el resultado
1 2 3 | $procesosa=gps | Select-Object Name $procesosb=gps | Select-Object Name Compare-Object -ReferenceObject $procesosa -DifferenceObject $procesosb |
Dar formato
Cmdlets
1 2 3 4 | Format-Custom Format-Table Format-List Format-Wide |
Alias
1 2 3 4 | fc ft fl fw |
Parámetros y alias de los parámetros
Format-Custom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | Property {} Depth {} GroupBy {} View {} ShowError {} DisplayError {} Force {} Expand {} InputObject {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Format-Table
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | AutoSize {} HideTableHeaders {} Wrap {} Property {} GroupBy {} View {} ShowError {} DisplayError {} Force {} Expand {} InputObject {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Format-List
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Property {} GroupBy {} View {} ShowError {} DisplayError {} Force {} Expand {} InputObject {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Format-Wide
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Property {} AutoSize {} Column {} GroupBy {} View {} ShowError {} DisplayError {} Force {} Expand {} InputObject {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplo
Mostrar información sobre los procesos que se están ejecutando con distinto formato
1 2 3 4 | Get-Process | Format-Custom Get-Process | Format-Table Get-Process | Format-List Get-Process | Format-Wide |
Entrada y salida
Cmdlet
1 | Out-File |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | FilePath {} LiteralPath {PSPath} Encoding {} Append {} Force {} NoClobber {NoOverwrite} Width {} NoNewline {} InputObject {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf} |
Ejemplo
Guardar en un fichero la información sobre los procesos que se están ejecutando
1 | Get-Process | Out-File procesos.txt |
Where
Cmdlet
1 | Where-Object |
Alias
1 | where |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | InputObject {} FilterScript {} Property {} Value {} EQ {IEQ} CEQ {} NE {INE} CNE {} GT {IGT} CGT {} LT {ILT} CLT {} GE {IGE} CGE {} LE {ILE} CLE {} Like {ILike} CLike {} NotLike {INotLike} CNotLike {} Match {IMatch} CMatch {} NotMatch {INotMatch} CNotMatch {} Contains {IContains} CContains {} NotContains {INotContains} CNotContains {} In {IIn} CIn {} NotIn {INotIn} CNotIn {} Is {} IsNot {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplo
Mostrar información sobre los procesos que se están ejecutando cuyo nombre sean «svchost»
1 | Get-Process | Where-Object Name -EQ svchost |
Grid
Cmdlet
1 | Out-GridView |
Alias
1 | ogv |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | InputObject {} Title {} Wait {} OutputMode {} PassThru {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplo
Enviar la salida a una tabla interactiva sobre los procesos que se están ejecutando
1 | Get-Process | Out-GridView |
Measure
Cmdlet
1 | Measure-Object |
Alias
1 | measure |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | InputObject {} Property {} Sum {} Average {} Maximum {} Minimum {} Line {} Word {} Character {} IgnoreWhiteSpace {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
Ejemplo
Mostrar tamaños mínimo, máximo y medio de los conjuntos de trabajo de los procesos que se están ejecutado
1 | Get-Process | Measure-Object -Property workingset -Minimum -Maximum -Average |
Seguridad
PowerShell tiene mecanismos de seguridad.
Se puede cambiar la política de ejecución.
El cmdlet que sirve para ver el listado de la política de ejecución de secuencias de comandos de Windows PowerShell
1 | Get-ExecutionPolicy |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 | Scope {} List {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} |
El cmdlet Get-ExecutionPolicy simplemente le indica en cuál de las cuatro políticas de ejecución (políticas que determinan cuáles son los scripts de Windows PowerShell, en su caso, se ejecutarán en su ordenador) se encuentra actualmente en la fuerza.
Las directivas de ejecución de Windows PowerShell se incluyen los siguientes:
- Restricted (restringido) – No hay secuencias de comandos se pueden ejecutar. Windows PowerShell sólo se puede utilizar en modo interactivo.
- AllSigned (todos firmados) – Sólo guiones firmados por un editor de confianza se pueden ejecutar.
- RemoteSigned (firmados remotamente) – guiones descargados deben ser firmados por un editor de confianza antes de que se pueden ejecutar.
- Unrestricted (sin restricción) – No hay restricciones de libre disposición; todos los scripts de Windows PowerShell se pueden ejecutar.
Para cambiar la política de ejecución se utiliza el cmdlet junto con la directiva de ejecución a la que se quiera cambiar
1 | Set-ExecutionPolicy |
Parámetros y alias de los parámetros
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ExecutionPolicy {} Scope {} Force {} Verbose {vb} Debug {db} ErrorAction {ea} WarningAction {wa} InformationAction {infa} ErrorVariable {ev} WarningVariable {wv} InformationVariable {iv} OutVariable {ov} OutBuffer {ob} PipelineVariable {pv} WhatIf {wi} Confirm {cf} |
Ejemplo
Cambiar la política de ejecución a Unrestricted (sin restricción)
1 | Set-ExecutionPolicy Unrestricted |
Entorno de scripting integrado (ISE)
En PowerShell se puede escribir, ejecutar y probar scripts de maneras que no están disponibles en la consola de Windows PowerShell.
Escribir en la consola un script es tedioso, para escribir un script se hace desde el Entorno de scripting integrado.
El entorno de scripting integrado se utiliza para crear, ejecutar y depurar comandos o scripts, en definitiva es una mejora el símbolo de sistema.
El ISE agrega color de sintaxis, finalización con tabulación, IntelliSense, depuración visual y ayuda contextual.
El ISE permite ejecutar cmdlets en un panel de consola, pero también admite paneles que se pueden usar para ver simultáneamente el código fuente del script y otras herramientas que pueden conectarse al ISE. También puede abrir varias ventanas de script al mismo tiempo, lo cual es especialmente útil cuando se depura un script que usa las funciones definidas en otros scripts o módulos.
El editor tiene varias características:
- Color de la sintaxis XML
- Coincidencia de llaves
- Vista Esquema
- Editar texto con arrastrar y colocar
- Zoom
- Copia y pegado de texto enriquecido
Ejercicio
Cambiar el título de PowerShell mediante una alarma a la hora del desayuno
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $code = { # Enviar la interfaz RawUI del proceso host y el contexto de ejecución param($RawUi) do { $HoraActual = Get-Date -Format 'HH:mm' $HoraAlarma = Get-Date -Format 'HH:mm' -Hour 10 -Minute 00 if($HoraActual -eq $HoraAlarma){ # Cambiar título $RawUI.WindowTitle = "Es hora de desayunar" } else { $RawUI.WindowTitle = "Es hora de trabajar" } # Esperar medio segundo Start-Sleep -Milliseconds 500 }while ($true) } $ps = [PowerShell]::Create() $null = $ps.AddScript($code).AddArgument($host.UI.RawUI) $handle = $ps.BeginInvoke() |