Primeros pasos con PowerShell

Permita que los scripts almacenados en su máquina se ejecuten sin firmar

Por razones de seguridad, PowerShell está configurado de forma predeterminada para permitir que solo se ejecuten scripts firmados. Ejecutar el siguiente comando le permitirá ejecutar scripts sin firmar (debe ejecutar PowerShell como administrador para hacer esto).

Set-ExecutionPolicy RemoteSigned

Otra forma de ejecutar scripts de PowerShell es usar Bypass como ExecutionPolicy:

powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"

O desde 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á en vigor solo durante la vida útil del proceso, por lo que no se necesita acceso administrativo al registro.

C:\>powershell -ExecutionPolicy RemoteSigned

Hay muchas otras políticas disponibles, y los sitios en línea a menudo lo alientan a usar Set-ExecutionPolicy Unrestricted. Esta política permanece vigente hasta que se modifica y reduce la postura de seguridad del sistema. Esto no es recomendable. Se recomienda el uso de RemoteSigned porque permite almacenar y escribir código localmente y requiere que el código adquirido de forma remota esté firmado con un certificado de una raíz de confianza.

Además, tenga en cuenta que la Política de ejecución puede ser aplicada por la Política de grupo, de modo que incluso si la política se cambia a “Sin restricciones” en todo el sistema, la Política de grupo puede revertir esa configuración en su próximo intervalo de aplicación (normalmente 15 minutos). Puede ver la política de ejecución establecida en los distintos ámbitos utilizando Get-ExecutionPolicy -List

Documentación de TechNet: [Política de ejecución establecida] (https://technet.microsoft.com/en-us/library/hh849812.aspx) acerca de_las_políticas_de_ejecución

Alias ​​y funciones similares

En PowerShell, hay muchas formas de lograr el mismo resultado. Esto se puede ilustrar muy bien con el simple y familiar ejemplo Hello World:

Usando Write-Host:

Write-Host "Hello World"  

Usando Escribir-Salida:

Write-Output 'Hello world'

Vale la pena señalar que aunque tanto Write-Output como Write-Host escriben en la pantalla, hay una sutil diferencia. Write-Host escribe solo en la salida estándar (es decir, la pantalla de la consola), mientras que Write-Output escribe tanto en la salida estándar Y en el flujo de salida [éxito] que permite [la redirección](https://blogs. technet.microsoft.com/heyscriptingguy/2014/03/30/understanding-streams-redirection-and-write-host-in-powershell/). 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 de Echo o Write

Echo 'Hello world'
Write 'Hello world'

¡O simplemente escribiendo ‘Hola mundo’!

'Hello world'

Todo lo cual dará como resultado la salida esperada de la consola.

Hello world

Otro ejemplo de alias en PowerShell es la asignación común de los comandos del símbolo del sistema más antiguos 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, usemos alias Test-NetConnection, que es esencialmente el equivalente de PowerShell al comando ping del símbolo del sistema, para “ping”.

Set-Alias -Name ping -Value Test-NetConnection

¡Ahora puede usar ping en 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 desde un Excel a su sesión una vez, antes de comenzar a trabajar.

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 crear secuencias de comandos es cómo manipular la salida de un cmdlet para realizar otra acción.

El símbolo de canalización | 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 usa la variable automática $. $ es el alias corto de $PSItem, que es una variable automática que contiene el elemento actual en la canalización.

Llamar a los métodos de la biblioteca .Net

Los métodos estáticos de la biblioteca .Net se pueden llamar desde PowerShell encapsulando el nombre completo de la clase en el tercer paréntesis 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 propia clase, pero llamar a métodos no estáticos requiere una instancia de la clase .Net (un objeto).

Por ejemplo, el método AddHours no se puede llamar 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] (https://www.wikiod.com/es/powershell/primeros-pasos-con-powershell#Crear objetos), por ejemplo:

C:\> $Object = [System.DateTime]::Now

Luego, podemos usar métodos de ese objeto, incluso métodos a los que no se puede llamar directamente desde la clase System.DateTime, como el método AddHours:

C:\> $Object.AddHours(15)

Monday 12 September 2016 01:51:19

Instalación o Configuración

Ventanas

PowerShell se incluye con el marco de administración de Windows. La instalación y la configuración no son necesarias en las versiones modernas de Windows.

Las actualizaciones de PowerShell se pueden lograr 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 repositorios de paquetes para facilitar la instalación (y las actualizaciones).

Para instalar 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 necesita usar sudo apt-get upgrade powershell para actualizarlo. Luego simplemente ejecute powershell

Comentando

Para comentar sobre scripts de energía anteponiendo la línea usando el símbolo # (almohadilla)

# This is a comment in powershell
Get-ChildItem

También puede tener comentarios de varias líneas usando <# y #> al principio y al final del comentario, respectivamente.

<#
This is a 
multi-line
comment
#>
Get-ChildItem

Creación de 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 pasarlos a otro comando. Esto se puede hacer así:

$newObject = New-Object -TypeName PSObject -Property @{
    ComputerName = "SERVER1"
    Role = "Interface"
    Environment = "Production"
}

Hay muchas maneras de crear un objeto. El siguiente método es probablemente la forma más corta 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 usando 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 canalización. 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 una propiedad.

Los comandos de formato convierten los objetos en un flujo de texto para su visualización. Evite usar los comandos Format-* hasta el paso final de cualquier procesamiento de datos, para mantener la usabilidad de los objetos.