PowerShellEmpezando con PowerShell


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:

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

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.

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

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
 

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
 

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.

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

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.