PowerShell Tutorial
Empezando con PowerShell
Buscar..
Observaciones
Windows PowerShell es un componente de shell y scripts de Windows Management Framework, un marco de administración de automatización / configuración de Microsoft creado en .NET Framework. PowerShell se instala de forma predeterminada en todas las versiones compatibles de los sistemas operativos de cliente y servidor de Windows desde Windows 7 / Windows Server 2008 R2. Powershell se puede actualizar en cualquier momento mediante la descarga de una versión posterior de Windows Management Framework (WMF). La versión "Alpha" de PowerShell 6 es multiplataforma (Windows, Linux y OS X) y debe descargarse e instalarse desde esta página de versión .
Recursos adicionales:
- Documentación de MSDN: https://msdn.microsoft.com/en-us/powershell/scripting/powershell-scripting
- TechNet: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- Galería de PowerShell: https://www.powershellgallery.com/
- Blog de MSDN: https://blogs.msdn.microsoft.com/powershell/
- Github: https://github.com/powershell
- Sitio de la comunidad: http://powershell.com/cs/
Versiones
Versión | Incluido con Windows | Notas | Fecha de lanzamiento |
---|---|---|---|
1.0 | XP / Server 2008 | 2006-11-01 | |
2.0 | 7 / Server 2008 R2 | 2009-11-01 | |
3.0 | 8 / Servidor 2012 | 2012-08-01 | |
4.0 | 8.1 / Server 2012 R2 | 2013-11-01 | |
5.0 | 10 / Server 2016 Tech Preview | 2015-12-16 | |
5.1 | Edición de 10 Aniversario / Servidor 2016 | 2017-01-27 |
Instalación o configuración
Windows
PowerShell se incluye con Windows Management Framework. La instalación y configuración no son necesarias en las versiones modernas de Windows.
Las actualizaciones de PowerShell se pueden realizar instalando una versión más reciente de Windows Management Framework.
Otras plataformas
La versión "Beta" de PowerShell 6 se puede instalar en otras plataformas. Los paquetes de instalación están disponibles aquí .
Por ejemplo, PowerShell 6, para Ubuntu 16.04, se publica en los repositorios de paquetes para una fácil instalación (y actualizaciones).
Para instalarlo ejecuta lo siguiente:
# Import the public repository GPG keys curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # Register the Microsoft Ubuntu repository curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list # Update apt-get sudo apt-get update # Install PowerShell sudo apt-get install -y powershell # Start PowerShell powershell
Después de registrar el repositorio de Microsoft una vez como superusuario, a partir de ese momento, solo debe usar sudo apt-get upgrade powershell
para actualizarlo. Entonces solo ejecuta powershell
Permitir que los scripts almacenados en su máquina se ejecuten sin firmar
Por razones de seguridad, PowerShell está configurado de forma predeterminada para permitir solo la ejecución de scripts firmados. La ejecución del siguiente comando le permitirá ejecutar scripts sin firmar (debe ejecutar PowerShell como administrador para hacer esto).
Set-ExecutionPolicy RemoteSigned
Otra forma de ejecutar los scripts de PowerShell es usar Bypass
como ExecutionPolicy
:
powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
O desde dentro de su consola PowerShell existente o sesión ISE ejecutando:
Set-ExecutionPolicy Bypass Process
También se puede lograr una solución temporal para la política de ejecución ejecutando el ejecutable de Powershell y pasando cualquier política válida como parámetro -ExecutionPolicy
. La política está vigente solo durante la vida útil del proceso, por lo que no se necesita acceso administrativo al registro.
C:\>powershell -ExecutionPolicy RemoteSigned
Existen muchas otras políticas disponibles, y los sitios en línea a menudo lo alientan a usar Set-ExecutionPolicy Unrestricted
. Esta política permanece en su lugar hasta que se modifica, y reduce la postura de seguridad del sistema. Esto no es aconsejable. Se recomienda el uso de RemoteSigned
porque permite el código almacenado y escrito localmente, y requiere que el código adquirido de forma remota se firme con un certificado de una raíz confiable.
Además, tenga en cuenta que la Política de grupo puede imponer la Política de ejecución, de modo que incluso si la política se cambia a Unrestricted
sistema Unrestricted
, la Política de grupo puede revertir esa configuración en su próximo intervalo de aplicación (generalmente 15 minutos). Puede ver el conjunto de políticas de ejecución en los diversos ámbitos utilizando Get-ExecutionPolicy -List
Documentación TechNet:
Set-ExecutionPolicy
about_Execution_Policies
Alias y funciones similares
En PowerShell, hay muchas maneras de lograr el mismo resultado. Esto se puede ilustrar muy bien con el sencillo y familiar ejemplo de Hello World
:
Utilizando Write-Host
:
Write-Host "Hello World"
Usando Write-Output
:
Write-Output 'Hello world'
Vale la pena señalar que aunque Write-Output
y Write-Host
escriben en la pantalla, hay una sutil diferencia. Write-Host
escribe solo en stdout (es decir, la pantalla de la consola), mientras que Write-Output
escribe en stdout AND en el flujo de salida [éxito] permitiendo la redirección . La redirección (y las secuencias en general) permiten que la salida de un comando se dirija como entrada a otro, incluida la asignación a una variable.
> $message = Write-Output "Hello World"
> $message
"Hello World"
Estas funciones similares no son alias, pero pueden producir los mismos resultados si se quiere evitar "contaminar" el flujo de éxito.
Write-Output
tiene un alias para Echo
o Write
Echo 'Hello world'
Write 'Hello world'
O, simplemente escribiendo 'Hola mundo'!
'Hello world'
Todo lo cual resultará con la salida de consola esperada.
Hello world
Otro ejemplo de alias en PowerShell es la asignación común de los comandos antiguos del símbolo del sistema y los comandos BASH a los cmdlets de PowerShell. Todo lo siguiente produce una lista de directorios del directorio actual.
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
Finalmente, ¡puede crear su propio alias con el cmdlet Set-Alias! Como ejemplo, vamos a alisas Test-NetConnection
, que es esencialmente el equivalente de PowerShell al comando ping del símbolo del sistema, a "ping".
Set-Alias -Name ping -Value Test-NetConnection
Ahora puede usar ping
lugar de Test-NetConnection
! Tenga en cuenta que si el alias ya está en uso, sobrescribirá la asociación.
El alias estará vivo, hasta que la sesión esté activa. Una vez que cierre la sesión e intente ejecutar el alias que ha creado en su última sesión, no funcionará. Para superar este problema, puede importar todos sus alias de un Excel a su sesión una vez, antes de comenzar su trabajo.
The Pipeline: uso de la salida de un cmdlet de PowerShell
Una de las primeras preguntas que tienen las personas cuando comienzan a usar PowerShell para las secuencias de comandos es cómo manipular la salida de un cmdlet para realizar otra acción.
El símbolo de la tubería |
se usa al final de un cmdlet para tomar los datos que exporta y enviarlos al siguiente cmdlet. Un ejemplo simple es usar Select-Object para mostrar solo la propiedad Name de un archivo que se muestra desde Get-ChildItem:
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
El uso más avanzado de la canalización nos permite canalizar la salida de un cmdlet en un bucle foreach:
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
Tenga en cuenta que el ejemplo anterior utiliza la variable automática $ _ $ _ es el alias corto de $ PSItem, que es una variable automática que contiene el elemento actual en la tubería.
Comentando
Para comentar sobre los scripts de energía al anteponer la línea con el símbolo #
(hash)
# This is a comment in powershell
Get-ChildItem
También puede hacer comentarios de varias líneas usando <#
y #>
al principio y al final del comentario respectivamente.
<#
This is a
multi-line
comment
#>
Get-ChildItem
Métodos de la biblioteca.
Los métodos de la biblioteca .Net estática se pueden llamar desde PowerShell encapsulando el nombre completo de la clase en el tercer corchete y luego llamando al método usando ::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
Los métodos estáticos se pueden llamar desde la clase en sí, pero llamar a métodos no estáticos requiere una instancia de la clase .Net (un objeto).
Por ejemplo, no se puede llamar al método AddHours desde la propia clase System.DateTime. Requiere una instancia de la clase:
C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
En este caso, primero creamos un objeto , por ejemplo:
C:\> $Object = [System.DateTime]::Now
Luego, podemos usar métodos de ese objeto, incluso métodos que no pueden llamarse directamente desde la clase System.DateTime, como el método AddHours:
C:\> $Object.AddHours(15)
Monday 12 September 2016 01:51:19
Creando objetos
El cmdlet New-Object
se usa para crear un objeto.
# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime
# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
En muchos casos, se creará un nuevo objeto para exportar datos o pasarlo a otro commandlet. Esto se puede hacer así:
$newObject = New-Object -TypeName PSObject -Property @{
ComputerName = "SERVER1"
Role = "Interface"
Environment = "Production"
}
Hay muchas formas de crear un objeto. El siguiente método es probablemente la forma más rápida y rápida de crear un PSCustomObject
:
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
En caso de que ya tenga un objeto, pero solo necesite una o dos propiedades adicionales, simplemente puede agregar esa propiedad utilizando Select-Object
:
Get-ChildItem | Select-Object FullName, Name,
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
Todos los objetos se pueden almacenar en variables o pasar a la tubería. También puede agregar estos objetos a una colección y luego mostrar los resultados al final.
Las colecciones de objetos funcionan bien con Export-CSV (e Import-CSV). Cada línea del CSV es un objeto, cada columna es una propiedad.
Los comandos de formato convierten los objetos en flujo de texto para su visualización. Evite usar los comandos Format- * hasta el último paso de cualquier procesamiento de datos, para mantener la usabilidad de los objetos.