PowerShell es un programa de gestión de configuración y automatización de tareas de Microsoft , que consta de un shell de línea de comandos y el lenguaje de secuencias de comandos asociado . Inicialmente era solo un componente de Windows, conocido como Windows PowerShell , pero se hizo de código abierto y multiplataforma el 18 de agosto de 2016, con la introducción de PowerShell Core . [4] El primero se basa en .NET Framework , el segundo en .NET (anteriormente .NET Core).
PowerShell se incluye con todas las versiones de Windows actualmente compatibles (y admite más cuando no se incluyen con la necesidad de instalación antes de usar scripts, incluido Linux ), y desde Windows 10 build 14971, PowerShell reemplazó el símbolo del sistema (cmd.exe) y se convirtió en el shell de comandos predeterminado para Explorador de archivos . [5] [6]
En PowerShell, las tareas administrativas generalmente se realizan mediante cmdlets (pronunciado command-lets ), que son clases .NET especializadas que implementan una operación particular. Estos funcionan accediendo a datos en diferentes almacenes de datos, como el sistema de archivos o el Registro de Windows , que están disponibles para PowerShell a través de proveedores . Los desarrolladores externos pueden agregar cmdlets y proveedores a PowerShell. [7] [8] Los scripts pueden utilizar cmdlets, que a su vez pueden empaquetarse en módulos. Los cmdlets funcionan en conjunto con la API de .NET .
La compatibilidad de PowerShell con .NET Remoting , WS-Management , CIM y SSH permite a los administradores realizar tareas administrativas en sistemas Windows locales y remotos. PowerShell también proporciona una API de alojamiento con la que el tiempo de ejecución de PowerShell se puede integrar dentro de otras aplicaciones. Luego, estas aplicaciones pueden usar la funcionalidad de PowerShell para implementar ciertas operaciones, incluidas aquellas expuestas a través de la interfaz gráfica . Microsoft Exchange Server 2007 ha utilizado esta capacidad para exponer su funcionalidad de administración como cmdlets y proveedores de PowerShell e implementar las herramientas de administración gráfica como hosts de PowerShell que invocan los cmdlets necesarios. [7] [9] Otras aplicaciones de Microsoft, incluido Microsoft SQL Server 2008, también exponen su interfaz de administración a través de cmdlets de PowerShell. [10]
PowerShell incluye su propia ayuda extensa basada en consola (similar a las páginas de manual en shells de Unix ) a la que se puede acceder a través del Get-Help
cmdlet. El contenido de la ayuda local actualizado se puede recuperar de Internet mediante el Update-Help
cmdlet. Alternativamente, se puede obtener ayuda de la web caso por caso mediante el -online
cambio a Get-Help
.
El intérprete de línea de comandos (CLI) ha sido una parte inseparable de la mayoría de los sistemas operativos de Microsoft . MS-DOS y Xenix dependían casi exclusivamente de la CLI (aunque MS-DOS 5 también venía con un Shell gráfico de DOS complementario ). La familia Windows 9x venía con COMMAND.COM , el entorno de línea de comandos de MS-DOS. Sin embargo, las familias Windows NT y Windows CE vinieron con un nuevo cmd.exe que tenía grandes similitudes con COMMAND.COM. Ambos entornos admiten algunos comandos internos básicos y un lenguaje de secuencias de comandos primitivo ( archivos por lotes ), que se puede utilizar para automatizar diversas tareas. Sin embargo, no pueden automatizar todas las facetas de la interfaz gráfica de usuario (GUI) de Windows porque los equivalentes de las operaciones en la línea de comandos son limitados y el lenguaje de programación es elemental.
Microsoft intentó abordar algunas de estas deficiencias introduciendo Windows Script Host en 1998 con Windows 98 y su host basado en línea de comandos, cscript.exe
. Se integra con el motor Active Script y permite escribir scripts en lenguajes compatibles, como JScript y VBScript , aprovechando las API expuestas por las aplicaciones a través del modelo de objetos componentes ( COM ). Sin embargo, tiene sus propias deficiencias: su documentación no es muy accesible y rápidamente se ganó la reputación de ser un vector de vulnerabilidad del sistema después de que varios virus informáticos de alto perfil explotaran las debilidades en sus disposiciones de seguridad. Las diferentes versiones de Windows proporcionaban varios intérpretes de línea de comandos de propósito especial (como netsh y WMIC ) con sus propios conjuntos de comandos, pero no eran interoperables. Windows Server 2003 intentó mejorar aún más la experiencia de la línea de comandos, pero el soporte de secuencias de comandos aún no era satisfactorio. [11]
A finales de la década de 1990, Intel había acudido a Microsoft pidiendo ayuda para hacer de Windows, que se ejecutaba en CPU Intel, una plataforma más apropiada para respaldar el desarrollo de futuras CPU Intel. En ese momento, el desarrollo de CPU Intel se llevó a cabo en computadoras Sun Microsystems que ejecutaban Solaris (una variante de Unix ) en CPU con arquitectura RISC . La capacidad de ejecutar numerosos scripts de automatización KornShell de Intel en Windows se identificó como una capacidad clave. Internamente, Microsoft comenzó un esfuerzo para crear una versión para Windows de Korn Shell, cuyo nombre en código fue Kermit. [12] Intel finalmente giró hacia una plataforma de desarrollo basada en Linux que podía ejecutarse en CPU Intel, haciendo que el proyecto Kermit fuera redundante. Sin embargo, con un equipo totalmente financiado, el director de programas de Microsoft, Jeffrey Snover, se dio cuenta de que había una oportunidad de crear una solución de propósito más general para el problema de la automatización administrativa de Microsoft.
En 2002, Microsoft había comenzado a desarrollar un nuevo enfoque para la administración de la línea de comandos, incluida una CLI llamada Monad (también conocida como Microsoft Shell o MSH). Las ideas detrás de esto fueron publicadas en agosto de 2002 en un libro blanco llamado "Monad Manifesto" por su arquitecto jefe, Jeffrey Snover . [13] En una entrevista de 2017, Snover explica la génesis de PowerShell, diciendo que había estado intentando que las herramientas Unix estuvieran disponibles en Windows, lo que no funcionó debido a " diferencias arquitectónicas centrales entre Windows y Linux ". En concreto, señaló que Linux considera todo un archivo de texto , mientras que Windows considera todo una " API que devuelve datos estructurados". Eran fundamentalmente incompatibles, lo que le llevó a adoptar un enfoque diferente. [14]
Monad iba a ser una nueva CLI extensible con un nuevo diseño capaz de automatizar una variedad de tareas administrativas básicas. Microsoft demostró públicamente Monad por primera vez en la Conferencia de Desarrollo Profesional celebrada en Los Ángeles en octubre de 2003. Unos meses más tarde, abrieron una versión beta privada, que finalmente condujo a una beta pública. Microsoft publicó la primera versión beta pública de Monad el 17 de junio de 2005, la Beta 2 el 11 de septiembre de 2005 y la Beta 3 el 10 de enero de 2006.
El 25 de abril de 2006, poco después del anuncio inicial de Monad, Microsoft anunció que Monad había pasado a llamarse Windows PowerShell , posicionándolo como una parte importante de su oferta de tecnología de gestión. [15] La versión candidata (RC) 1 de PowerShell se lanzó al mismo tiempo. Un aspecto importante tanto del cambio de nombre como del RC fue que ahora era un componente de Windows, en lugar de un simple complemento.
La versión candidata 2 de PowerShell versión 1 se lanzó el 26 de septiembre de 2006 y el lanzamiento final en la web el 14 de noviembre de 2006. PowerShell para versiones anteriores de Windows se lanzó el 30 de enero de 2007. [16] Comenzó el desarrollo de PowerShell v2.0 antes de que se enviara PowerShell v1.0. Durante el desarrollo, Microsoft envió tres avances de tecnología comunitaria (CTP) . Microsoft puso estas versiones a disposición del público. La última versión CTP de Windows PowerShell v2.0 estuvo disponible en diciembre de 2008.
PowerShell v2.0 se completó y lanzó para fabricación en agosto de 2009, como parte integral de Windows 7 y Windows Server 2008 R2. Las versiones de PowerShell para Windows XP, Windows Server 2003, Windows Vista y Windows Server 2008 se lanzaron en octubre de 2009 y están disponibles para descargar para plataformas de 32 y 64 bits. [17] En una edición de octubre de 2009 de TechNet Magazine , Microsoft calificó el dominio de PowerShell como "la habilidad más importante que un administrador de Windows necesitará en los próximos años". [18]
Windows 10 envió un marco de prueba para PowerShell. [19]
El 18 de agosto de 2016, Microsoft anunció [20] que habían creado PowerShell de código abierto y multiplataforma con soporte para Windows, macOS , CentOS y Ubuntu . [4] El código fuente fue publicado en GitHub . [21] El paso al código abierto creó una segunda encarnación de PowerShell llamada "PowerShell Core", que se ejecuta en .NET Core . Es distinto de "Windows PowerShell", que se ejecuta en .NET Framework completo . [22] A partir de la versión 5.1, PowerShell Core se incluye con Windows Server 2016 Nano Server . [23] [24]
Una táctica de diseño clave para PowerShell fue aprovechar la gran cantidad de API que ya existían en Windows, Windows Management Instrumentation, .NET Framework y otro software. Los cmdlets de PowerShell "envuelven" la funcionalidad existente. La intención de esta táctica es proporcionar una interfaz más coherente y fácil de usar para el administrador entre los administradores y una amplia gama de funciones subyacentes. Con PowerShell, un administrador no necesita saber .NET, WMI o codificación API de bajo nivel y, en cambio, puede concentrarse en usar los cmdlets expuestos por PowerShell. En este sentido, PowerShell crea pocas funciones nuevas y, en cambio, se centra en hacer que las funciones existentes sean más accesibles para una audiencia particular. [25]
Los desarrolladores de PowerShell basaron la gramática central de la herramienta en la de POSIX 1003.2 KornShell . [26]
Sin embargo, el lenguaje de PowerShell también fue influenciado por PHP , Perl y muchos otros lenguajes existentes. [27]
Windows PowerShell puede ejecutar cuatro tipos de comandos con nombre: [28]
.ps1
)Si un comando es un programa ejecutable independiente, PowerShell lo inicia en un proceso independiente ; si es un cmdlet, se ejecuta en el proceso de PowerShell. PowerShell proporciona una interfaz de línea de comandos interactiva , donde se pueden ingresar los comandos y mostrar su salida. La interfaz de usuario ofrece finalización de pestañas personalizable . PowerShell permite la creación de alias para cmdlets, que PowerShell traduce textualmente en invocaciones de los comandos originales. PowerShell admite parámetros posicionales y con nombre para los comandos. Al ejecutar un cmdlet, el trabajo de vincular el valor del argumento al parámetro lo realiza el propio PowerShell, pero para los ejecutables externos, los argumentos los analiza el ejecutable externo independientemente de la interpretación de PowerShell. [29]
El sistema de tipos extendidos ( ETS ) de PowerShell se basa en el sistema de tipos .NET, pero con semántica extendida (por ejemplo, conjuntos de propiedades y extensibilidad de terceros). Por ejemplo, permite la creación de diferentes vistas de objetos al exponer solo un subconjunto de campos de datos, propiedades y métodos, además de especificar un formato personalizado y un comportamiento de clasificación. Estas vistas se asignan al objeto original mediante archivos de configuración basados en XML . [30]
Los cmdlets son comandos especializados en el entorno de PowerShell que implementan funciones específicas. Estos son los comandos nativos de la pila de PowerShell. Los cmdlets siguen un patrón de nomenclatura Verbo - Sustantivo , como Get-ChildItem , lo que lo convierte en código autodocumentado . [31] Los cmdlets generan sus resultados como objetos y también pueden recibir objetos como entrada, lo que los hace adecuados para su uso como destinatarios en una canalización. Si un cmdlet genera varios objetos, cada objeto de la colección se transmite a través de toda la canalización antes de que se procese el siguiente objeto. [31]
Los cmdlets son clases .NET especializadas , que el tiempo de ejecución de PowerShell crea instancias e invoca en tiempo de ejecución . Los cmdlets se derivan de Cmdlet
o de PSCmdlet
; este último se usa cuando el cmdlet necesita interactuar con el tiempo de ejecución de PowerShell. [31] Estas clases base especifican ciertos métodos – BeginProcessing()
y ProcessRecord()
– EndProcessing()
que la implementación del cmdlet anula para proporcionar la funcionalidad. Cada vez que se ejecuta un cmdlet, PowerShell invoca estos métodos en secuencia y ProcessRecord()
se llama si recibe información de canalización. [32] Si se canaliza una colección de objetos, el método se invoca para cada objeto de la colección. La clase que implementa el cmdlet debe tener un atributo .NET – CmdletAttribute
– que especifica el verbo y el sustantivo que componen el nombre del cmdlet. Los verbos comunes se proporcionan como enumeración . [33] [34]
Si un cmdlet recibe entrada de canalización o entrada de parámetro de línea de comandos, debe haber una propiedad correspondiente en la clase, con una implementación mutadora . PowerShell invoca el mutador con el valor del parámetro o la entrada de canalización, que la implementación del mutador guarda en variables de clase. Luego, los métodos que implementan la funcionalidad hacen referencia a estos valores. Las propiedades que se asignan a los parámetros de la línea de comandos están marcadas con ParameterAttribute
[35] y se configuran antes de la llamada a BeginProcessing()
. Aquellos que se asignan a la entrada de la canalización también están flanqueados por ParameterAttribute
, pero con el ValueFromPipeline
parámetro de atributo establecido. [36]
La implementación de estas clases de cmdlet puede hacer referencia a cualquier API de .NET y puede estar en cualquier lenguaje .NET . Además, PowerShell pone a disposición determinadas API, como , que se utiliza para acceder a funciones específicas de PowerShell, como escribir objetos resultantes en la canalización. Los cmdlets pueden usar API de acceso a datos .NET directamente o usar la infraestructura PowerShell de los proveedores de PowerShell, que hacen que los almacenes de datos sean accesibles mediante rutas únicas . Los almacenes de datos se exponen mediante letras de unidad y jerarquías dentro de ellas, tratadas como directorios. Windows PowerShell incluye proveedores para el sistema de archivos , el registro , el almacén de certificados , así como los espacios de nombres para alias de comandos, variables y funciones. [37] Windows PowerShell también incluye varios cmdlets para administrar varios sistemas Windows , incluido el sistema de archivos , o usar el Instrumental de administración de Windows para controlar los componentes de Windows . Otras aplicaciones pueden registrar cmdlets con PowerShell, lo que le permite administrarlos y, si incluyen algún almacén de datos (como una base de datos), también pueden agregar proveedores específicos. [ cita necesaria ]WriteObject()
La cantidad de cmdlets incluidos en la instalación básica de PowerShell generalmente ha aumentado con cada versión:
Los cmdlets se pueden agregar al shell a través de complementos (obsoletos en v2) y módulos; los usuarios no están limitados a los cmdlets incluidos en la instalación básica de PowerShell.
PowerShell implementa el concepto de canalización , que permite canalizar la salida de un cmdlet a otro cmdlet como entrada. Al igual que con las canalizaciones de Unix , las canalizaciones de PowerShell pueden construir comandos complejos, utilizando el |
operador para conectar etapas. Sin embargo, la canalización de PowerShell se diferencia de la canalización de Unix en que las etapas se ejecutan dentro del tiempo de ejecución de PowerShell en lugar de como un conjunto de procesos coordinados por el sistema operativo . Además, los objetos .NET estructurados, en lugar de flujos de bytes , se pasan de una etapa a la siguiente. El uso de objetos y la ejecución de etapas dentro del tiempo de ejecución de PowerShell elimina la necesidad de serializar estructuras de datos o extraerlas analizando explícitamente la salida de texto. [42] Un objeto también puede encapsular ciertas funciones que funcionan con los datos contenidos, que quedan disponibles para el comando del destinatario para su uso. [43] [44] Para el último cmdlet de una canalización, PowerShell canaliza automáticamente su objeto de salida al Out-Default
cmdlet, que transforma los objetos en una secuencia de objetos de formato y luego los representa en la pantalla. [45] [46]
Debido a que todos los objetos de PowerShell son objetos .NET, comparten un .ToString()
método que recupera la representación de texto de los datos en un objeto. Además, PowerShell permite especificar definiciones de formato, por lo que la representación de texto de los objetos se puede personalizar eligiendo qué elementos de datos mostrar y de qué manera. Sin embargo, para mantener la compatibilidad con versiones anteriores , si se utiliza un ejecutable externo en una canalización, recibe un flujo de texto que representa el objeto, en lugar de integrarse directamente con el sistema de tipos de PowerShell. [47] [48] [49]
Windows PowerShell incluye un lenguaje de secuencias de comandos escrito dinámicamente que puede implementar operaciones complejas utilizando cmdlets imperativamente . El lenguaje de secuencias de comandos admite variables, funciones, bifurcaciones ( ), bucles ( ,, y ), manejo estructurado de errores/excepciones y cierres / expresiones lambda , [50] así como integración con .NET. Las variables en los scripts de PowerShell tienen el prefijo . A las variables se les puede asignar cualquier valor, incluida la salida de cmdlets. Las cadenas se pueden encerrar entre comillas simples o dobles: cuando se usan comillas dobles, las variables se expandirán incluso si están dentro de las comillas. Encerrar la ruta a un archivo entre llaves precedidas por un signo de dólar (como en ) crea una referencia al contenido del archivo. Si se utiliza como valor L , todo lo que se le asigne se escribirá en el archivo. Cuando se utiliza como valor R , se leerá el contenido del archivo. Si se asigna un objeto, se serializa antes de almacenarse. [ cita necesaria ]if-then-else
while
do
for
foreach
$
${C:\foo.txt}
Se puede acceder a los miembros del objeto mediante .
notación, como en la sintaxis de C#. PowerShell proporciona variables especiales, como $args
, que es una matriz de todos los argumentos de la línea de comandos pasados a una función desde la línea de comandos, y $_
, que hace referencia al objeto actual en la canalización. [51] PowerShell también proporciona matrices y matrices asociativas . El lenguaje de secuencias de comandos de PowerShell también evalúa inmediatamente las expresiones aritméticas ingresadas en la línea de comando y analiza abreviaturas comunes, como GB, MB y KB. [52] [53]
Usando la function
palabra clave, PowerShell permite la creación de funciones. Una función simple tiene el siguiente aspecto general: [54]
nombre de la función ( [Tipo] $Param1 , [Tipo] $Param2 ) { # Instrucciones }
Sin embargo, PowerShell permite funciones avanzadas que admiten parámetros con nombre, parámetros posicionales, parámetros de conmutación y parámetros dinámicos. [54]
función Verbo-Sustantivo { parámetro ( # Definición de parámetros estáticos ) parámetro dinámico { # Definición de parámetros dinámicos. } comenzar { # Conjunto de instrucciones para ejecutar al inicio de la canalización } proceso { # Conjuntos de instrucciones principales, ejecutados para cada elemento del proceso } fin { # Conjunto de instrucciones para ejecutar al final del proceso }}
La función definida se invoca en cualquiera de las siguientes formas: [54]
nombre valor1 valor2 Verbo-Sustantivo -Param1 valor1 -Param2 valor2
PowerShell permite llamar a cualquier método .NET estático proporcionando sus espacios de nombres entre corchetes ( []
) y luego usando un par de dos puntos ( ::
) para indicar el método estático. [55] Por ejemplo:
[Consola] :: WriteLine ( "PowerShell" )
Hay docenas de formas de crear objetos en PowerShell. Una vez creado, se puede acceder a las propiedades y métodos de instancia de un objeto utilizando la .
notación. [55]
PowerShell acepta cadenas , tanto sin formato como con escape . Una cadena entre comillas simples es una cadena sin formato, mientras que una cadena entre comillas dobles es una cadena con escape. PowerShell trata las comillas rectas y rizadas como equivalentes. [56]
PowerShell admite la siguiente lista de caracteres especiales: [57]
Para el manejo de errores, PowerShell proporciona un mecanismo de manejo de excepciones basado en .NET . En caso de errores, Exception
se lanzan objetos que contienen información sobre el error (objeto), que se detectan mediante la try ... catch
construcción (aunque trap
también se admite una construcción). PowerShell se puede configurar para reanudar la ejecución de forma silenciosa, sin generar realmente la excepción; Esto se puede hacer con un solo comando, una sola sesión o de forma perpetua. [58]
Se puede hacer que los scripts escritos con PowerShell persistan entre sesiones, ya sea en un .ps1
archivo o en un .psm1
archivo (este último se usa para implementar un módulo). Posteriormente, se puede utilizar el script completo o funciones individuales del script. Los scripts y las funciones funcionan de manera análoga a los cmdlets, en el sentido de que se pueden usar como comandos en canalizaciones y se les pueden vincular parámetros. Los objetos de canalización se pueden pasar entre funciones, scripts y cmdlets sin problemas. Para evitar la ejecución involuntaria de scripts, la ejecución de scripts está deshabilitada de forma predeterminada y debe habilitarse explícitamente. [59] La habilitación de scripts se puede realizar a nivel de sistema, usuario o sesión. Los scripts de PowerShell se pueden firmar para verificar su integridad y están sujetos a Code Access Security . [60]
El lenguaje de programación de PowerShell admite notación de prefijo binario similar a la notación científica admitida por muchos lenguajes de programación de la familia C. [61]
También se puede utilizar PowerShell integrado en una aplicación de administración, que utiliza el tiempo de ejecución de PowerShell para implementar la funcionalidad de administración. Para ello, PowerShell proporciona una API de alojamiento administrado . A través de las API, la aplicación puede crear una instancia de un espacio de ejecución (una instancia del tiempo de ejecución de PowerShell), que se ejecuta en el proceso de la aplicación y se expone como un objeto. [7] El estado del espacio de ejecución está encerrado en un objeto. Cuando se crea el espacio de ejecución, el tiempo de ejecución de Windows PowerShell inicializa la creación de instancias, incluida la inicialización de los proveedores y la enumeración de los cmdlets, y actualiza el objeto en consecuencia. Luego, el Runspace debe abrirse para procesamiento sincrónico o asincrónico. Después de eso, se puede utilizar para ejecutar comandos. [ cita necesaria ]Runspace
SessionState
SessionState
Para ejecutar un comando, Pipeline
se debe crear una canalización (representada por un objeto) y asociarla con el espacio de ejecución. Luego, el objeto de canalización se rellena con los cmdlets que componen la canalización. Para operaciones secuenciales (como en un script de PowerShell), se crea un objeto Pipeline para cada declaración y se anida dentro de otro objeto Pipeline. [7] Cuando se crea una canalización, Windows PowerShell invoca el procesador de canalización, que resuelve los cmdlets en sus respectivos ensamblados (el procesador de comandos ) y les agrega una referencia a la canalización y los asocia con y InputPipe
objetos para representar la conexión con la tubería. Los tipos se verifican y los parámetros se vinculan mediante reflexión . [7] Una vez configurada la canalización, el host llama al método para ejecutar los comandos, o su equivalente asincrónico . Si la canalización tiene el cmdlet al final de la canalización, escribe el resultado en la pantalla de la consola. De lo contrario, los resultados se entregan al anfitrión, que podría aplicar un procesamiento adicional o mostrar el resultado en sí. [ cita necesaria ]OutputPipe
ErrorOutputPipe
Invoke()
InvokeAsync()
Write-Host
Microsoft Exchange Server 2007 utiliza las API de alojamiento para proporcionar su GUI de administración. Cada operación expuesta en la GUI se asigna a una secuencia de comandos (o canalizaciones) de PowerShell. El host crea la canalización y la ejecuta. De hecho, la consola interactiva de PowerShell en sí es un host de PowerShell, que interpreta los scripts ingresados en la línea de comando, crea los Pipeline
objetos necesarios y los invoca. [ cita necesaria ]
DSC permite especificar de forma declarativa cómo se debe configurar un entorno de software. [62]
Al ejecutar una configuración , DSC se asegurará de que el sistema obtenga el estado descrito en la configuración. Las configuraciones de DSC son idempotentes. El Administrador de configuración local (LCM) sondea periódicamente el sistema utilizando el flujo de control descrito por los recursos (partes imperativas de DSC) para asegurarse de que se mantenga el estado de una configuración.
PowerShell, que inicialmente utilizaba el nombre en clave "Monad", se mostró públicamente por primera vez en la Conferencia de Desarrolladores Profesionales en octubre de 2003 en Los Ángeles. Todas las versiones principales siguen siendo compatibles y cada versión principal presenta compatibilidad con versiones anteriores.
PowerShell 1.0 se lanzó en noviembre de 2006 para Windows XP SP2 , Windows Server 2003 SP1 y Windows Vista . [63] Es un componente opcional de Windows Server 2008 .
PowerShell 2.0 está integrado con Windows 7 y Windows Server 2008 R2 [64] y se lanza para Windows XP con Service Pack 3, Windows Server 2003 con Service Pack 2 y Windows Vista con Service Pack 1. [65] [66]
PowerShell v2 incluye cambios en el lenguaje de secuencias de comandos y la API de alojamiento, además de incluir más de 240 cmdlets nuevos. [67] [68]
Las nuevas características de PowerShell 2.0 incluyen: [69] [70] [71]
BeginProcessing()
de un cmdlet.ProcessRecord()
EndProcessing()
Out-GridView
, que muestra datos tabulares en el objeto WPF GridView , en sistemas que lo permiten y si ISE está instalado y habilitado.-Split
operadores -Join
, y Splatting ( @
).<#
y #>
como delimitadores. [75]RunspacePools
), así como la capacidad de crear Runspaces restringidos que solo permiten invocar un subconjunto configurado de PowerShell. . Las nuevas API también admiten la participación en una transacción administrada por PowerShell.PowerShell 3.0 está integrado con Windows 8 y con Windows Server 2012 . Microsoft también ha puesto a disposición PowerShell 3.0 para Windows 7 con Service Pack 1, para Windows Server 2008 con Service Pack 1 y para Windows Server 2008 R2 con Service Pack 1. [76] [77]
PowerShell 3.0 es parte de un paquete más grande, Windows Management Framework 3.0 (WMF3), que también contiene el servicio WinRM para admitir la comunicación remota. [77] Microsoft realizó varias versiones Community Technology Preview de WMF3. El 2 de diciembre de 2011 se lanzó una versión preliminar de tecnología comunitaria 2 (CTP 2) de Windows Management Framework 3.0. [78] Windows Management Framework 3.0 se lanzó para disponibilidad general en diciembre de 2012 [79] y se incluye con Windows 8 y Windows Servidor 2012 por defecto. [80]
Las nuevas características de PowerShell 3.0 incluyen: [77] [81] : 33–34
get-WmiObject win32_logicaldisk
, volúmenes, firewalls, conexiones de red e impresoras, que anteriormente se realizaba a través de WMI. [ Se necesita más explicación ]PowerShell 4.0 está integrado con Windows 8.1 y con Windows Server 2012 R2 . Microsoft también ha puesto a disposición PowerShell 4.0 para Windows 7 SP1 , Windows Server 2008 R2 SP1 y Windows Server 2012 . [82]
Las nuevas características de PowerShell 4.0 incluyen:
RemoteSigned
.Windows Management Framework (WMF) 5.0 RTM, que incluye PowerShell 5.0, se relanzó en la web el 24 de febrero de 2016, luego de un lanzamiento inicial con un error grave. [86]
Las características clave incluyen:
class
palabra clave que crea clases para programación orientada a objetos.enum
palabra clave que crea enumeraciones.OneGet
cmdlets para soportar el administrador de paquetes Chocolatey [87]Se lanzó junto con la Actualización de aniversario de Windows 10 [89] el 2 de agosto de 2016 y en Windows Server 2016 . [90] PackageManagement ahora admite servidores proxy, PSReadLine ahora tiene soporte ViMode y se agregaron dos nuevos cmdlets: Get-TimeZone y Set-TimeZone. El módulo LocalAccounts permite agregar/eliminar cuentas de usuarios locales. [91] Se lanzó una vista previa de PowerShell 5.1 para Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 y Windows Server 2012 R2 el 16 de julio de 2016, [92] y se lanzó el 19 de enero de 2017. [93]
PowerShell 5.1 es la primera versión que viene en dos ediciones de "Desktop" y "Core". La edición "Desktop" es la continuación del tradicional Windows PowerShell que se ejecuta en la pila de .NET Framework. La edición "Core" se ejecuta en .NET Core y se incluye con Windows Server 2016 Nano Server. A cambio de un menor tamaño, este último carece de algunas características como los cmdlets para administrar el portapapeles o unir una computadora a un dominio, cmdlets WMI versión 1, cmdlets de registro de eventos y perfiles. [24] Esta fue la versión final de PowerShell hecha exclusivamente para Windows.
PowerShell Core 6.0 se anunció por primera vez el 18 de agosto de 2016, cuando Microsoft presentó PowerShell Core y su decisión de hacer que el producto sea multiplataforma , independiente de Windows, gratuito y de código abierto. [4] Logró disponibilidad general el 10 de enero de 2018 para Windows, macOS y Linux . [94] Tiene su propio ciclo de vida de soporte y se adhiere a la política de ciclo de vida de Microsoft que se introduce con Windows 10: solo se admite la última versión de PowerShell Core. Microsoft espera lanzar una versión menor de PowerShell Core 6.0 cada seis meses. [95]
El cambio más significativo en esta versión de PowerShell es la expansión al resto de plataformas. Para los administradores de Windows, esta versión de PowerShell no incluyó ninguna característica nueva importante. En una entrevista con la comunidad el 11 de enero de 2018, se le pidió al equipo de PowerShell que enumerara las 10 cosas más interesantes que le sucederían a un profesional de TI de Windows que migraría de Windows PowerShell 5.1 a PowerShell Core 6.0; En respuesta, Ángel Calvo de Microsoft sólo pudo nombrar dos: multiplataforma y código abierto. [96] PowerShell 6 cambió a UTF-8 como codificación predeterminada, con algunas excepciones. [97] (PowerShell 7.4 cambia más a UTF-8) [98]
Según Microsoft, una de las nuevas características de PowerShell 6.1 es "Compatibilidad con más de 1900 cmdlets existentes en Windows 10 y Windows Server 2019 ". [99] Aún así, no se pueden encontrar detalles de estos cmdlets en la versión completa del registro de cambios. [100] Microsoft profesa más tarde que este número era insuficiente ya que PowerShell Core no pudo reemplazar a Windows PowerShell 5.1 y ganar terreno en Windows. [101] Sin embargo, era popular en Linux. [101]
PowerShell Core 6.2 se centra principalmente en mejoras de rendimiento, corrección de errores y mejoras de lenguaje y cmdlets más pequeños que mejoraron la productividad de los desarrolladores. [102]
PowerShell 7 es el reemplazo de los productos PowerShell Core 6.x, así como de Windows PowerShell 5.1, que es la última versión compatible de Windows PowerShell. [103] [101] El enfoque en el desarrollo fue hacer de PowerShell 7 un reemplazo viable para Windows PowerShell 5.1, es decir, tener casi paridad con Windows PowerShell en términos de compatibilidad con los módulos que se envían con Windows. [104]
Las nuevas características de PowerShell 7 incluyen: [105]
-Parallel
modificador del ForEach-Object
cmdlet para ayudar a controlar el procesamiento paraleloGet-Error
cmdlet&&
y ||
) que permiten la ejecución condicional del siguiente cmdlet en la canalización??
operador para la coalescencia nula.??=
operador para la asignación coalescente nulaInvoke-DscResource
(experimental)Out-GridView
cmdlet-ShowWindow
interruptor para elGet-Help
PowerShell 7.2 es la próxima versión de soporte a largo plazo de PowerShell, después de la versión 7.0. Utiliza .NET 6.0 y presenta paquetes de instalación universales para Linux. En Windows, las actualizaciones de PowerShell 7.2 y posteriores se realizan a través del servicio Microsoft Update ; esta característica faltaba desde PowerShell 6.0 a 7.1. [106]
Esta versión incluye algunas actualizaciones y correcciones generales de cmdlets, pruebas de paquetes dependientes del marco en proceso de lanzamiento, así como mejoras de compilación y empaquetado. [107]
PowerShell 7.4 se basa en .NET 8. Y con esa versión, los webcmdlets utilizan de forma predeterminada la codificación UTF-8 (cambiando de ASCII -superset Windows-1252 también conocido como ISO-8859-1 , que no es compatible con Unicode ). [108] [98] Anteriormente, UTF-8 era el valor predeterminado para otras cosas, pero no para todas.
La siguiente tabla contiene una selección de los cmdlets que se incluyen con PowerShell, destacando comandos similares en otros intérpretes de línea de comandos conocidos. Muchos de estos comandos similares vienen definidos de fábrica como alias dentro de PowerShell, lo que facilita que las personas familiarizadas con otros shells comunes comiencen a trabajar.
Notas
ls
y man
alias están ausentes en la versión Linux de PowerShell Core.curl
y wget
los alias están ausentes en PowerShell Core, para no interferir con la invocación de comandos nativos con nombres similares.Un proyecto llamado Pash , un juego de palabras con el ampliamente conocido shell Unix " bash ", ha sido una reimplementación de código abierto y multiplataforma de PowerShell a través del marco Mono . [137] Pash fue creado por Igor Moochnick, escrito en C# y lanzado bajo la Licencia Pública General GNU . El desarrollo de Pash se estancó en 2008, se reinició en GitHub en 2012, [138] y finalmente cesó en 2016, cuando PowerShell se convirtió oficialmente en código abierto y multiplataforma. [139]
Una característica destacada aquí es que prácticamente todas las utilidades de administración ahora funcionan desde la línea de comandos (y la mayoría están disponibles a través de telnet).
El lenguaje principal de PowerShell se basa en la gramática POSIX 1003.2 para el shell Korn .
Windows PowerShell 3.0 viene con aproximadamente 1000 cmdlets en Windows 8
Windows PowerShell 5.0 viene con aproximadamente 1300 cmdlets en Windows 10
La codificación predeterminada es UTF-8 sin una lista de materiales, excepto New-ModuleManifest