# 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.

[![Imagen: Ventana de comandos de Windows PowerShell](https://www.ionos.mx/digitalguide/fileadmin/_processed_/b/5/csm_windows-powershell_a32ab83ac1.webp "Ventana de comandos de Windows PowerShell")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell.png) A primera vista, Windows PowerShell se parece mucho a la línea de comandos del sistema aunque presenta diferencias fundamentales.       ##  ¿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.

## ¿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](https://www.ionos.mx/digitalguide/servidores/herramientas/una-introduccion-a-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.

[![Imagen: Windows PowerShell en los resultados de búsqueda del Explorador de Windows](https://www.ionos.mx/digitalguide/fileadmin/_processed_/e/d/csm_windows-powershell2_8f36484730.webp "Windows PowerShell en los resultados de búsqueda del Explorador de Windows")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell2.png) Windows PowerShell está instalado de forma predeterminada en todas las versiones de Windows desde 2008.       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 v**entajas y desventajas de Windows PowerShell** en comparación con la línea de comandos:

<table>
  <tbody>
    <tr>
      <td><strong>¿Por qué elegir PowerShell?</strong></td>
      <td><strong>¿Qué desventajas tiene PowerShell?</strong></td>
    </tr>
    <tr>
      <td>Todos los comandos disponibles desde la línea de comandos</td>
      <td>Requiere grandes conocimientos</td>
    </tr>
    <tr>
      <td>Acceso a elementos internos más profundos de Windows como los registros y WMI</td>
      <td>Dirigido principalmente a profesionales de TI y administradores de sistemas</td>
    </tr>
    <tr>
      <td>Funcionamiento más eficiente gracias a una estructura de comandos y una sintaxis coherentes</td>
      <td>Ningún beneficio incrementado para los usuarios acostumbrados a una GUI y que raramente usan la línea de comandos</td>
    </tr>
    <tr>
      <td>La orientación completa a objetos permite la ejecución de tareas más complejas mediante pipelining</td>
      <td>Acostumbrarse cuesta un poco</td>
    </tr>
    <tr>
      <td>Un completo entorno de scripting permite una automatización eficiente de los procesos</td>
      <td></td>
    </tr>
    <tr>
      <td>Administración independiente de la ubicación de varios sistemas por control remoto</td>
      <td></td>
    </tr>
  </tbody>
</table>

## ¿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:

```none
Get-EventLog System Newest 3 (para llamar a las tres entradas más recientes en el registro de eventos del sistema)
```

---

### Consejo

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:

```none
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)
```

[![Imagen: Resultados de Cmdlets Get-Alias](https://www.ionos.mx/digitalguide/fileadmin/_processed_/8/4/csm_windows-powershell3_b87a30956d.webp "Resultados de Cmdlets Get-Alias")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell3.png) El cmdlet Get-Alias muestra todos los alias predeterminados de PowerShell.     La siguiente tabla muestra algunos ejemplos de cmdlets **de uso más frecuente y sus alias correspondientes**:

<table>
  <tbody>
    <tr>
      <td><strong>Alias</strong></td>
      <td><strong>Cmdlet</strong></td>
      <td><strong>Función</strong></td>
    </tr>
    <tr>
      <td>*cd*</td>
      <td>*Set-Location*</td>
      <td>Cambiar el directorio actual</td>
    </tr>
    <tr>
      <td>*dir*</td>
      <td>*Get-ChildItem*</td>
      <td>Enumerar todos los elementos de una carpeta</td>
    </tr>
    <tr>
      <td>*gi*</td>
      <td>*Get-Item*</td>
      <td>Llamada a un elemento específico</td>
    </tr>
    <tr>
      <td>*ps*</td>
      <td>*Get-Process*</td>
      <td>Listar todos los procesos</td>
    </tr>
    <tr>
      <td>*gsv*</td>
      <td>*Get-Service*</td>
      <td>Listar todos los servicios instalados</td>
    </tr>
    <tr>
      <td>*gm*</td>
      <td>*Get-Member*</td>
      <td>Visualizar todas las propiedades y los métodos de un objeto</td>
    </tr>
    <tr>
      <td>*clear*</td>
      <td>*Clear-Host*</td>
      <td>Vaciar el host PowerShell</td>
    </tr>
  </tbody>
</table>

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:

```none
Get-Process | Sort-Object ID
```

[![Imagen: Resultados de Get-Process | Sort-Object ID](https://www.ionos.mx/digitalguide/fileadmin/_processed_/e/1/csm_windows-powershell4_bc010ab70d.webp "Resultados de Get-Process | Sort-Object ID")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell4.png) Mediante el uso de la segmentación o pipelining, Windows PowerShell puede manejar tareas complejas, como mostrar todos los procesos y clasificarlos por 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:

```none
$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:

```none
.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](https://www.ionos.mx/digitalguide/online-marketing/vender-en-internet/que-es-un-archivo-docx/ "¿Qué es un archivo .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:

```none
Set-Location C:\Users\IEUser\Desktop\Text folder
```

[![Imagen: Campo de entrada en la ruta de un directorio en el que se ha introducido "powershell"](https://www.ionos.mx/digitalguide/fileadmin/_processed_/e/e/csm_windows-powershell5_d2668ccee1.webp "Campo de entrada en la ruta de un directorio en el que se ha introducido "powershell"")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell5.png) Al introducir el término "powershell" en la ruta de un directorio, se abre una ventana de Windows PowerShell, en lugar de tener que navegar hasta el programa introduciendo texto.     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:

```none
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.

[![Imagen: Resultado de renombrar archivos a través de PowerShell](https://www.ionos.mx/digitalguide/fileadmin/_processed_/4/b/csm_windows-powershell6_bd08707fc4.webp "Resultado de renombrar archivos a través de PowerShell")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell6.png) Si has predefinido \*docx como formato de archivo, los archivos en PDF no se podrán renombrar.       ###  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:

```none
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:

```none
Get-Service | Where-Object {$_.status -eq "running"} | Sort-Object DisplayName
```

[![Imagen: Resultados de Get-Service | Where-Object {$_.status –eq "running"} | Sort-Object DisplayName](https://www.ionos.mx/digitalguide/fileadmin/_processed_/2/3/csm_windows-powershell7_2ae72f22d3.webp "Resultados de Get-Service | Where-Object {$_.status –eq "running"} | Sort-Object DisplayName")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell7.png) Puedes utilizar las funciones de filtrado de PowerShell para ver un subconjunto de los servicios instalados en un sistema.       ---

### Consejo

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:

```none
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:

```none
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*:

```none
Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} | Format-List
```

[![Imagen: Resultado de Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} und Fortmat-List](https://www.ionos.mx/digitalguide/fileadmin/_processed_/5/e/csm_windows-powershell8_8c8add0356.webp "Resultado de Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} und Fortmat-List")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell8.png) Es posible condensar grandes cantidades de datos, como registros de eventos, y visualizarlos con mayor precisión según los criterios que se seleccionen.       ###  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á:

```none
Get-WmiObject Win32_Bios -Computername
```

Alternativamente, puedes trabajar con el parámetro *-Class* seguido de la ruta completa de la clase:

```none
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:

```none
Get-WmiObject -Computername -Class Win32_Service -Filter "Name='wuauserv'"
```

[![Imagen: Resultado de Get-WmiObject -ComputerName -Class Win32_Service -Filter "Name='wuauserv'"](https://www.ionos.mx/digitalguide/fileadmin/_processed_/2/c/csm_windows-powershell9_fe72ff6f67.webp "Resultado de Get-WmiObject -ComputerName -Class Win32_Service -Filter "Name='wuauserv'"")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell9.png) El cmdlet Get-WmiObject te permite acceder no solo a las configuraciones y funciones internas de un ordenador remoto, sino también a las de tu propio ordenador.     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:

```none
Get-WmiObject -Computername -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method
```

[![Imagen: Resultado de Get-WmiObject -Rechnername -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method](https://www.ionos.mx/digitalguide/fileadmin/_processed_/6/c/csm_windows-powershell10_432af69c99.webp "Resultado de Get-WmiObject -Rechnername -Class Win32_Service -Filter "Name='wuauserv'" | Get-Member -Type Method")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Screenshots_2018/windows-powershell10.png) Cmdlet Get-Member muestra todas las propiedades y métodos disponibles para un objeto .NET.


This is a markdown version of: [https://www.ionos.mx/digitalguide/servidores/know-how/windows-powershell/](https://www.ionos.mx/digitalguide/servidores/know-how/windows-powershell/) for AI/LLM consumption.