Introducción a Windows PowerShell
La importancia de los administradores de sistemas en las empresas no debe subestimarse: una empresa solo puede alcanzar el máximo de su eficiencia económica con una infraestructura de TI fiable y en continuo funcionamiento. Esto requiere, según el tamaño de la organización, que se monitoreen y controlen docenas, si no cientos, de computadoras de forma simultánea. Una tarea colosal que solo puede llevarse a cabo por especialistas capacitados con un profundo conocimiento de los contextos internos del sistema.
Si se produce un problema en varios ordenadores a la vez o si es necesario elegir una nueva solución de seguridad en toda la red lo antes posible, no sería eficiente que un administrador visitara cada dispositivo uno por uno y repitiera siempre los mismos pasos. Windows PowerShell permite acelerar estos procesos y automatizar las tareas rutinarias en la medida de lo posible, lo que simplifica considerablemente el trabajo del responsable del sistema. Averigua en nuestro artículo todas las posibilidades que te ofrece este software.
¿Qué es Windows PowerShell?
Como su nombre indica, Windows PowerShell es una shell (en castellano, intérprete de comandos). En la tecnología de la información, este término hace referencia a una interfaz entre un ordenador y su usuario. El término inglés "shell" significa, literalmente, "concha" pero en sentido figurado se utiliza para describir una “carcasa exterior”. En informática, este término se refiere a la interfaz de usuario visible a través de la cual se puede interactuar con las funciones internas del sistema en un ordenador.
Las shells suelen estar orientadas a comandos y, por lo tanto, se controlan exclusivamente con el teclado y la entrada de texto. Son una alternativa a las interfaces gráficas de usuario (GUI) en las que se navega principalmente con el ratón, como el Explorador de Windows. Dado que las shells también proporcionan acceso a un número mayor y más profundo de funciones y componentes del PC, son los preferidos por muchos profesionales de TI y administradores de sistemas.
Las shells suelen estar orientadas a comandos y, por lo tanto, se controlan exclusivamente con el teclado y la entrada de texto. Son una alternativa a las interfaces gráficas de usuario (GUI) en las que se navega principalmente con el ratón, como el Explorador de Windows. Dado que las shells también proporcionan acceso a un número mayor y más profundo de funciones y componentes del PC, son los preferidos por muchos profesionales de TI y administradores de sistemas.
¿Para qué sirve Windows PowerShell?
Hasta hace poco, command.com y cmd.exe eran los intérpretes de líneas de comandos por defecto en los sistemas operativos DOS y Windows, ya que permiten a los usuarios avanzados abrir aplicaciones de consola, solucionar problemas o navegar por las unidades de un PC. Por ejemplo, el comando netstat permite obtener datos básicos sobre todas las actividades de la red. Sin embargo, command.com y cmd.exe siempre han tenido dos problemas: no tienen acceso a todos los componentes del sistema y sus lenguajes de script se consideran limitados en su funcionalidad. Por lo tanto, siempre se han considerado menos eficientes y completos que los shells de Linux y Unix actuales.
Como resultado, los desarrolladores de Microsoft empezaron en la década de 1990 a pensar cómo eliminar estas restricciones. Con el paso del tiempo desarrollaron diferentes shells. Una de las primeras soluciones que crearon fue Monad, que se introdujo por primera vez en 2003 y cambió su nombre por el de PowerShell tres años más tarde, resultando ser particularmente innovadora.
Gracias a los “Common Engineering Criteria” de Microsoft, que establecen que a partir de 2009 todos los productos de servidor de la empresa sean compatibles con PowerShell, la herramienta se ha convertido en la solución central de administración y automatización en Windows. Opcional desde Windows 2008 y estándar en las versiones posteriores, el software también está disponible bajo descarga como marco de trabajo de código abierto para versiones anteriores de Windows.
Como resultado, los desarrolladores de Microsoft empezaron en la década de 1990 a pensar cómo eliminar estas restricciones. Con el paso del tiempo desarrollaron diferentes shells. Una de las primeras soluciones que crearon fue Monad, que se introdujo por primera vez en 2003 y cambió su nombre por el de PowerShell tres años más tarde, resultando ser particularmente innovadora.
Gracias a los “Common Engineering Criteria” de Microsoft, que establecen que a partir de 2009 todos los productos de servidor de la empresa sean compatibles con PowerShell, la herramienta se ha convertido en la solución central de administración y automatización en Windows. Opcional desde Windows 2008 y estándar en las versiones posteriores, el software también está disponible bajo descarga como marco de trabajo de código abierto para versiones anteriores de Windows.
En 2016 se tomó la decisión de ofrecer la consola en todas las plataformas. La intención de Microsoft detrás de esta idea es que PowerShell se convierta en una herramienta universal para administradores de sistemas de forma independiente al sistema operativo en el que se trabaje, como Linux y macOS. Desde entonces, este shell se ha ido extendiendo más y más.
¿Cuál es la diferencia entre PowerShell y la línea de comandos común?
Pero ¿qué es exactamente lo que distingue al nuevo marco de trabajo de Microsoft de la conocida línea de comandos? En pocas palabras, PowerShell tiene todas las características de cmd.exe pero también realiza otras tareas que antes eran impensables en Windows.
PowerShell proporciona básicamente el mismo rango de comandos que cmd.exe. Si se conocen los comandos estándar más comunes se puede utilizar de la misma manera que la línea de comandos. Sin embargo, también permite el acceso a elementos internos más profundos de Windows a los que antes no se podía acceder con cmd.exe, por ejemplo, el Registry y la Windows Management Instrumentation (WMI). La línea de comandos de Windows PowerShell sigue, además, la lógica de una estructura de comandos y sintaxis consistentes. En este sentido supera a la línea de comandos.
Otra característica que hace destacar a Windows PowerShell es que, a diferencia de la línea de comandos y los sistemas tipo Unix, el programa está basado en objetos, en lugar de emitir los resultados de los comandos en forma de texto (strings). Cada objeto tiene propiedades (properties) y métodos (methods) que definen cómo se puede utilizar. Por ejemplo, el objeto de proceso de Windows representa propiedades tales como nombres de proceso e IDs, así como métodos para pausar y terminar procesos.
Debido a que los resultados de los comandos siempre se emiten como objetos .NET, PowerShell permite por segmentación (pipelining) realizar tareas mucho más complejas que cmd.exe. Esta función utiliza la salida de un objeto como entrada para el siguiente objeto. De esta forma podrían filtrarse volúmenes grandes y complejos de datos por extensiones de archivo y emitirse como un listado más fácil de leer.
Windows PowerShell no es solo una línea de comandos, sino que también actúa como entorno de scripting potente y sofisticado. En él se pueden escribir comandos propios o combinar varios para simplificar las tareas de gestión del sistema. El control remoto también permite ejecutar secuencias de comandos en cualquier número de sistemas de forma simultánea, independientemente de la ubicación y, por lo tanto, administrarlos, configurarlos, registrarlos y repararlos.
Esta variedad de opciones y características también revela cuál es el principal público objetivo de Windows PowerShell: profesionales de TI y administradores de sistemas que tienen un profundo conocimiento de los shells y están dispuestos a familiarizarse con PowerShell para una mayor eficiencia en su trabajo. Sin embargo, para los usuarios que trabajan principalmente con la interfaz gráfica de usuario de Windows y solo utilizan la ventana de comandos esporádicamente, PowerShell no ofrece ningún valor añadido particular, especialmente porque el tiempo requerido para adquirir los conocimientos necesarios es bastante alto.
A continuación, te ofrecemos un rápido resumen de las ventajas y desventajas de Windows PowerShell en comparación con la línea de comandos:
PowerShell proporciona básicamente el mismo rango de comandos que cmd.exe. Si se conocen los comandos estándar más comunes se puede utilizar de la misma manera que la línea de comandos. Sin embargo, también permite el acceso a elementos internos más profundos de Windows a los que antes no se podía acceder con cmd.exe, por ejemplo, el Registry y la Windows Management Instrumentation (WMI). La línea de comandos de Windows PowerShell sigue, además, la lógica de una estructura de comandos y sintaxis consistentes. En este sentido supera a la línea de comandos.
Otra característica que hace destacar a Windows PowerShell es que, a diferencia de la línea de comandos y los sistemas tipo Unix, el programa está basado en objetos, en lugar de emitir los resultados de los comandos en forma de texto (strings). Cada objeto tiene propiedades (properties) y métodos (methods) que definen cómo se puede utilizar. Por ejemplo, el objeto de proceso de Windows representa propiedades tales como nombres de proceso e IDs, así como métodos para pausar y terminar procesos.
Debido a que los resultados de los comandos siempre se emiten como objetos .NET, PowerShell permite por segmentación (pipelining) realizar tareas mucho más complejas que cmd.exe. Esta función utiliza la salida de un objeto como entrada para el siguiente objeto. De esta forma podrían filtrarse volúmenes grandes y complejos de datos por extensiones de archivo y emitirse como un listado más fácil de leer.
Windows PowerShell no es solo una línea de comandos, sino que también actúa como entorno de scripting potente y sofisticado. En él se pueden escribir comandos propios o combinar varios para simplificar las tareas de gestión del sistema. El control remoto también permite ejecutar secuencias de comandos en cualquier número de sistemas de forma simultánea, independientemente de la ubicación y, por lo tanto, administrarlos, configurarlos, registrarlos y repararlos.
Esta variedad de opciones y características también revela cuál es el principal público objetivo de Windows PowerShell: profesionales de TI y administradores de sistemas que tienen un profundo conocimiento de los shells y están dispuestos a familiarizarse con PowerShell para una mayor eficiencia en su trabajo. Sin embargo, para los usuarios que trabajan principalmente con la interfaz gráfica de usuario de Windows y solo utilizan la ventana de comandos esporádicamente, PowerShell no ofrece ningún valor añadido particular, especialmente porque el tiempo requerido para adquirir los conocimientos necesarios es bastante alto.
A continuación, te ofrecemos un rápido resumen de las ventajas y desventajas de Windows PowerShell en comparación con la línea de comandos:
¿Por qué elegir PowerShell? | ¿Qué desventajas tiene PowerShell? |
Todos los comandos disponibles desde la línea de comandos | Requiere grandes conocimientos |
Acceso a elementos internos más profundos de Windows como los registros y WMI | Dirigido principalmente a profesionales de TI y administradores de sistemas |
Funcionamiento más eficiente gracias a una estructura de comandos y una sintaxis coherentes | Ningún beneficio incrementado para los usuarios acostumbrados a una GUI y que raramente usan la línea de comandos |
La orientación completa a objetos permite la ejecución de tareas más complejas mediante pipelining | Acostumbrarse cuesta un poco |
Un completo entorno de scripting permite una automatización eficiente de los procesos | |
Administración independiente de la ubicación de varios sistemas por control remoto |
¿Cómo funciona Windows PowerShell?
PowerShell consta básicamente de dos componentes, a saber, el motor PowerShell y el lenguaje de scripts PowerShell. Ambos pueden utilizarse por separado o en combinación para obtener la máxima funcionalidad del programa.
El funcionamiento de PowerShell
El intérprete de línea de comandos (en inglés, command-line interpreter o CLI) de PowerShell proporciona al usuario acceso a las funciones internas del sistema operativo mediante entradas de teclado. Los comandos del programa se denominan "cmdlets" (pronunciados "commandlets", que corresponden aproximadamente a la palabra "pequeños comandos"). Según una sintaxis consistente, siempre se componen de un verbo y un sustantivo en singular, por ejemplo, Stop-Process o Sort-Object. Los parámetros se especifican en un cmdlet según la fórmula -Parámetro [Valor], por ejemplo:
Get-EventLog System Newest 3 (para llamar a las tres entradas más recientes en el registro de eventos del sistema)
En PowerShell se suelen introducir comandos con mayúsculas, pero las minúsculas también funcionan.
Los más de 100 cmdlets de núcleo también incluyen comandos estándar de uso frecuente desde la línea de comandos, disponibles entre otros “alias” entre otros para ayudar a los usuarios a comenzar con el nuevo intérprete de comandos. Por ejemplo, el comando cd, destinado a cambiar un directorio, tiene el equivalente Set-Location, que realiza exactamente la misma función. Para ver todos los alias predeterminados, utiliza el cmdlet Get-Alias. También puedes utilizar el cmdlet Set-Alias para crear tus propios alias. Por ejemplo, puedes utilizar la siguiente secuencia para asignar el alias "ed" al comando "notepad" (para el programa Notepad), de modo que se necesiten menos pulsaciones de teclas para ejecutar el programa:
Set-Alias ed notepad (para abrir Notepad con el comando ed)
Set-Alias scr1 C:\Users\IEUser\Desktop\script1.ps1 (para iniciar un script con la abreviatura scr1)
La siguiente tabla muestra algunos ejemplos de cmdlets de uso más frecuente y sus alias correspondientes:
Alias | Cmdlet | Función |
cd | Set-Location | Cambiar el directorio actual |
dir | Get-ChildItem | Enumerar todos los elementos de una carpeta |
gi | Get-Item | Llamada a un elemento específico |
ps | Get-Process | Listar todos los procesos |
gsv | Get-Service | Listar todos los servicios instalados |
gm | Get-Member | Visualizar todas las propiedades y los métodos de un objeto |
clear | Clear-Host | Vaciar el host PowerShell |
La estructura de comandos sencilla y fácil de entender de PowerShell te permite trabajar de forma más eficiente que en la línea de comandos. Para ahorrar aún más tiempo, puedes utilizar la tecla [Tab] para completar automáticamente cmdlets escritos parcialmente. En muchos casos, el programa incluso reconoce comandos escritos de forma incompleta.
Los cmdlets pueden ejecutarse de forma individual o en conjunto para que el siguiente objeto pueda leer y reutilizar la llamada a un objeto. Para añadir dos cmdlets al mismo conjunto, simplemente utiliza el icono |. De esta manera, por ejemplo, puedes listar todos los procesos disponibles y al mismo tiempo clasificarlos por su ID:
Los cmdlets pueden ejecutarse de forma individual o en conjunto para que el siguiente objeto pueda leer y reutilizar la llamada a un objeto. Para añadir dos cmdlets al mismo conjunto, simplemente utiliza el icono |. De esta manera, por ejemplo, puedes listar todos los procesos disponibles y al mismo tiempo clasificarlos por su ID:
Get-Process | Sort-Object ID
Las variables se definen con el símbolo $. Como de costumbre, se pueden utilizar para almacenar funciones de modo que se pueda acceder a ellas de nuevo en un momento posterior durante el proceso. PowerShell es incluso capaz de almacenar los resultados de múltiples comandos a la vez, por ejemplo:
$a = (Get-Process | Sort-Object ID)
El lenguaje de scripts PowerShell
Gran parte del lenguaje de programación de PowerShell puede parecerse a algunos lenguajes de programación, como C# y otros. No solo puedes usarlo para escribir tus propios cmdlets (y compartirlos con otros usuarios si es necesario), sino que también puedes juntar múltiples comandos de secuencia en un archivo de script con el formato .ps1 para ampliar la funcionalidad del shell. Se pueden concebir numerosos ejemplos de aplicación: desde la ejecución de tareas rutinarias sencillas hasta la automatización casi completa de procesos de supervisión y control. Los scripts siempre contienen una descripción de la aplicación y se ejecutan con el prefijo ".". Un ejemplo:
.C:\Users\IEUser\Desktop\script1.ps1
¿Cuáles son las aplicaciones típicas de PowerShell?
Con suficiente práctica y experiencia, Windows PowerShell puede hacer que muchas tareas de administración de sistemas sean mucho más eficientes. A continuación, te explicaremos cuatro ejemplos típicos de su aplicación.
Organización de directorios: renombrar varios archivos a la vez
Imagina que necesitas renombrar alrededor de 1 000 documentos con el esquema texto (1).docx, texto (2).docx, etc., de tal manera que los espacios vacíos en el nombre del archivo se reemplacen por guiones bajos. En ese caso, no sería aconsejable cambiarlos uno a uno, sino que probablemente usarías cmd.exe o –aún mejor– una herramienta externa. PowerShell permite aún más flexibilidad a la hora de renombrar grandes cantidades de datos.
Para ello, dirígete primero al directorio en el que se encuentran los documentos. Esto se puede hacer fácilmente usando el cmdlet Set-Location en combinación con la ruta completa del archivo. He aquí un ejemplo:
Para ello, dirígete primero al directorio en el que se encuentran los documentos. Esto se puede hacer fácilmente usando el cmdlet Set-Location en combinación con la ruta completa del archivo. He aquí un ejemplo:
Set-Location C:\Users\IEUser\Desktop\Text folder
También puedes usar el Explorador de Windows para navegar al directorio apropiado, hacer clic en la barra de ruta y entrar en "powershell" para abrir una ventana del directorio. Utiliza el siguiente cmdlet para renombrar los documentos seleccionados:
Get-ChildItem *docx | Rename-Item -NewName {$_.name -replace " ","_"}
Explicación: Get-ChildItem lista todos los archivos del directorio. La adición *docx solo filtra los documentos de Word con el formato correspondiente –los documentos PDF en la carpeta tampoco se tendrán en cuenta. Utiliza el icono | para añadir otro comando al conjunto, Rename-Item, indica que algo debe ser renombrado. -NewName especifica el nuevo nombre usando un bloque de script que funciona con la variable $_.name que representa el objeto actual. Y .name es la propiedad con el nombre del archivo. Por último, utiliza el parámetro -replace para especificar que todos los espacios deben convertirse en guiones bajos.
Adquisición de datos: comprobación de los servicios en ejecución en un PC
Antes de implementar una nueva solución de seguridad en la red, debes comprobar qué servicios ya están instalados en un PC determinado. La herramienta básica es el cmdlet Get-Service, que enumera todos los servicios. También puedes utilizar las funciones de filtro de PowerShell para mostrar solo un subconjunto de los resultados, por ejemplo, todos los servicios en ejecución. Esto funciona con el siguiente cmdlet:
Get-Service | Where-Object {$_.status -eq "running"}
La salida de Get-Service dirige al cmdlet Where-Object, que filtra todos los servicios por su estado (representado por la variable $_.status y el parámetro -eq "running") y lista los servicios en ejecución. Si es necesario, también puedes clasificar la lista prefiltrada por nombre de visualización añadiendo otro cmdlet al conjunto:
Get-Service | Where-Object {$_.status -eq "running"} | Sort-Object DisplayName
Con la adición de more al conjunto también puedes reestructurar la larga lista de servicio para que puedas navegar a través de ella página por página.
Solución de problemas: buscar errores del sistema en el registro de eventos
Los registros de eventos proporcionan a los administradores del sistema información sobre los mensajes de error en las aplicaciones, el sistema operativo o las funciones de seguridad de un dispositivo. Utiliza el comando Get-EventLog para ver y administrar estos registros. Por ejemplo, si deseas ver los mensajes de error en la pantalla de eventos "Sistema", introduce lo siguiente:
Get-EventLog System | Where-Object {$_.entryType -Match "Error"}
Si PowerShell devuelve demasiados resultados, puedes utilizar el parámetro -Newest 100 para restringir la lista a las 100 entradas de registro de sistema más recientes, que luego se filtran para detectar errores:
Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"}
Para obtener información detallada sobre los mensajes de error individuales, reenvía la salida de este conducto a Cmdlet Format-List:
Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} | Format-List
Telemantenimiento: servicios de control en ordenadores remotos
Windows Management Instrumentation (WMI) proporciona acceso a casi todos los ajustes y funciones de los ordenadores con Windows y es, por lo tanto, la herramienta más importante para la automatización de procesos y para el mantenimiento remoto de estaciones de trabajo digitales. También puedes aplicar el cmdlet Get-WmiObject asociado a equipos remotos, de modo que puedas usar Windows PowerShell como herramienta de administración del sistema. Por ejemplo, si necesitas información de la clase Win32_BIOS sobre un ordenador de la red (representado por el parámetro -ComputerName), el siguiente comando te ayudará:
Get-WmiObject Win32_Bios -Computername
Alternativamente, puedes trabajar con el parámetro -Class seguido de la ruta completa de la clase:
Get-WmiObject -Rechnername -Class Win32_Service
Ahora puedes acceder de forma remota a la configuración interna del sistema del ordenador de terceros. El siguiente ejemplo muestra cómo obtener los métodos del servicio de Cliente de Windows Update para averiguar qué cmdlets se pueden usar para iniciarlo, detenerlo y reiniciarlo:
Get-WmiObject -Computername -Class Win32_Service -Filter "Name='wuauserv'"
Como puedes ver, el nombre de host Get-WmiObject primero localiza el host deseado y luego selecciona la clase Win32_Service usando el parámetro -Class. El Cliente de Windows Update con la abreviatura wuauserv se filtra de los servicios existentes. El conocido cmdlet Get-Member y el parámetro -Type Method te proporcionan una visión general de todos los métodos de wuauserv que te permiten controlar el cliente de forma remota:
Get-WmiObject -Computername -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method