Powershell Es
Powershell Es
#powershell
Tabla de contenido
Acerca de 1
Observaciones 2
Versiones 2
Examples 2
Instalación o configuración 2
Windows 3
Otras plataformas 3
Comentando 6
Métodos de la biblioteca. 6
Creando objetos 7
Introducción 9
Examples 9
Capítulo 3: Alias 10
Observaciones 10
Examples 11
Get-Alias 11
Set-Alias 11
Examples 13
Introducción 15
Examples 15
Anonimizar la dirección IP en el archivo de texto 15
Introducción 17
Examples 17
Introducción 18
Examples 18
Capítulo 8: Bucles 23
Introducción 23
Sintaxis 23
Observaciones 23
Para cada 23
Actuación 24
Examples 24
por 24
Para cada 24
Mientras 25
ForEach-Object 26
Uso básico 26
Uso avanzado 26
Hacer 27
Método ForEach () 27
Continuar 28
Descanso 28
Introducción 30
Observaciones 30
Examples 30
Interruptor simple 30
Declaración de cambio con el parámetro Regex 30
Introducción 35
Examples 35
Métodos y propiedades. 35
Introducción 39
Examples 39
Verbos 39
Sustantivos 39
Observaciones 40
Examples 40
Observaciones 47
Examples 47
Salida temprana 47
Examples 51
Oyente TCP 51
TCP Sender 51
Introducción 53
Examples 53
Uso de REST con objetos de PowerShell para obtener y colocar datos individuales 53
Usando REST con objetos de PowerShell para GET y POST muchos artículos 54
Examples 55
Introducción 57
Examples 57
Introducción 59
Parámetros 59
Observaciones 59
Examples 61
Ejemplo de ejemplo 61
SQLQuery 61
Examples 63
Funciones 63
Introducción 64
Observaciones 64
Examples 64
Sintaxis 67
Observaciones 67
Examples 67
Examples 69
Aplicaciones de consola 69
Aplicaciones GUI 69
Transmisiones de consola 69
Códigos de salida 70
Parámetros 71
Examples 72
Sintaxis 74
Examples 74
Partido individual 74
Usando Select-String 75
Reemplazar 76
Múltiples partidos 78
Usando Select-String 79
Observaciones 81
Políticas de ejecución 81
Examples 82
Firmando un guion 82
Introducción 85
Observaciones 85
Examples 85
Introducción 87
Examples 87
Parametros basicos 87
Parámetros obligatorios 88
Función avanzada 89
Validación de parámetros 90
ValidateSet 90
Validar Rango 91
ValidatePattern 91
ValidateLength 91
ValidateCount 91
ValidateScript 91
Introducción 93
Examples 93
Examples 95
Introducción 97
Observaciones 97
Examples 97
Introducción 100
Parámetros 100
Observaciones 100
Examples 101
Ejemplo de C # 101
Sintaxis 103
Observaciones 103
Examples 103
Cuerda 103
Observaciones 107
Examples 107
Sintaxis 109
Observaciones 109
Examples 109
ContinueOnError 110
Parámetros 111
Examples 112
Observaciones 115
Examples 115
si, si no y si 115
Negación 116
Introducción 118
Examples 118
Mezcla de tipos de operandos: el tipo del operando izquierdo dicta el comportamiento. 120
Introducción 122
Examples 122
Introducción 124
Examples 124
Encriptador 125
Almacenar las credenciales en forma cifrada y pasarlas como parámetro cuando sea necesario 125
Introducción 127
Observaciones 127
Examples 127
Módulo 127
Usuarios 127
Ordenadores 128
Objetos 128
Introducción 130
Sintaxis 130
Parámetros 130
Observaciones 131
Examples 131
Examples 132
Introducción 134
Examples 134
Introducción 135
Examples 135
Introducción 136
Examples 136
Introducción 139
Examples 139
Función 139
Manifestación 139
Guión 140
Manifestación 140
Módulo 141
Manifestación 141
Observaciones 145
Examples 145
Examples 147
Observaciones 148
Examples 148
Examples 151
Observaciones 153
Examples 154
Capítulo 52: PowerShell "Streams"; Depuración, detallado, advertencia, error, salida e inf 155
Observaciones 155
Examples 155
Escritura-salida 155
Observaciones 157
Examples 157
Introducción 162
Examples 162
Sintaxis 163
Examples 163
Introducción 165
Examples 165
Introducción 167
Observaciones 167
Examples 167
Examples 170
Cálculo de los códigos hash de una cadena a través de .Net Cryptography 170
Capítulo 59: Servicio de almacenamiento simple de Amazon Web Services (AWS) (S3) 171
Introducción 171
Parámetros 171
Examples 171
Introducción 173
Sintaxis 173
Examples 173
Examples 178
Plantillas 183
Lucro 185
Mejoras 185
Introducción 186
Sintaxis 186
Observaciones 186
Examples 186
Examples 189
Introducción 194
Observaciones 194
Examples 194
Introducción 197
Examples 197
Introducción 199
Examples 199
Sintaxis 202
Parámetros 202
Observaciones 202
Examples 202
Examples 205
Introducción 207
Sintaxis 207
Examples 207
$ pid 207
$ nulo 207
$ OFS 208
$ _ / $ PSItem 208
PS 209
$ error 209
Introducción 210
Observaciones 210
Examples 210
$ PSVersionTable 210
Examples 211
Las variables de entorno de Windows son visibles como una unidad PS llamada Env: 211
Introducción 212
Examples 212
Alcance 212
Arrays 214
Introducción 216
Examples 216
$ PSScriptRoot 216
$ Args 216
$ PSItem 216
PS 217
$ error 217
Observaciones 218
Examples 219
Creditos 224
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: powershell
It is an unofficial and free PowerShell ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official PowerShell.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@[Link]
[Link] 1
Capítulo 1: Empezando 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
Examples
Instalación o configuración
[Link] 2
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).
# 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
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 :
[Link] 3
O desde dentro de su consola PowerShell existente o sesión ISE ejecutando:
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.
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
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 :
Usando Write-Output :
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.
[Link] 4
"Hello World"
Estas funciones similares no son alias, pero pueden producir los mismos resultados si se quiere
evitar "contaminar" el flujo de éxito.
'Hello world'
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".
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.
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:
[Link] 5
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\
}
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)
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 [Link]()
C:\> [[Link]]::GetFileName('C:\Windows\[Link]')
[Link]
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 [Link].
Requiere una instancia de la clase:
C:\> [[Link]]::AddHours(15)
[Link] 6
Method invocation failed because [[Link]] does not contain a method named 'AddHours'.
At line:1 char:1
+ [[Link]]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Luego, podemos usar métodos de ese objeto, incluso métodos que no pueden llamarse
directamente desde la clase [Link], como el método AddHours:
C:\> $[Link](15)
Creando objetos
En muchos casos, se creará un nuevo objeto para exportar datos o pasarlo a otro commandlet.
Esto se puede hacer así:
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 :
[Link] 7
@{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.
[Link] 8
Capítulo 2: ¿Cómo descargar el último
artefacto de Artifactory usando el script de
Powershell (v2.0 o inferior)?
Introducción
Esta documentación explica y proporciona los pasos para descargar el último artefacto de un
repositorio de JFrog Artifactory utilizando Powershell Script (v2.0 o inferior).
Examples
Powershell Script para descargar el último artifcat
$username = 'user'
$password= 'password'
$DESTINATION = "D:\test\[Link]"
$client = New-Object [Link]
$[Link] = new-object [Link]($username, $password)
$lastModifiedResponse =
$[Link]('[Link]
[[Link]]::LoadWithPartialName("[Link]")
$serializer = New-Object [Link]
$getLatestModifiedResponse = $[Link]($lastModifiedResponse)
$downloaUriResponse = $[Link]
Write-Host $[Link]
$latestArtifcatUrlResponse=$[Link]($downloaUriResponse)
[[Link]]::LoadWithPartialName("[Link]")
$serializer = New-Object [Link]
$getLatestArtifact = $[Link]($latestArtifcatUrlResponse)
Write-Host $[Link]
$SOURCE=$[Link]
$[Link]($SOURCE,$DESTINATION)
Lea ¿Cómo descargar el último artefacto de Artifactory usando el script de Powershell (v2.0 o
inferior)? en línea: [Link]
artefacto-de-artifactory-usando-el-script-de-powershell--v2-0-o-inferior--
[Link] 9
Capítulo 3: Alias
Observaciones
El sistema de nombres de Powershell tiene reglas bastante estrictas para nombrar cmdlets
(plantilla Verb-Noun; consulte [el tema aún no se ha creado] para obtener más información). Pero
no es realmente conveniente escribir Get-ChildItems cada vez que quiera listar archivos en el
directorio de manera interactiva.
Por lo tanto, Powershell permite el uso de accesos directos (alias) en lugar de los nombres de los
cmdlets.
Puede escribir ls , dir o gci lugar de Get-ChildItem y obtener el mismo resultado. Alias es
equivalente a su cmdlet.
alias cmdlet
?, dónde Donde-objeto
fw Todo el formato
gm Get-Member
iex Invocar-expresión
ii Invocar objeto
[Link] 10
alias cmdlet
dormir Inicio-sueño
En la tabla anterior, puede ver cómo los alias habilitaron los comandos de simulación conocidos
de otros entornos (cmd, bash), por lo tanto, una mayor capacidad de descubrimiento.
Examples
Get-Alias
Get-Alias
Set-Alias
Este cmdlet le permite crear nuevos nombres alternativos para salir de los cmdlets
[Link] 11
------- ------ ----- ----- ----- ------ -- -- -----------
292 17 13052 20444 ...19 7.94 620 1 ApplicationFrameHost
....
Tenga en cuenta que cualquier alias que cree se conservará solo en la sesión actual. Cuando
inicie una nueva sesión, tendrá que volver a crear sus alias. Los Perfiles Powershell (ver [tema
aún no creado]) son excelentes para estos propósitos.
[Link] 12
Capítulo 4: Análisis CSV
Examples
Uso básico de Import-Csv
String,DateTime,Integer
First,2016-12-01T[Link],30
Second,2015-12-01T[Link],20
Third,2015-12-01T[Link],20
Uno puede importar las filas CSV en objetos de PowerShell usando el comando Import-Csv
De forma predeterminada, Import-CSV importa todos los valores como cadenas, por lo que para
obtener objetos DateTime e integer, debemos convertirlos o analizarlos.
Usando Foreach-Object :
#Output object
$_
}
[Link] 13
Salida:
[Link] 14
Capítulo 5: Anonimizar IP (v4 y v6) en un
archivo de texto con Powershell
Introducción
Manipulación de Regex para IPv4 e IPv6 y reemplazo por una dirección IP falsa en un archivo de
registro leído
Examples
Anonimizar la dirección IP en el archivo de texto
# Read a text file and replace the IPv4 and IPv6 by fake IP Address
# Replace matching IPv4 from sourcefile and creating a temp file [Link]
Get-Content $SourceFile | Foreach-Object {$_ -replace $Regex_v4, $Anonym_v4} | Set-Content
$IPv4File
# Replace matching IPv6 from [Link] and creating a temp file [Link]
Get-Content $IPv4File | Foreach-Object {$_ -replace $Regex_v6, $Anonym_v6} | Set-Content
$DestFile
[Link] 15
Else
{
Rename-Item $DestFile -NewName $AnonymFile
}
[Link] 16
Capítulo 6: Automatización de infraestructura
Introducción
La automatización de los servicios de gestión de la infraestructura permite reducir el FTE y
mejorar el ROI acumulativamente mediante el uso de múltiples herramientas, orquestadores,
motor de orquestación, scripts y una interfaz de usuario sencilla.
Examples
Script simple para prueba de integración de caja negra de aplicaciones de
consola
Este es un ejemplo simple de cómo puede automatizar las pruebas para una aplicación de
consola que interactúa con la entrada estándar y la salida estándar.
La aplicación probada lee y suma cada nueva línea y proporcionará el resultado después de que
se proporcione una sola línea blanca. El script del shell de poder escribe "pass" cuando la salida
coincide.
[Link] 17
Capítulo 7: Ayuda basada en comentarios
Introducción
PowerShell presenta un mecanismo de documentación llamado ayuda basada en comentarios.
Permite documentar scripts y funciones con comentarios de código. La ayuda basada en
comentarios es la mayor parte del tiempo escrita en bloques de comentarios que contienen varias
palabras clave de ayuda. Las palabras clave de ayuda comienzan con puntos e identifican las
secciones de ayuda que se mostrarán al ejecutar el cmdlet Get-Help .
Examples
Función basada en ayuda de comentarios
<#
.SYNOPSIS
Gets the content of an INI file.
.DESCRIPTION
Gets the content of an INI file and returns it as a hashtable.
.INPUTS
[Link]
.OUTPUTS
[Link]
.PARAMETER FilePath
Specifies the path to the input INI file.
.EXAMPLE
C:\PS>$IniContent = Get-IniContent -FilePath [Link]
C:\PS>$IniContent['Section1'].Key1
Gets the content of [Link] and access Key1 from Section1.
.LINK
Out-IniFile
#>
function Get-IniContent
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
[ValidateNotNullOrEmpty()]
[ValidateScript({(Test-Path $_) -and ((Get-Item $_).Extension -eq ".ini")})]
[[Link]]$FilePath
)
[Link] 18
switch -regex -file $FilePath
{
"^\[(.+)\]$" # Section
{
$section = $matches[1]
$ini[$section] = @{}
$CommentCount = 0
}
"^(;.*)$" # Comment
{
if( !($section) )
{
$section = "No-Section"
$ini[$section] = @{}
}
$value = $matches[1]
$CommentCount = $CommentCount + 1
$name = "Comment" + $CommentCount
$ini[$section][$name] = $value
}
"(.+?)\s*=\s*(.*)" # Key
{
if( !($section) )
{
$section = "No-Section"
$ini[$section] = @{}
}
$name,$value = $matches[1..2]
$ini[$section][$name] = $value
}
}
return $ini
}
[Link] 19
Observe que las palabras clave basadas en comentarios que comienzan con a . coincide con las
secciones de resultados de Get-Help .
<#
.SYNOPSIS
Reads a CSV file and filters it.
[Link] 20
.DESCRIPTION
The ReadUsersCsv.ps1 script reads a CSV file and filters it on the 'UserName' column.
.PARAMETER Path
Specifies the path of the CSV input file.
.INPUTS
None. You cannot pipe objects to ReadUsersCsv.ps1.
.OUTPUTS
None. ReadUsersCsv.ps1 does not generate any output.
.EXAMPLE
C:\PS> .\ReadUsersCsv.ps1 -Path C:\Temp\[Link] -UserName [Link]
#>
Param
(
[Parameter(Mandatory=$true,ValueFromPipeline=$false)]
[[Link]]
$Path,
[Parameter(Mandatory=$true,ValueFromPipeline=$false)]
[[Link]]
$UserName
)
La documentación del script anterior se puede mostrar ejecutando Get-Help -Name ReadUsersCsv.ps1
-Full :
[Link] 21
Lea Ayuda basada en comentarios en línea:
[Link]
[Link] 22
Capítulo 8: Bucles
Introducción
Un bucle es una secuencia de instrucción (es) que se repite continuamente hasta que se alcanza
una determinada condición. Ser capaz de hacer que su programa ejecute repetidamente un
bloque de código es una de las tareas más básicas pero útiles en la programación. Un bucle le
permite escribir una declaración muy simple para producir un resultado significativamente mayor
simplemente por repetición. Si se ha alcanzado la condición, la siguiente instrucción "cae" a la
siguiente instrucción secuencial o se ramifica fuera del bucle.
Sintaxis
• para (<Initialization>; <Condition>; <Repetition>) {<Script_Block>}
Observaciones
Para cada
Hay varias formas de ejecutar un bucle foreach en PowerShell y todas aportan sus propias
ventajas y desventajas:
[Link] 23
Solución Ventajas Desventajas
Actuación
"Foreach: $($[Link])"
"Foreach method: $($[Link])"
"ForEach-Object: $($[Link])"
Example output:
Foreach: 1.9039875
Foreach method: 4.7559563
ForEach-Object: 10.7543821
Si bien Foreach-Object es el más lento, su compatibilidad con tuberías puede ser útil, ya que le
permite procesar los elementos a medida que llegan (al leer un archivo, recibir datos, etc.). Esto
puede ser muy útil cuando se trabaja con big data y poca memoria, ya que no es necesario cargar
todos los datos en la memoria antes de procesar.
Examples
por
Un uso típico del bucle for es operar en un subconjunto de los valores en una matriz. En la
mayoría de los casos, si desea iterar todos los valores de una matriz, considere usar una
instrucción foreach.
Para cada
ForEach tiene dos significados diferentes en PowerShell. Una es una palabra clave y la otra es un
alias para el cmdlet ForEach-Object . El primero se describe aquí.
Este ejemplo muestra cómo imprimir todos los elementos de una matriz en el host de la consola:
[Link] 24
ForEach ($Name in $Names)
{
Write-Host "Hi, my name is $Name!"
}
Al igual que el último ejemplo, este ejemplo, en su lugar, demuestra la creación de una matriz
antes de almacenar el bucle:
$Numbers = @()
ForEach ($Number in 1..20)
{
$Numbers += $Number
}
Mientras
Un bucle while evaluará una condición y si es verdadero realizará una acción. Mientras la
condición se evalúe como verdadera, la acción continuará realizándose.
while(condition){
code_block
}
$i = 10
while($i -ge 0){
$i
$i--
}
A diferencia del bucle Do While, la condición se evalúa antes de la primera ejecución de la acción.
La acción no se realizará si la condición inicial se evalúa como falsa.
Start-Process [Link]
while(Get-Process notepad -ErrorAction SilentlyContinue){
Start-Sleep -Milliseconds 500
}
[Link] 25
ForEach-Object
Uso básico
$object | ForEach-Object {
code_block
}
Ejemplo:
$names = @("Any","Bob","Celine","David")
$names | ForEach-Object {
"Hi, my name is $_!"
}
$names | % {
"Hi, my name is $_!"
}
$names | foreach {
"Hi, my name is $_!"
}
Uso avanzado
Foreach-Object destaca de las soluciones alternativas de foreach porque es un cmdlet, lo que
significa que está diseñado para usar la canalización. Debido a esto, admite tres bloques de
secuencias de comandos, como un cmdlet o una función avanzada:
• Inicio : se ejecuta una vez antes de recorrer en bucle los elementos que llegan desde la
tubería. Generalmente se utiliza para crear funciones para su uso en el bucle, crear
variables, abrir conexiones (base de datos, web +), etc.
• Proceso : Ejecutado una vez por artículo llegó desde la tubería. "Normal" para cada bloque
de código. Este es el valor predeterminado que se utiliza en los ejemplos anteriores cuando
no se especifica el parámetro.
• Fin : Se ejecuta una vez después de procesar todos los elementos. Usualmente se usa para
cerrar conexiones, generar un informe, etc.
Ejemplo:
[Link] 26
#Create and store message
$results += "Hi, my name is $_!"
} -End {
#Count messages and output
Write-Host "Total messages: $($[Link])"
$results
}
Hacer
Los do-loops son útiles cuando siempre desea ejecutar un bloque de código al menos una vez.
Un Do-loop evaluará la condición después de ejecutar el bloque de código, a diferencia de un
ciclo while que lo hace antes de ejecutar el bloque de código.
Do {
code_block
} while (condition)
• Bucle hasta que la condición sea verdadera, en otras palabras, haga un ciclo mientras la
condición sea falsa:
Do {
code_block
} until (condition)
Ejemplos reales:
$i = 0
Do {
$i++
"Number $i"
} while ($i -ne 3)
Do {
$i++
"Number $i"
} until ($i -eq 3)
Do-While y Do-Until son bucles antónimos. Si el código dentro del mismo, la condición se
invertirá. El ejemplo anterior ilustra este comportamiento.
Método ForEach ()
4.0
En lugar del cmdlet ForEach-Object , aquí también existe la posibilidad de usar un método ForEach
directamente en matrices de objetos, de este modo
[Link] 27
(1..10).ForEach({$_ * $_})
(1..10).ForEach{$_ * $_}
1
4
9
16
25
36
49
64
81
100
Continuar
El operador Continue trabaja en los ForEach For , ForEach , While y Do Omite la iteración actual del
bucle, saltando a la parte superior del bucle más interno.
$i =0
while ($i -lt 20) {
$i++
if ($i -eq 7) { continue }
Write-Host $I
}
Descanso
$i = 0
while ($i -lt 15) {
$i++
if ($i -eq 7) {break}
Write-Host $i
}
Nota : cuando se usa un bucle de tubería, la break se comportará como continue . Para simular
una break en el bucle de canalización, debe incorporar lógica adicional, cmdlet, etc. Es más fácil
[Link] 28
seguir con bucles no de tubería si necesita usar break .
Etiquetas de rotura
Break también puede llamar a una etiqueta que se colocó delante de la creación de instancias de
un bucle:
$i = 0
:mainLoop While ($i -lt 15) {
Write-Host $i -ForegroundColor 'Cyan'
$j = 0
While ($j -lt 15) {
Write-Host $j -ForegroundColor 'Magenta'
$k = $i*$j
Write-Host $k -ForegroundColor 'Green'
if ($k -gt 100) {
break mainLoop
}
$j++
}
$i++
}
Nota: este código incrementará $i a 8 y $j a 13 que hará que $k igual a 104 . Como $k excede de
100 , el código se separará de ambos bucles.
[Link] 29
Capítulo 9: Cambiar la declaración
Introducción
Una declaración de cambio permite que una variable se pruebe para determinar su igualdad
frente a una lista de valores. Cada valor se llama un caso , y la variable que se está activando se
comprueba para cada caso de interruptor. Le permite escribir un script que puede elegir entre una
serie de opciones, pero sin requerir que escriba una larga serie de sentencias if.
Observaciones
Este tema documenta la instrucción de conmutación utilizada para bifurcar el flujo del script. No
lo confunda con los parámetros del interruptor que se utilizan en las funciones como
indicadores booleanos.
Examples
Interruptor simple
Las declaraciones de cambio comparan un solo valor de prueba con múltiples condiciones y
realizan las acciones asociadas para realizar comparaciones exitosas. Puede dar lugar a
múltiples coincidencias / acciones.
switch($myValue)
{
'First Condition' { 'First Action' }
'Second Condition' { 'Second Action' }
}
'First Action' emitirá 'First Action' si $myValue se establece como 'First Condition' .
El parámetro -Regex permite que las instrucciones de conmutación realicen una comparación de
expresiones regulares con las condiciones.
Ejemplo:
[Link] 30
'Con\D+ion' {'One or more non-digits'}
'Conditio*$' {'Zero or more "o"'}
'[Link]' {'Any single char.'}
'^C\w+ition$' {'Anchors and one or more word chars.'}
'Test' {'No match'}
}
Salida:
La palabra clave break se puede usar en las instrucciones de cambio para salir de la declaración
antes de evaluar todas las condiciones.
Ejemplo:
switch('Condition')
{
'Condition'
{
'First Action'
}
'Condition'
{
'Second Action'
break
}
'Condition'
{
'Third Action'
}
}
Salida:
First Action
Second Action
El parámetro -Wildcard permite que las instrucciones de conmutación realicen una coincidencia de
comodín con las condiciones.
Ejemplo:
[Link] 31
{
'Condition' {'Normal match'}
'Condit*' {'Zero or more wildcard chars.'}
'C[aoc]ndit[f-l]on' {'Range and set of chars.'}
'C?ndition' {'Single char. wildcard'}
'Test*' {'No match'}
}
Salida:
Normal match
Zero or more wildcard chars.
Range and set of chars.
Single char. wildcard
El parámetro -Exact que las instrucciones de conmutación realicen una coincidencia exacta, que
no -Exact entre mayúsculas y minúsculas, con condiciones de cadena.
Ejemplo:
Salida:
First Action
Second Action
Third Action
Las acciones primera a tercera se ejecutan porque sus condiciones asociadas coinciden con la
entrada. Las cadenas de expresiones regulares y de comodín en las condiciones cuarta y quinta
no coinciden.
Tenga en cuenta que la cuarta condición también coincidiría con la cadena de entrada si se
realizara una comparación de expresiones regulares, pero en este caso se ignoró porque no lo
es.
Ejemplo:
[Link] 32
switch -CaseSensitive ('Condition')
{
'condition' {'First Action'}
'Condition' {'Second Action'}
'conditioN' {'Third Action'}
}
Salida:
Second Action
La segunda acción es la única acción ejecutada porque es la única condición que coincide
exactamente con la cadena 'Condition' cuando se tiene en cuenta la distinción entre mayúsculas
y minúsculas.
El parámetro -file permite que la instrucción de cambio reciba entrada de un archivo. Cada línea
del archivo es evaluada por la instrucción switch.
condition
test
Salida:
First Action
Second Action
La palabra clave Default se usa para ejecutar una acción cuando ninguna otra condición coincide
con el valor de entrada.
Ejemplo:
switch('Condition')
{
'Skip Condition'
{
'First Action'
[Link] 33
}
'Skip This Condition Too'
{
'Second Action'
}
Default
{
'Default Action'
}
}
Salida:
Default Action
$myInput = 0
switch($myInput) {
# because the result of the expression, 4,
# does not equal our input this block should not be run.
(2+2) { 'True. 2 +2 = 4' }
#Output
True. 2-2 = 0
True. Value is 0
[Link] 34
Capítulo 10: Clases de PowerShell
Introducción
Una clase es una plantilla de código de programa extensible para crear objetos, que proporciona
valores iniciales para el estado (variables miembro) e implementaciones de comportamiento
(funciones o métodos miembro). Una clase es un plano para un objeto. Se utiliza como modelo
para definir la estructura de los objetos. Un objeto contiene datos a los que accedemos a través
de propiedades y en los que podemos trabajar utilizando métodos. PowerShell 5.0 agregó la
capacidad de crear sus propias clases.
Examples
Métodos y propiedades.
class Person {
[string] $FirstName
[string] $LastName
[string] Greeting() {
return "Greetings, {0} {1}!" -f $[Link], $[Link]
}
}
$x = [Person]::new()
$[Link] = "Jane"
$[Link] = "Doe"
$greeting = $[Link]() # "Greetings, Jane Doe!"
5.0
En PowerShell 5.0+, puede enumerar los constructores disponibles llamando al new método
estático sin paréntesis.
PS> [DateTime]::new
OverloadDefinitions
-------------------
datetime new(long ticks)
datetime new(long ticks, [Link] kind)
datetime new(int year, int month, int day)
datetime new(int year, int month, int day, [Link] calendar)
datetime new(int year, int month, int day, int hour, int minute, int second)
datetime new(int year, int month, int day, int hour, int minute, int second,
[Link] kind)
datetime new(int year, int month, int day, int hour, int minute, int second,
[Link] calendar)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond,
[Link] 35
[Link] kind)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond,
[Link] calendar)
datetime new(int year, int month, int day, int hour, int minute, int second, int millisecond,
[Link] calendar, [Link] kind)
Esta es la misma técnica que puede usar para enumerar las definiciones de sobrecarga para
cualquier método.
> 'abc'.CompareTo
OverloadDefinitions
-------------------
int CompareTo([Link] value)
int CompareTo(string strB)
int [Link]([Link] obj)
int IComparable[string].CompareTo(string other)
Para versiones anteriores puede crear su propia función para listar los constructores disponibles:
function Get-Constructor {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
[type]$type
)
Process {
$[Link]() |
Format-Table -Wrap @{
n="$($[Link]) Constructors"
e={ ($_.GetParameters() | % { $_.ToString() }) -Join ", " }
}
}
}
Uso:
Get-Constructor [Link]
#Or [datetime] | Get-Constructor
DateTime Constructors
---------------------
Int64 ticks
Int64 ticks, [Link] kind
Int32 year, Int32 month, Int32 day
Int32 year, Int32 month, Int32 day, [Link] calendar
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second,
[Link] kind
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second,
[Link] calendar
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond,
[Link] kind
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond,
[Link]
[Link] 36
endar calendar
Int32 year, Int32 month, Int32 day, Int32 hour, Int32 minute, Int32 second, Int32 millisecond,
[Link]
endar calendar, [Link] kind
class Person {
[string] $Name
[int] $Age
Person([string] $Name) {
$[Link] = $Name
}
Esto devolverá a todos los miembros de la instancia de tipo. Aquí es una parte de una salida de
muestra para la instancia de cadena
TypeName: [Link]
# Define a class
class TypeName
{
# Property with validate set
[Link] 37
[ValidateSet("val1", "Val2")]
[string] $P1
# Static property
static [hashtable] $P2
# Constructor
TypeName ([string] $s)
{
$this.P1 = $s
}
# Static method
static [void] MemberMethod1([hashtable] $h)
{
[TypeName]::P2 = $h
}
# Instance method
[int] MemberMethod2([int] $i)
{
$this.P3 = $i
return $this.P3
}
}
class ParentClass
{
[string] $Message = "Its under the Parent Class"
[string] GetMessage()
{
return ("Message: {0}" -f $[Link])
}
}
}
$Inherit = [ChildClass]::new()
[Link] 38
Capítulo 11: Cmdlet Naming
Introducción
Los CmdLets deben nombrarse utilizando un esquema de denominación <verb>-<noun> para
mejorar el descubrimiento.
Examples
Verbos
Los verbos que se usan para nombrar CmdLets deben nombrarse de los verbos de la lista que se
proporciona con Get-Verb
Se pueden encontrar más detalles sobre cómo usar verbos en Verbos aprobados para Windows
PowerShell
Sustantivos
Sea consistente con los sustantivos. Por ejemplo, Find-Package necesita un proveedor
PackageProvider nombre sea PackageProvider no ProviderPackage .
[Link] 39
Capítulo 12: Codificar / Decodificar URL
Observaciones
La expresión regular utilizada en los ejemplos de URL de decodificación se tomó del RFC 2396,
Apéndice B: Análisis de una referencia URI con una expresión regular ; Para la posteridad, aquí
hay una cita:
La siguiente línea es la expresión regular para desglosar una referencia URI en sus
componentes.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Los números en la segunda línea de arriba son solo para ayudar a la legibilidad;
indican los puntos de referencia para cada subexpresión (es decir, cada paréntesis
emparejado). Nos referimos al valor que coincide con la subexpresión como $. Por
ejemplo, haciendo coincidir la expresión anterior con
[Link]
$1 = http:
$2 = http
$3 = //[Link]
$4 = [Link]
$5 = /pub/ietf/uri/
$6 = <undefined>
$7 = <undefined>
$8 = #Related
$9 = Related
Examples
Inicio rápido: codificación
[Link] 40
Inicio rápido: decodificación
Nota: estos ejemplos utilizan las variables creadas en la sección de Inicio rápido: Codificación
anterior.
# url1: http%3A%2F%[Link]%3Ftest%3Dmy%20value
[uri]::UnescapeDataString($url1)
# Returns: [Link] value
# url2: [Link]
[uri]::UnescapeDataString($url2)
# Returns: [Link] value
# url3: http%3a%2f%[Link]%3ftest%3dmy+value
[uri]::UnescapeDataString($url3)
# Returns: [Link]
$scheme = 'https'
$url_format = '{0}://[Link]/foos?{1}'
$qs_data = @{
'foo1'='bar1';
'foo2'= 'complex;/?:@&=+$, bar''"';
'complex;/?:@&=+$, foo''"'='bar2';
}
[Link] 41
Con [uri]::EscapeDataString() , notará que el apóstrofe ( ' ) no estaba codificado:
$scheme = 'https'
$url_format = '{0}://[Link]/foos?{1}'
$qs_data = @{
'foo1'='bar1';
'foo2'= 'complex;/?:@&=+$, bar''"';
'complex;/?:@&=+$, foo''"'='bar2';
}
$url =
'[Link]
[Link] 42
'QueryString' = $Matches[7];
'QueryStringParts' = @{}
}
Esto te devuelve [hashtable]$url_parts ; que es igual ( Nota: los espacios en las partes complejas
son espacios ):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server [Link]
QueryString
foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar'%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo'%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
$url =
'[Link]
[Link] 43
'Path' = $Matches[5];
'QueryString' = $Matches[7];
'QueryStringParts' = @{}
}
Esto le devuelve [hashtable]$url_parts , que es igual a ( Nota: los espacios en las partes
complejas son signos más ( + ) en la primera parte y espacios en la segunda parte):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server [Link]
QueryString
foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
$url =
'[Link]
[Link] 44
if ($url -match $url_parts_regex) {
$url_parts = @{
'Scheme' = $Matches[2];
'Server' = $Matches[4];
'Path' = $Matches[5];
'QueryString' = $Matches[7];
'QueryStringParts' = @{}
}
Esto te devuelve [hashtable]$url_parts ; que es igual ( Nota: los espacios en las partes complejas
son espacios ):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server [Link]
QueryString
foo2=complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20bar'%22&complex%3B%2F%3F%3A%40%26%3D%2B%24%2C%20foo'%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
$url =
'[Link]
[Link] 45
if ($url -match $url_parts_regex) {
$url_parts = @{
'Scheme' = $Matches[2];
'Server' = $Matches[4];
'Path' = $Matches[5];
'QueryString' = $Matches[7];
'QueryStringParts' = @{}
}
Esto te devuelve [hashtable]$url_parts ; que es igual ( Nota: los espacios en las partes complejas
son espacios ):
PS > $url_parts
Name Value
---- -----
Scheme https
Path /foos
Server [Link]
QueryString
foo2=complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+bar%27%22&complex%3b%2f%3f%3a%40%26%3d%2b%24%2c+foo%27%22=ba
PS > $url_parts.QueryStringParts
Name Value
---- -----
foo2 complex;/?:@&=+$, bar'"
complex;/?:@&=+$, foo'" bar2
foo1 bar1
[Link] 46
Capítulo 13: Comportamiento de retorno en
PowerShell
Introducción
Se puede utilizar para salir del ámbito actual, que puede ser una función, un script o un bloque de
script. En PowerShell, el resultado de cada declaración se devuelve como resultado, incluso sin
una palabra clave de retorno explícita o para indicar que se ha llegado al final del alcance.
Observaciones
Puede leer más sobre la semántica de retorno en la página about_Return en TechNet, o
invocando la get-help return desde un indicador de PowerShell.
La palabra clave Return sale de una función, script o bloque de script. Se puede usar
para salir de un alcance en un punto específico, para devolver un valor o para indicar
que se ha llegado al final del alcance.
Los usuarios que están familiarizados con lenguajes como C o C # pueden querer usar
la palabra clave Return para hacer que la lógica de dejar un alcance explícito.
Examples
Salida temprana
function earlyexit {
"Hello"
return
"World"
}
[Link] 47
"Hola" se colocará en el canal de salida, "Mundo" no
Los cmdlets de ForEach-Object (por ejemplo, ForEach-Object , Where-Object , etc.) operan en los
cierres. La devolución aquí solo se moverá al siguiente elemento en la canalización, no al proceso
de salida. Puede usar break en lugar de return si desea salir del proceso.
Inspirado por
function bar {
[[Link]]$MyVariable = @()
$[Link]("a") | Out-Null
$[Link]("b") | Out-Null
$MyVariable
}
function bar
{
# New-Item cmdlet returns information about newly created file/folder
New-Item "[Link]" | out-null
New-Item "[Link]" > $null
[void](New-Item "[Link]")
$tmp = New-Item "[Link]"
}
Nota: para obtener más información sobre por qué preferir > $null , consulte [tema aún no
creado].
(Parafraseado de about_return )
function foo {
$a = "Hello"
[Link] 48
return $a
}
function bar {
$a = "Hello"
$a
return
}
function quux {
$a = "Hello"
$a
}
Me gusta esto:
Function Test-Function
{
Param
(
[switch]$ExceptionalReturn
)
"Start"
if($ExceptionalReturn){Return "Damn, it didn't work!"}
New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
Return "Yes, it worked!"
}
Función de prueba
Volverá
• comienzo
• La clave de registro recién creada (esto se debe a que hay algunas declaraciones que crean
resultados que puede no estar esperando)
• Sí, funcionó!
• comienzo
• Maldita sea, no funcionó!
Si lo haces así:
Function Test-Function
{
Param
(
[switch]$ExceptionalReturn
[Link] 49
)
. {
"Start"
if($ExceptionalReturn)
{
$Return = "Damn, it didn't work!"
Return
}
New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
$Return = "Yes, it worked!"
Return
} | Out-Null
Return $Return
}
Función de prueba
Volverá
• Sí, funcionó!
Con este truco, puede controlar el resultado devuelto incluso si no está seguro de lo que escupirá
cada declaración.
Funciona así
.{<Statements>} | Out-Null
[Link] 50
Capítulo 14: Comunicación TCP con
PowerShell
Examples
Oyente TCP
Function Receive-TCPMessage {
Param (
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[int] $Port
)
Process {
Try {
# Set up endpoint and start listening
$endpoint = new-object [Link]([ipaddress]::any,$port)
$listener = new-object [Link] $EndPoint
$[Link]()
# Stream setup
$stream = $[Link]()
$bytes = New-Object [Link][] 1024
TCP Sender
Function Send-TCPMessage {
Param (
[Link] 51
[Parameter(Mandatory=$true, Position=0)]
[ValidateNotNullOrEmpty()]
[string]
$EndPoint
,
[Parameter(Mandatory=$true, Position=1)]
[int]
$Port
,
[Parameter(Mandatory=$true, Position=2)]
[string]
$Message
)
Process {
# Setup connection
$IP = [[Link]]::GetHostAddresses($EndPoint)
$Address = [[Link]]::Parse($IP)
$Socket = New-Object [Link]($Address,$Port)
Send-TCPMessage -Port 29800 -Endpoint [Link] -message "My first TCP message !"
Nota : los mensajes TCP pueden estar bloqueados por el firewall de su software o por cualquier
firewall externo que esté tratando de atravesar. Asegúrese de que el puerto TCP que configuró en
el comando anterior esté abierto y que haya configurado el servicio de escucha en el mismo
puerto.
[Link] 52
Capítulo 15: Comunicarse con APIs RESTful
Introducción
REST significa "Representational State Transfer" (Transferencia estatal representativa) (a veces
deletreado "ReST"). Se basa en un protocolo de comunicaciones sin caché, cliente-servidor, que
se puede almacenar en caché y, en su mayoría, se utiliza el protocolo HTTP. Se utiliza
principalmente para crear servicios web que sean livianos, mantenibles y escalables. Un servicio
basado en REST se denomina servicio RESTful y las API que se están utilizando son API
RESTful. En PowerShell, Invoke-RestMethod se utiliza para tratar con ellos.
Examples
Utilice [Link] entrantes Webhooks
$params = @{
Uri = "[Link]
Method = "POST"
Body = @{
color = 'yellow'
message = "This is a test message!"
notify = $false
message_format = "text"
} | ConvertTo-Json
ContentType = 'application/json'
}
Invoke-RestMethod @params
[Link] 53
Modifique sus datos:
Usando REST con objetos de PowerShell para GET y POST muchos artículos
[Link] 54
Capítulo 16: Configuración del estado
deseado
Examples
Ejemplo simple - Habilitar WindowsFeature
configuration EnableIISFeature
{
node localhost
{
WindowsFeature IIS
{
Ensure = “Present”
Name = “Web-Server”
}
}
}
Para probar la configuración de DSC en su host local, simplemente puede invocar lo siguiente:
Iniciar un DSC en una máquina remota es casi igual de simple. Suponiendo que ya haya
configurado la comunicación remota de Powershell (o que haya habilitado WSMAN).
$remoteComputer = "[Link]"
$cred = (Get-Credential)
Start-DSCConfiguration -ServerName $remoteComputer -Credential $cred -Verbose
Nb: asumiendo que ha compilado una configuración para su nodo en su máquina local (y que el
archivo [Link] está presente antes de comenzar la configuración)
A veces puede ser útil probar sus archivos de datos de Powershell e iterar a través de los nodos y
servidores.
Powershell 5 (WMF5) agregó esta pequeña característica para hacer esto llamado Import-
PowerShellDataFile.
Ejemplo:
[Link] 55
$data = Import-PowerShellDataFile -path .\MydataFile.psd1
$[Link]
Get-DscResource
Esto mostrará una lista de todos los recursos para todos los módulos instalados (que están en su
PSModulePath) en su nodo de creación.
Para enumerar todos los recursos DSC disponibles que se pueden encontrar en las fuentes en
línea (PSGallery ++) en WMF 5:
Find-DSCResource
Antes de poder utilizar un recurso en una configuración, debe importarlo explícitamente. El solo
hecho de tenerlo instalado en su computadora, no le permitirá usar el recurso de manera
implícita.
Configuration InstallPreReqs
{
param(); # params to DSC goes here.
Import-DscResource PSDesiredStateConfiguration
File CheckForTmpFolder {
Type = 'Directory'
DestinationPath = 'C:\Tmp'
Ensure = "Present"
}
}
Nota : para que los recursos de DSC funcionen, debe tener los módulos instalados en las
máquinas de destino al ejecutar la configuración. Si no los tiene instalados, la configuración
fallará.
[Link] 56
Capítulo 17: Conjuntos de parámetros
Introducción
Los conjuntos de parámetros se utilizan para limitar la posible combinación de parámetros, o
para imponer el uso de parámetros cuando se seleccionan 1 o más parámetros.
Examples
Conjuntos de parámetros simples
function myFunction
{
param(
# If parameter 'a' is used, then 'c' is mandatory
# If parameter 'b' is used, then 'c' is optional, but allowed
# You can use parameter 'c' in combination with either 'a' or 'b'
# 'a' and 'b' cannot be used together
[parameter(ParameterSetName="AandC", mandatory=$true)]
[switch]$a,
[parameter(ParameterSetName="BandC", mandatory=$true)]
[switch]$b,
[parameter(ParameterSetName="AandC", mandatory=$true)]
[parameter(ParameterSetName="BandC", mandatory=$false)]
[switch]$c
)
# $[Link] can be used to check which parameter set was used
Write-Host $[Link]
}
# Valid syntaxes
myFunction -a -c
# => "Parameter set : AandC"
myFunction -b -c
# => "Parameter set : BandC"
myFunction -b
# => "Parameter set : BandC"
# Invalid syntaxes
myFunction -a -b
# => "Parameter set cannot be resolved using the specified named parameters."
myFunction -a
# => "Supply values for the following parameters:
# c:"
Cuando desee, por ejemplo, imponer el uso del parámetro Contraseña si se proporciona el
[Link] 57
parámetro Usuario. (y viceversa)
Function Do-Something
{
Param
(
[Parameter(Mandatory=$true)]
[String]$SomeThingToDo,
[Parameter(ParameterSetName="Credentials", mandatory=$false)]
[String]$Computername = "LocalHost",
[Parameter(ParameterSetName="Credentials", mandatory=$true)]
[String]$User,
[Parameter(ParameterSetName="Credentials", mandatory=$true)]
[SecureString]$Password
)
#Do something
}
# This will not work he will ask for user and password
Do-Something -SomeThingToDo 'get-help about_Functions_Advanced' -ComputerName
Function Do-Something
{
Param
(
[Parameter(Mandatory=$true)]
[String]$SomeThingToDo,
[Parameter(ParameterSetName="Silently", mandatory=$false)]
[Switch]$Silently,
[Parameter(ParameterSetName="Loudly", mandatory=$false)]
[Switch]$Loudly
)
#Do something
}
# This will not work because you can not use the combination Silently and Loudly
Do-Something -SomeThingToDo 'get-help about_Functions_Advanced' -Silently -Loudly
[Link] 58
Capítulo 18: consultas de powershell sql
Introducción
Al revisar este documento, puede aprender a utilizar consultas SQL con powershell.
Parámetros
ít Descripción
Observaciones
Puede usar la siguiente función si en caso de no poder importar el módulo SQLPS
function Import-Xls
{
[CmdletBinding(SupportsShouldProcess=$true)]
Param(
[parameter(
mandatory=$true,
position=1,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[String[]]
$Path,
[parameter(mandatory=$false)]
$Worksheet = 1,
[parameter(mandatory=$false)]
[switch]
$Force
)
Begin
{
function GetTempFileName($extension)
[Link] 59
{
$temp = [[Link]]::GetTempFileName();
$params = @{
Path = $temp;
Destination = $temp + $extension;
Confirm = $false;
Verbose = $VerbosePreference;
}
Move-Item @params;
$temp += $extension;
return $temp;
}
Process
{
$Path | ForEach-Object {
$fileExist = Test-Path $_
if (-not $fileExist) {
Write-Error "Error: $_ does not exist" -Category ResourceUnavailable;
} else {
# create temporary .csv file from excel file and import .csv
#
$_ = (Resolve-Path $_).toString();
$wb = $[Link]($_);
if ($?) {
$csvTemp = GetTempFileName(".csv");
[Link] 60
$ws = $[Link]($Worksheet);
$[Link]($csvTemp, $xlFileFormats[".csv"]);
$[Link]($false);
Remove-Variable -Name ('ws', 'wb') -Confirm:$false;
Import-Csv $csvTemp;
Remove-Item $csvTemp -Confirm:$false -Verbose:$VerbosePreference;
}
}
}
}
}
End
{
$[Link]();
Remove-Variable -name xl -Confirm:$false;
[gc]::Collect();
}
}
Examples
Ejemplo de ejemplo
Para consultar todos los datos de la tabla MachineName podemos usar el comando como el
siguiente.
$ Inst = "ServerInstance"
$ DbName = "DatabaseName
$ Contraseña = "Contraseña"
Invoke-Sqlcmd2 -Serverinstance $Inst -Database $DBName -query $Query -Username $UID -Password
$Password
SQLQuery
Para consultar todos los datos de la tabla MachineName podemos usar el comando como el
siguiente.
$ Inst = "ServerInstance"
$ DbName = "DatabaseName
[Link] 61
$ Contraseña = "Contraseña"
Invoke-Sqlcmd2 -Serverinstance $Inst -Database $DBName -query $Query -Username $UID -Password
$Password
[Link] 62
Capítulo 19: Convenciones de nombres
Examples
Funciones
Get-User()
[Link] 63
Capítulo 20: Creación de recursos basados
en clases DSC
Introducción
A partir de la versión 5.0 de PowerShell, puede usar las definiciones de clase de PowerShell para
crear recursos de configuración de estado deseado (DSC).
Para ayudar en la creación del recurso DSC, hay un [DscResource()] que se aplica a la definición
de la clase y un [DscProperty()] para designar propiedades configurables por el usuario del
recurso DSC.
Observaciones
Un recurso DSC basado en clase debe:
Después de crear un recurso DSC de PowerShell basado en clase, debe ser "exportado" desde
un módulo, usando un archivo de manifiesto de módulo (.psd1). Dentro del manifiesto del módulo,
la clave de tabla hash DscResourcesToExport se utiliza para declarar una matriz de recursos DSC
(nombres de clase) para "exportar" desde el módulo. Esto permite a los consumidores del módulo
DSC "ver" los recursos basados en clase dentro del módulo.
Examples
Crear una clase de esqueleto de recursos DSC
[DscResource()]
class File {
}
Este ejemplo muestra cómo construir la sección externa de una clase de PowerShell, que declara
un recurso DSC. Aún debe completar los contenidos de la definición de clase.
[DscResource()]
class Ticket {
[DscProperty(Key)]
[Link] 64
[string] $TicketId
}
Un recurso DSC debe declarar al menos una propiedad clave. La propiedad clave es lo que
identifica de forma única el recurso de otros recursos. Por ejemplo, digamos que está creando un
recurso DSC que representa un ticket en un sistema de tickets. Cada boleto estaría representado
de manera única con un ID de boleto.
Cada propiedad que se expondrá al usuario del recurso DSC debe estar decorada con el
[DscProperty()] . Este atributo acepta un parámetro key , para indicar que la propiedad es un
atributo clave para el recurso DSC.
[DscResource()]
class Ticket {
[DscProperty(Key)]
[string] $TicketId
[DscProperty(Mandatory)]
[string] $Subject
}
Al crear un recurso de DSC, a menudo encontrará que no todas las propiedades deben ser
obligatorias. Sin embargo, hay algunas propiedades centrales que querrá asegurarse de que
estén configuradas por el usuario del recurso DSC. Utiliza el parámetro Mandatory del
[DscResource()] para declarar una propiedad según lo requiera el usuario del recurso DSC.
En el ejemplo anterior, hemos agregado una propiedad del Subject a un recurso de Ticket , que
representa un boleto único en un sistema de boleto, y lo hemos designado como una propiedad
Mandatory .
[DscResource()]
class Ticket {
[DscProperty(Key)]
[string] $TicketId
[void] Set() {
# Create or update the resource
}
[Ticket] Get() {
# Return the resource's current state as an object
[Link] 65
$TicketState = [Ticket]::new()
return $TicketState
}
[bool] Test() {
# Return $true if desired state is met
# Return $false if desired state is not met
return $false
}
}
Este es un recurso de DSC completo que muestra todos los requisitos básicos para construir un
recurso válido. Las implementaciones del método no están completas, pero se proporcionan con
la intención de mostrar la estructura básica.
[Link] 66
Capítulo 21: Cumplimiento de requisitos
previos de script
Sintaxis
• #Requiere -Version <N> [. <n>]
• #Requiere –PSSnapin <PSSnapin-Name> [-Version <N> [. <n>]]
• #Requiere -Módulos {<Módulo-Nombre> | <Hashtable>}
• #Requires –ShellId <ShellId>
• #Requiere -RunAsAdministrator
Observaciones
#requires declaración #requires se puede colocar en cualquier línea de la secuencia de comandos
(no tiene que ser la primera línea), pero debe ser la primera declaración en esa línea.
Examples
Exigir la versión mínima del servidor de PowerShell
#requires -version 4
Después de intentar ejecutar esta secuencia de comandos en una versión inferior, verá este
mensaje de error
4.0
#requires -RunAsAdministrator
Después de intentar ejecutar este script sin privilegios de administrador, verá este mensaje de
error
[Link] 67
. \ script.ps1: El script 'script.ps1' no se puede ejecutar porque contiene una
declaración "#requires" para ejecutarse como Administrador. La sesión actual de
Windows PowerShell no se está ejecutando como administrador. Inicie Windows
PowerShell con la opción Ejecutar como administrador y luego intente ejecutar el script
nuevamente.
[Link] 68
Capítulo 22: Ejecutando ejecutables
Examples
Aplicaciones de consola
PS> console_app.exe
PS> & console_app.exe
PS> Start-Process console_app.exe
Aplicaciones GUI
Transmisiones de consola
PowerShell entiende estas secuencias: Salida, Error, Advertencia, Verbose, Depurar, Progreso.
Las aplicaciones nativas comúnmente usan solo estas secuencias: Salida, Error, Advertencia.
En PowerShell 5, todos los flujos pueden redirigirse al flujo de salida / éxito estándar (6).
[Link] 69
Códigos de salida
PS> $LastExitCode
PS> $?
PS> $Error[0]
Estas son variables incorporadas de PowerShell que proporcionan información adicional sobre el
error más reciente. $LastExitCode es el código de salida final de la última aplicación nativa que se
ejecutó. $? y $Error[0] es el último registro de error generado por PowerShell.
[Link] 70
Capítulo 23: Enviando email
Introducción
Una técnica útil para los administradores de Exchange Server es poder enviar mensajes de
correo electrónico a través de SMTP desde PowerShell. Dependiendo de la versión de
PowerShell instalada en su computadora o servidor, hay varias formas de enviar correos
electrónicos a través de powershell. Existe una opción de cmdlet nativa que es simple y fácil de
usar. Utiliza el cmdlet Send-MailMessage .
Parámetros
Parámetro Detalles
[Link] 71
Parámetro Detalles
Examples
Mensaje simple de envío de correo
$parameters = @{
From = 'from@[Link]'
To = 'to@[Link]'
Subject = 'Email Subject'
Attachments = @('C:\files\[Link]','C:\files\[Link]')
BCC = 'bcc@[Link]'
Body = 'Email body'
BodyAsHTML = $False
CC = 'cc@[Link]'
Credential = Get-Credential
[Link] 72
DeliveryNotificationOption = 'onSuccess'
Encoding = 'UTF8'
Port = '25'
Priority = 'High'
SmtpServer = '[Link]'
UseSSL = $True
}
function Send_mail {
#Define Email settings
$EmailFrom = "source@[Link]"
$EmailTo = "destination@[Link]"
$Txt_Body = Get-Content $Txt_File -RAW
$Body = $Body_Custom + $Txt_Body
$Subject = "Email Subject"
$SMTPServer = "[Link]"
$SMTPClient = New-Object [Link]($SmtpServer, 25)
$[Link] = $false
$[Link]($EmailFrom, $EmailTo, $Subject, $Body)
Send_mail
[Link] 73
Capítulo 24: Expresiones regulares
Sintaxis
• 'text' -match 'RegExPattern'
• 'text' -replace 'RegExPattern', 'newvalue'
• [regex] :: Match ("text", "pattern") #Single match
• [regex] :: Coincidencias ("texto", "patrón") #Múltiples coincidencias
• [regex] :: Reemplazar ("texto", "patrón", "nuevo valor")
• [regex] :: Replace ("text", "pattern", {param ($ m)}) #MatchEvaluator
• [regex] :: Escape ("input") #Escape caracteres especiales
Examples
Partido individual
Puede determinar rápidamente si un texto incluye un patrón específico utilizando Regex. Hay
varias formas de trabajar con Regex en PowerShell.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
> $Matches
Name Value
---- -----
0 (a)
También puede usar -match para filtrar a través de una matriz de cadenas y solo devolver las
[Link] 74
cadenas que contienen una coincidencia.
2.0
Usando Select-String
PowerShell 2.0 introdujo un nuevo cmdlet para buscar en texto usando expresiones regulares.
Devuelve un objeto MatchInfo por entrada de texto que contiene una coincidencia. Puedes
acceder a sus propiedades para encontrar grupos coincidentes, etc.
> $m
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
Como -match , Select-String también se puede usar para filtrar a través de una matriz de cadenas
al canalizar una matriz a la misma. Crea un objeto MatchInfo por cadena que incluye una
coincidencia.
[Link] 75
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
IgnoreCase : True
LineNumber : 3
Line : a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(sample text)}
Select-String también puede buscar usando un patrón de texto normal (sin -SimpleMatch
regulares) agregando el interruptor -SimpleMatch .
> [regex]::Match($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
Reemplazar
Una tarea común para las expresiones regulares es reemplazar el texto que coincida con un
patrón con un nuevo valor.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
[Link] 76
Usando el operador de reemplazo
El operador -replace en PowerShell se puede usar para reemplazar el texto que coincida con un
patrón con un nuevo valor usando la sintaxis 'input' -replace 'pattern', 'newvalue' .
A veces es necesario reemplazar un valor que coincida con un patrón con un nuevo valor que se
base en esa coincidencia específica, lo que hace imposible predecir el nuevo valor. Para estos
tipos de escenarios, un MatchEvaluator puede ser muy útil.
En PowerShell, un MatchEvaluator es tan simple como un bloque de script con un solo parámetro
que contiene un objeto Match para la coincidencia actual. La salida de la acción será el nuevo
valor para esa coincidencia específica. MatchEvalutor se puede usar con el método estático
[Regex]::Replace() .
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
$MatchEvalutor = {
param($match)
[Link] 77
}
Salida:
This is 1 sample
text, this is
a 11
$MatchEvalutor = {
param($match)
Salida:
Un patrón de expresiones regulares usa muchos caracteres especiales para describir un patrón.
Ej., . significa "cualquier carácter", + es "uno o más", etc.
Para utilizar estos caracteres, como a . , + etc., en un patrón, debes escapar de ellos para
eliminar su significado especial. Esto se hace usando el carácter de escape que es una barra
invertida \ en regex. Ejemplo: Para buscar + , usarías el patrón \+ .
Puede ser difícil recordar todos los caracteres especiales en expresiones regulares, por lo que
para escapar de cada carácter especial en una cadena que desea buscar, puede usar el método
[RegEx]::Escape("input") .
> [regex]::Escape("(foo)")
\(foo\)
> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2
Múltiples partidos
[Link] 78
Hay varias formas de encontrar todas las coincidencias para un patrón en un texto.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
Usando Select-String
Puede encontrar todas las coincidencias (coincidencia global) agregando el interruptor -AllMatches
a Select-String .
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a), (sample text)}
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
[Link] 79
Usando [RegEx] :: Coincidencias ()
El método Matches() en .NET `[regex] -class también se puede usar para hacer una búsqueda
global de múltiples coincidencias.
> [regex]::Matches($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
(a)
(sample text)
[Link] 80
Capítulo 25: Firma de Scripts
Observaciones
Firmar un script hará que sus scripts cumplan con todas las políticas de ejecución en PowerShell
y garantizará la integridad de un script. Los scripts firmados no se ejecutarán si se han modificado
después de firmarlos.
Políticas de ejecución
PowerShell tiene políticas de ejecución configurables que controlan qué condiciones se requieren
para que se ejecute un script o una configuración. Se puede establecer una política de ejecución
para múltiples ámbitos; Computadora, usuario actual y proceso actual. Las políticas de
ejecución se pueden omitir fácilmente y no están diseñadas para restringir a los usuarios,
sino protegerlos de violar las políticas de firma involuntariamente.
Ajuste Descripción
RemoteSigned Todos los scripts locales permitidos; solo scripts remotos firmados
No hay requisitos. Todos los scripts están permitidos, pero avisarán antes
Irrestricto
de ejecutar los scripts descargados de Internet.
[Link] 81
Puede modificar las políticas de ejecución actuales utilizando Set-ExecutionPolicy -cmdlet, Group
Policy o el parámetro -ExecutionPolicy cuando -ExecutionPolicy un proceso [Link] .
Examples
Firmando un guion
#Get the first available personal code-signing certificate for the logged on user
$cert = @(Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert)[0]
El guión será válido hasta que caduque el certificado. Si utiliza un servidor de marca de tiempo
durante la firma, la secuencia de comandos seguirá siendo válida después de que caduque el
certificado. También es útil agregar la cadena de confianza para el certificado (incluida la
autoridad raíz) para ayudar a la mayoría de las computadoras a confiar en el certificado utilizado
para firmar el script.
Set-ExecutionPolicy AllSigned
[Link] 82
A menudo es posible que necesite ejecutar un script sin firmar que no cumpla con la política de
ejecución actual. Una forma fácil de hacer esto es omitir la política de ejecución para ese proceso
único. Ejemplo:
Undefined N/A
Unrestricted
Similar a la bypass
*
Unrestricted* Advertencia: si ejecuta una secuencia de comandos sin firmar que se descargó de
Internet, se le solicitará permiso antes de que se ejecute.
PS> Get-ExecutionPolicy
RemoteSigned
[Link] 83
PS> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
Al firmar scripts personales o al probar la firma de código, puede ser útil crear un certificado de
firma de código autofirmado.
5.0
A partir de PowerShell 5.0, puede generar un certificado de firma de código autofirmado mediante
el certificado de New-SelfSignedCertificate Self:
Solo las computadoras que tengan instalado el certificado confiarán en un certificado autofirmado.
Para los scripts que se compartirán, se recomienda un certificado de una autoridad de certificados
de confianza (interna o de terceros de confianza).
[Link] 84
Capítulo 26: Flujos de trabajo de PowerShell
Introducción
PowerShell Workflow es una característica que se introdujo a partir de la versión 3.0 de
PowerShell. Las definiciones de flujo de trabajo son muy similares a las definiciones de funciones
de PowerShell, sin embargo, se ejecutan dentro del entorno de Windows Workflow Foundation,
en lugar de hacerlo directamente en el motor de PowerShell.
Con el motor de flujo de trabajo se incluyen varias características exclusivas "fuera de la caja",
sobre todo, la persistencia del trabajo.
Observaciones
La función de flujo de trabajo de PowerShell se admite exclusivamente en la plataforma Microsoft
Windows, en PowerShell Desktop Edition. PowerShell Core Edition, que es compatible con Linux,
Mac y Windows, no es compatible con la función de flujo de trabajo de PowerShell.
Al crear un flujo de trabajo de PowerShell, tenga en cuenta que los flujos de trabajo llaman a las
actividades, no a los cmdlets. Aún puede llamar a los cmdlets desde un flujo de trabajo de
PowerShell, pero el motor de flujo de trabajo envolverá implícitamente la invocación del cmdlet en
una actividad de InlineScript . También puede ajustar explícitamente el código dentro de la
actividad InlineScript , que ejecuta el código de PowerShell; de forma predeterminada, la
actividad InlineScript se ejecuta en un proceso independiente y devuelve el resultado al flujo de
trabajo de la llamada.
Examples
Ejemplo de flujo de trabajo simple
workflow DoSomeWork {
Get-Process -Name notepad | Stop-Process
}
Al igual que las funciones de PowerShell, los flujos de trabajo pueden aceptar parámetros de
entrada. Los parámetros de entrada pueden vincularse opcionalmente a un tipo de datos
específico, como una cadena, entero, etc. Use la palabra clave param estándar para definir un
bloque de parámetros de entrada, directamente después de la declaración del flujo de trabajo.
workflow DoSomeWork {
param (
[Link] 85
[string[]] $ComputerName
)
Get-Process -ComputerName $ComputerName
}
Los flujos de trabajo de PowerShell están equipados de forma inherente con la capacidad de
ejecutarse como un trabajo en segundo plano. Para llamar a un flujo de trabajo como un trabajo
en segundo plano de PowerShell, use el parámetro -AsJob cuando invoque el flujo de trabajo.
workflow DoSomeWork {
Get-Process -ComputerName server01
Get-Process -ComputerName server02
Get-Process -ComputerName server03
}
DoSomeWork -AsJob
workflow DoSomeWork {
parallel {
Get-Process -ComputerName server01
Get-Process -ComputerName server02
Get-Process -ComputerName server03
}
}
Llamar en paralelo a las actividades del flujo de trabajo puede ayudar a mejorar el rendimiento de
su flujo de trabajo.
[Link] 86
Capítulo 27: Funciones de PowerShell
Introducción
Una función es básicamente un bloque de código con nombre. Cuando llama al nombre de la
función, se ejecuta el bloque de script dentro de esa función. Es una lista de declaraciones de
PowerShell que tiene un nombre que usted asigna. Cuando ejecuta una función, escribe el
nombre de la función. Es un método para ahorrar tiempo al abordar tareas repetitivas. Los
formatos de PowerShell en tres partes: la palabra clave 'Función', seguida de un Nombre,
finalmente, la carga útil que contiene el bloque de script, que está encerrada entre corchetes de
estilo de paréntesis.
Examples
Función simple sin parámetros
Este es un ejemplo de una función que devuelve una cadena. En el ejemplo, la función se llama
en una declaración asignando un valor a una variable. El valor en este caso es el valor de retorno
de la función.
function Get-Greeting{
"Hello World"
}
# demonstrate output
$greeting
Get-Greeting
Get-Greeting es el nombre de la función. En cualquier momento en que esa función deba utilizarse
en el script, se puede llamar a la función invocándola por su nombre.
Si el código anterior se ejecuta en el ISE, los resultados serían algo así como:
Hello World
Hello World
Parametros basicos
[Link] 87
function Write-Greeting {
param(
[Parameter(Mandatory,Position=0)]
[String]$name,
[Parameter(Mandatory,Position=1)]
[Int]$age
)
"Hello $name, you are $age years old."
}
Nota: los parámetros de conversión no son necesarios en ninguno de los tipos de definición de
parámetros.
La sintaxis de función simple (SFS) tiene capacidades muy limitadas en comparación con el
bloque param.
Aunque puede definir los parámetros que se expondrán dentro de la función, no puede especificar
atributos de parámetros , utilizar la validación de parámetros , incluir [CmdletBinding()] , con SFS
(y esta es una lista no exhaustiva).
Parámetros obligatorios
function Get-Greeting{
param
(
[Parameter(Mandatory=$true)]$name
)
"Hello World $name"
}
[Link] 88
$greeting = Get-Greeting
Función avanzada
Esta es una copia del fragmento de función avanzada del ISE de Powershell. Básicamente, esta
es una plantilla para muchas de las cosas que puede usar con funciones avanzadas en
Powershell. Puntos clave a tener en cuenta:
<#
.Synopsis
Short description
.DESCRIPTION
Long description
.EXAMPLE
Example of how to use this cmdlet
.EXAMPLE
Another example of how to use this cmdlet
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
function Verb-Noun
{
[CmdletBinding(DefaultParameterSetName='Parameter Set 1',
SupportsShouldProcess=$true,
PositionalBinding=$false,
HelpUri = '[Link]
ConfirmImpact='Medium')]
[Alias()]
[OutputType([String])]
Param
(
# Param1 help description
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
[Link] 89
ValueFromRemainingArguments=$false,
Position=0,
ParameterSetName='Parameter Set 1')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[ValidateCount(0,5)]
[ValidateSet("sun", "moon", "earth")]
[Alias("p1")]
$Param1,
Begin
{
}
Process
{
if ($[Link]("Target", "Operation"))
{
}
}
End
{
}
}
Validación de parámetros
En lugar de escribir código dentro de funciones o scripts para validar los valores de los
parámetros, estos atributos de parámetro se lanzarán si se pasan valores no válidos.
ValidateSet
A veces necesitamos restringir los valores posibles que un parámetro puede aceptar. Digamos
que queremos permitir solo rojo, verde y azul para el parámetro $Color en un script o función.
Podemos usar el atributo de parámetro ValidateSet para restringir esto. Tiene la ventaja adicional
de permitir que se complete la pestaña al configurar este argumento (en algunos entornos).
[Link] 90
param(
[ValidateSet('red','green','blue',IgnoreCase)]
[string]$Color
)
Validar Rango
Este método de validación de parámetros toma un valor Int32 mínimo y máximo, y requiere que el
parámetro esté dentro de ese rango.
param(
[ValidateRange(0,120)]
[Int]$Age
)
ValidatePattern
Este método de validación de parámetros acepta parámetros que coinciden con el patrón de
expresiones regulares especificado.
param(
[ValidatePattern("\w{4-6}\d{2}")]
[string]$UserName
)
ValidateLength
Este método de validación de parámetros prueba la longitud de la cadena pasada.
param(
[ValidateLength(0,15)]
[String]$PhoneNumber
)
ValidateCount
Este método de validación de parámetros prueba la cantidad de argumentos pasados, por
ejemplo, una matriz de cadenas.
param(
[ValidateCount(1,5)]
[String[]]$ComputerName
)
ValidateScript
[Link] 91
Finalmente, el método ValidateScript es extraordinariamente flexible, tomando un bloque de script
y evaluándolo usando $ _ para representar el argumento pasado. Luego pasa el argumento si el
resultado es $ verdadero (incluyendo cualquier resultado como válido).
param(
[ValidateScript({Test-Path $_})]
[[Link]]$Path
)
param(
[ValidateScript({Get-ADUser $_})]
[String]$UserName
)
Y casi cualquier otra cosa que puedas escribir (ya que no está restringida a oneliners):
param(
[ValidateScript({
$AnHourAgo = (Get-Date).AddHours(-1)
if ($_ -lt $[Link](5) -and $_ -gt $[Link](-5)) {
$true
} else {
throw "That's not within five minutes. Try again."
}
})]
[String]$TimeAboutAnHourAgo
)
[Link] 92
Capítulo 28: Gestión de paquetes
Introducción
PowerShell Package Management le permite encontrar, instalar, actualizar y desinstalar
PowerShell Modules y otros paquetes.
Examples
Encuentra un módulo PowerShell usando un patrón
Register-PSRepository -Default
[Link] 93
Lea Gestión de paquetes en línea: [Link]
paquetes
[Link] 94
Capítulo 29: GUI en Powershell
Examples
GUI de WPF para cmdlet Get-Service
[xml]$XAMLWindow = '
<Window
xmlns="[Link]
xmlns:x="[Link]
Height="Auto"
SizeToContent="WidthAndHeight"
Title="Get-Service">
<ScrollViewer Padding="10,10,10,0" [Link]="Disabled">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Label Margin="10,10,0,10">ComputerName:</Label>
<TextBox Name="Input" Margin="10" Width="250px"></TextBox>
</StackPanel>
<DockPanel>
<Button Name="ButtonGetService" Content="Get-Service" Margin="10"
Width="150px" IsEnabled="false"/>
<Button Name="ButtonClose" Content="Close" HorizontalAlignment="Right"
Margin="10" Width="50px"/>
</DockPanel>
</StackPanel>
</ScrollViewer >
</Window>
'
[Link] 95
[[Link]]::Show($_.[Link],"Error",[[Link]]::OK,[S
}
})
Esto crea una ventana de diálogo que le permite al usuario seleccionar un nombre de
computadora, luego mostrará una tabla de servicios y sus estados en esa computadora.
Este ejemplo usa WPF en lugar de Windows Forms.
[Link] 96
Capítulo 30: HashTables
Introducción
Una tabla hash es una estructura que asigna claves a valores. Ver tabla de hash para más
detalles.
Observaciones
Un concepto importante que se basa en tablas hash es Splatting . Es muy útil para hacer un gran
número de llamadas con parámetros repetitivos.
Examples
Creación de una tabla hash
$hashTable = @{}
$hashTable = @{
Name1 = 'Value'
Name2 = 'Value'
Name3 = 'Value3'
}
Un ejemplo de cómo definir una tabla hash y acceder a un valor mediante la clave
$hashTable = @{
Key1 = 'Value1'
Key2 = 'Value2'
}
$hashTable.Key1
#output
Value1
Un ejemplo de acceso a una clave con caracteres no válidos para un nombre de propiedad:
$hashTable = @{
'Key 1' = 'Value3'
Key2 = 'Value4'
}
$hashTable.'Key 1'
[Link] 97
#Output
Value3
$hashTable = @{
Key1 = 'Value1'
Key2 = 'Value2'
}
foreach($key in $[Link])
{
$value = $hashTable.$key
Write-Output "$key : $value"
}
#Output
Key1 : Value1
Key2 : Value2
Un ejemplo, para agregar una clave "Clave2" con un valor de "Valor2" a la tabla hash, usando el
operador de suma:
$hashTable = @{
Key1 = 'Value1'
}
$hashTable += @{Key2 = 'Value2'}
$hashTable
#Output
Name Value
---- -----
Key1 Value1
Key2 Value2
Un ejemplo, para agregar una clave "Clave2" con un valor de "Valor2" a la tabla hash usando el
método Agregar:
$hashTable = @{
Key1 = 'Value1'
}
$[Link]("Key2", "Value2")
$hashTable
#Output
Name Value
---- -----
Key1 Value1
Key2 Value2
[Link] 98
Enumerar a través de claves
Un ejemplo, para eliminar una clave "Clave2" con un valor de "Valor2" de la tabla hash, utilizando
el operador eliminar:
$hashTable = @{
Key1 = 'Value1'
Key2 = 'Value2'
}
$[Link]("Key2", "Value2")
$hashTable
#Output
Name Value
---- -----
Key1 Value1
[Link] 99
Capítulo 31: Incrustar código gestionado (C #
| VB)
Introducción
Este tema es para describir brevemente cómo el código administrado de C # o VB .NET puede
ser ejecutado en un script de PowerShell. Este tema no está explorando todas las facetas del
cmdlet Add-Type.
Para obtener más información sobre el cmdlet Add-Type, consulte la documentación de MSDN
(para 5.1) aquí: [Link]
us/powershell/reference/5.1/[Link]/add- tipo
Parámetros
Parámetro Detalles
-TypeDefinition
Acepta el código como una cadena.
<String_>
Observaciones
Si utiliza Powershell 1.0 y / o -Language CSharp, el código administrado utilizará .NET 2.0, que
carece de una serie de características que los desarrolladores de C # normalmente usan sin
pensarlo dos veces, como Genéricos, Linq y Lambda. Además de esto, se encuentra el
polimorfismo formal, que se maneja con parámetros predeterminados en versiones posteriores de
C # / .NET.
[Link] 100
Examples
Ejemplo de C #
Este ejemplo muestra cómo incrustar algunos C # básicos en un script de PowerShell, agregarlo
al espacio de ejecución / sesión y utilizar el código dentro de la sintaxis de PowerShell.
$code = "
using System;
namespace MyNameSpace
{
public class Responder
{
public static void StaticRespond()
{
[Link]("Static Response");
}
# Check the type has not been previously added within the session, otherwise an exception is
raised
if (-not ([[Link]]'[Link]').Type)
{
Add-Type -TypeDefinition $code -Language CSharp;
}
[[Link]]::StaticRespond();
Ejemplo de [Link]
Este ejemplo muestra cómo incrustar algunos C # básicos en un script de PowerShell, agregarlo
al espacio de ejecución / sesión y utilizar el código dentro de la sintaxis de PowerShell.
$code = @"
Imports System
Namespace MyNameSpace
Public Class Responder
Public Shared Sub StaticRespond()
[Link]("Static Response")
End Sub
[Link] 101
End Class
End Namespace
"@
# Check the type has not been previously added within the session, otherwise an exception is
raised
if (-not ([[Link]]'[Link]').Type)
{
Add-Type -TypeDefinition $code -Language VisualBasic;
}
[[Link]]::StaticRespond();
[Link] 102
Capítulo 32: Instrumentos de cuerda
Sintaxis
• "(Cita doble)"
• 'Cuerda literal'
• @"
Aquí cadena
"@
• @'
Literal aquí-cadena
'@
Observaciones
Las cadenas son objetos que representan texto.
Examples
Creando una cadena básica
Cuerda
Las cadenas se crean envolviendo el texto con comillas dobles. Las cadenas entre comillas
dobles pueden evaluar variables y caracteres especiales.
Para usar una comilla doble dentro de una cadena, debe escaparse usando el carácter de
escape, comilla hacia atrás ( ` ). Las comillas simples se pueden utilizar dentro de una cadena
entre comillas dobles.
$myString = "A `"double quoted`" string which also has 'single quotes'."
Cuerda literal
Las cadenas literales son cadenas que no evalúan variables y caracteres especiales. Se crea
utilizando comillas simples.
[Link] 103
$myLiteralString = 'Simple text including special characters (`n) and a $variable-reference'
Para usar comillas simples dentro de una cadena literal, use comillas simples dobles o una
cadena literal aquí. Los qutoes dobles se pueden usar de manera segura dentro de una cadena
literal
Cadena de formato
Cuerda multilínea
• Puede usar los caracteres especiales para el retorno de carro y / o la nueva línea
manualmente o usar la variable NewLine para insertar el valor de "nueva línea" de los
sistemas)
"Hello`r`nWorld"
"Hello{0}World" -f [environment]::NewLine
• Cree un salto de línea mientras define una cadena (antes de cerrar la cita)
"Hello
World"
@"
Hello
World
"@
Aquí cadena
Aquí, las cadenas son muy útiles al crear cadenas multilínea. Uno de los mayores beneficios en
comparación con otras cadenas multilínea es que puede usar comillas sin tener que escapar de
ellas usando un backtick.
[Link] 104
Aquí cadena
Aquí, las cadenas comienzan con @" y un salto de línea y terminan con "@ en su propia línea ( "@
deben ser los primeros caracteres de la línea, ni siquiera los espacios en blanco / tabulador
).
@"
Simple
Multiline string
with "quotes"
"@
Literal aquí-cadena
También puede crear una cadena literal aquí utilizando comillas simples, cuando no desee que
las expresiones se expandan como una cadena literal normal.
@'
The following line won't be expanded
$(Get-Date)
because this is a literal here-string
'@
Cuerdas de concatenacion
$string1 = "Power"
$string2 = "Shell"
"Greetings from $string1$string2"
Usando el operador +
[Link] 105
"The title of this console is '" + $[Link] + "'"
Usando subexpresiones
La salida / resultado de una subexpresión $() se puede utilizar en una cadena. Esto es útil al
acceder a propiedades de un objeto o al realizar una expresión compleja. Las subexpresiones
pueden contener varias declaraciones separadas por punto ; coma ;
"Tomorrow is $((Get-Date).AddDays(1).DayOfWeek)"
Caracteres especiales
Cuando se utiliza dentro de una cadena de comillas dobles, el carácter de escape (backtick ` )
representa un carácter especial.
`0 #Null
`a #Alert/Beep
`b #Backspace
`f #Form feed (used for printer output)
`n #New line
`r #Carriage return
`t #Horizontal tab
`v #Vertical tab (used for printer output)
Ejemplo:
`# #Comment-operator
`$ #Variable operator
`` #Escape character
`' #Single quote
`" #Double quote
[Link] 106
Capítulo 33: Introducción a Pester
Observaciones
Pester es un marco de prueba para PowerShell que le permite ejecutar casos de prueba para su
código de PowerShell. Se puede utilizar para ejecutar ex. Pruebas unitarias para ayudarlo a
verificar que sus módulos, scripts, etc. funcionen según lo previsto.
Examples
Empezando con Pester
Para comenzar con las pruebas unitarias del código de PowerShell usando el módulo Pester,
debe estar familiarizado con tres palabras clave / comandos:
• Describa : define un grupo de pruebas. Todos los archivos de prueba de Pester necesitan
al menos un bloque Describe.
• Es : Define una prueba individual. Puedes tener múltiples It-blocks dentro de un Descripe-
block.
• Debe : El comando de verificación / prueba. Se utiliza para definir el resultado que debe
considerarse una prueba exitosa.
Muestra:
Import-Module Pester
#Group of tests
Describe "Validate Add-Numbers" {
[Link] 107
Salida:
[Link] 108
Capítulo 34: Introducción a Psake
Sintaxis
• Tarea - función principal para ejecutar un paso de su script de compilación
• Depends - propiedad que especifica de qué depende el paso actual
• predeterminado: siempre debe haber una tarea predeterminada que se ejecutará si no se
especifica una tarea inicial
• FormatTaskName: especifica cómo se muestra cada paso en la ventana de resultados.
Observaciones
psake es una herramienta de automatización de compilación escrita en PowerShell, y está
inspirada en Rake (Ruby make) y Bake (Boo make). Se utiliza para crear compilaciones utilizando
el patrón de dependencia. Documentación disponible aquí.
Examples
Esquema básico
Task Build {
"Build"
}
Task Clean {
"Clean"
}
Ejemplo de FormatTaskName
[Link] 109
"Rebuild"
}
Task Build {
"Build"
}
Task Clean {
"Clean"
}
propreties {
$isOk = $false
}
# By default the Build task won't run, unless there is a param $true
Task Build -precondition { return $isOk } {
"Build"
}
Task Clean {
"Clean"
}
ContinueOnError
[Link] 110
Capítulo 35: Línea de comandos de
[Link]
Parámetros
Parámetro Descripción
-EncodedCommand
Comandos codificados en base64
<Base64EncodedCommand>
[Link] 111
Parámetro Descripción
Examples
Ejecutando un comando
El parámetro -Command se usa para especificar los comandos que se ejecutarán en el inicio. Es
compatible con múltiples entradas de datos.
-Comando <cadena>
Puede especificar comandos para ejecutar en el lanzamiento como una cadena. Punto ; coma
múltiple -Se pueden ejecutar declaraciones separadas.
-Comando {scriptblock}
El parámetro -Command también admite una entrada de scriptblock (una o varias declaraciones
envueltas entre llaves { #code } . Esto solo funciona cuando se llama a [Link] desde otra
sesión de Windows PowerShell.
[Link] 112
-Comando - (entrada estándar)
Puede pasar comandos desde la entrada estándar usando -Command - . La entrada estándar
puede provenir de echo , leer un archivo, una aplicación de consola heredada, etc.
Puede especificar un archivo en un ps1 para ejecutar su contenido al ps1 utilizando el parámetro -
File .
Guion basico
MyScript.ps1
(Get-Date).ToShortDateString()
"Hello World"
Salida:
MyScript.ps1
param($Name)
Salida:
[Link] 113
Lea Línea de comandos de [Link] en línea:
[Link]
[Link] 114
Capítulo 36: Lógica condicional
Sintaxis
• si (expresión) {}
• if (expresión) {} else {}
• if (expresión) {} elseif (expresión) {}
• if (expresión) {} elseif (expresión) {} else {}
Observaciones
Consulte también Operadores de comparación , que se pueden usar en expresiones
condicionales.
Examples
si, si no y si
Powershell es compatible con operadores lógicos condicionales estándar, al igual que muchos
lenguajes de programación. Estos permiten que ciertas funciones o comandos se ejecuten en
circunstancias particulares.
Con un if los comandos dentro de los corchetes ( {} ) solo se ejecutan si se cumplen las
condiciones dentro de if ( () )
$test = "test"
if ($test -eq "test"){
Write-Host "if condition met"
}
También puedes hacer otra else . Aquí se ejecutan los comandos else if no se cumplen las
condiciones if :
$test = "test"
if ($test -eq "test2"){
Write-Host "if condition met"
}
else{
Write-Host "if condition not met"
}
$test = "test"
if ($test -eq "test2"){
Write-Host "if condition met"
[Link] 115
}
elseif ($test -eq "test"){
Write-Host "ifelse condition met"
}
Tenga en cuenta el uso anterior -eq (igualdad) CmdLet y no = o == como muchos otros idiomas
hacen para equlaity.
Negación
Es posible que desee negar un valor booleano, es decir, ingrese una sentencia if cuando una
condición sea falsa en lugar de verdadera. Esto se puede hacer mediante el uso de la -Not cmdlet
$test = "test"
if (-Not $test -eq "test2"){
Write-Host "if condition not met"
}
$test = "test"
if (!($test -eq "test2")){
Write-Host "if condition not met"
}
$test = "test"
if ($test -ne "test2"){
Write-Host "variable test is not equal to 'test2'"
}
Si la taquigrafía condicional
Si desea utilizar la taquigrafía, puede utilizar la lógica condicional con la siguiente taquigrafía.
Solo la cadena 'false' se evaluará como verdadera (2.0).
If($boolean){
# this does not run because $boolean is false
Write-Host "Shorthand If conditions can be nice, just make sure they are always boolean."
}
If($string){
# This does run because the string is non-zero length
Write-Host "If the variable is not strictly null or Boolean false, it will evaluate to
true as it is an object or string with length greater than 0."
}
[Link] 116
If($emptyString){
# This does not run because the string is zero-length
Write-Host "Checking empty strings can be useful as well."
}
If($null){
# This does not run because the condition is null
Write-Host "Checking Nulls will not print this statement."
}
[Link] 117
Capítulo 37: Los operadores
Introducción
Un operador es un personaje que representa una acción. Le indica al compilador / intérprete que
realice operaciones matemáticas, relacionales o lógicas específicas y produzca un resultado final.
PowerShell interpreta de una manera específica y clasifica en consecuencia, como los
operadores aritméticos realizan operaciones principalmente en números, pero también afectan a
cadenas y otros tipos de datos. Junto con los operadores básicos, PowerShell tiene una serie de
operadores que ahorran tiempo y esfuerzo de codificación (por ejemplo: -like, -match, -replace,
etc.).
Examples
Operadores aritméticos
1 + 2 # Addition
1 - 2 # Subtraction
-1 # Set negative value
1 * 2 # Multiplication
1 / 2 # Division
1 % 2 # Modulus
100 -shl 2 # Bitwise Shift-left
100 -shr 1 # Bitwise Shift-right
Operadores logicos
Operadores de Asignación
Aritmética simple:
Incremento y decremento:
[Link] 118
$var++ # Increases the value of a variable, assignable property, or array element by 1
$var-- # Decreases the value of a variable, assignable property, or array element by 1
Operadores de comparación
Los nombres pueden ir precedidos por caracteres especiales para modificar el comportamiento
del operador:
Case-insensitive es el valor predeterminado si no se especifica, ("a" -eq "A") igual que ("a" -ieq
"A").
"abc", "def" -contains "def" # Returns true when the value (right) is present
# in the array (left)
"abc", "def" -notcontains "123" # Returns true when the value (right) is not present
# in the array (left)
"def" -in "abc", "def" # Returns true when the value (left) is present
# in the array (right)
"123" -notin "abc", "def" # Returns true when the value (left) is not present
# in the array (right)
Operadores de redireccionamiento
cmdlet > file # Send success output to file, overwriting existing content
cmdlet >> file # Send success output to file, appending to existing content
cmdlet 1>&2 # Send success and error output to error stream
[Link] 119
Corriente de salida de error:
cmdlet 2> file # Send error output to file, overwriting existing content
cmdlet 2>> file # Send error output to file, appending to existing content
cmdlet 2>&1 # Send success and error output to success output stream
cmdlet 3> file # Send warning output to file, overwriting existing content
cmdlet 3>> file # Send warning output to file, appending to existing content
cmdlet 3>&1 # Send success and warning output to success output stream
cmdlet 4> file # Send verbose output to file, overwriting existing content
cmdlet 4>> file # Send verbose output to file, appending to existing content
cmdlet 4>&1 # Send success and verbose output to success output stream
cmdlet 5> file # Send debug output to file, overwriting existing content
cmdlet 5>> file # Send debug output to file, appending to existing content
cmdlet 5>&1 # Send success and debug output to success output stream
cmdlet 6> file # Send information output to file, overwriting existing content
cmdlet 6>> file # Send information output to file, appending to existing content
cmdlet 6>&1 # Send success and information output to success output stream
cmdlet *> file # Send all output streams to file, overwriting existing content
cmdlet *>> file # Send all output streams to file, appending to existing content
cmdlet *>&1 # Send all output streams to success output stream
Los operadores de redireccionamiento solo redirigen flujos a archivos o flujos a flujos. El operador
de tuberías bombea un objeto por la tubería hasta un cmdlet o la salida. La forma en que funciona
la canalización difiere en general de cómo funciona la redirección y se puede leer en Cómo
trabajar con la tubería de PowerShell
Para la adición
[Link] 120
1,2,3 + "Hello" # Gives 1,2,3,"Hello"
"Hello" + 1,2,3 # Gives "Hello1 2 3"
Para la multiplicación
Reemplazar operador:
El operador -replace reemplaza un patrón en un valor de entrada usando una expresión regular.
Este operador utiliza dos argumentos (separados por una coma): un patrón de expresión regular y
su valor de reemplazo (que es opcional y una cadena vacía de forma predeterminada).
"A B C" -split " " #Returns an array string collection object containing A,B and C.
[Link] 121
Capítulo 38: Manejo de errores
Introducción
Este tema trata sobre los tipos de error y el manejo de errores en PowerShell.
Examples
Tipos de error
Un error es un error, uno podría preguntarse cómo podría haber tipos en él. Bueno, con
powershell el error se divide en dos criterios,
• Error de terminación
• Error de no terminación
Como su nombre lo indica, los errores de terminación terminarán la ejecución y los errores de no
terminación permiten que la ejecución continúe con la siguiente declaración.
Error de terminación
Un error de terminación se puede manejar con una captura de prueba típica, como se muestra a
continuación
Try
{
Write-Host "Attempting Divide By Zero"
1/0
}
Catch
{
Write-Host "A Terminating Error: Divide by Zero Caught!"
}
El fragmento de código anterior se ejecutará y el error se detectará a través del bloque catch.
Error de no terminación
Try
{
Stop-Process -Id 123456
[Link] 122
}
Catch
{
Write-Host "Non-Terminating Error: Invalid Process ID"
}
Si ejecuta lo anterior, no obtendrá la salida del bloque catch, ya que el error no se considera
crítico y la ejecución simplemente continuará a partir del siguiente comando. Sin embargo, el error
se mostrará en la consola. Para manejar un error de no terminación, simplemente tiene que
cambiar la preferencia de error.
Try
{
Stop-Process -Id 123456 -ErrorAction Stop
}
Catch
{
"Non-Terminating Error: Invalid Process ID"
}
Ahora, con la preferencia Error actualizada, este error se considerará un error de terminación y se
detectará en el bloque catch.
El cmdlet Write-Error simplemente escribe el error en el programa host que invoca. No detiene la
ejecución. Donde como lanzar te dará un error de terminación y detendrá la ejecución.
[Link] 123
Capítulo 39: Manejo de secretos y
credenciales
Introducción
En Powershell, para evitar almacenar la contraseña en texto claro , utilizamos diferentes métodos
de cifrado y la almacenamos como una cadena segura. Cuando no esté especificando una clave
o una clave segura, esto solo funcionará para el mismo usuario que en la misma computadora
podrá descifrar la cadena cifrada si no está usando Claves / Claves de seguridad. Cualquier
proceso que se ejecute bajo esa misma cuenta de usuario podrá descifrar esa cadena cifrada en
esa misma máquina.
Examples
Solicitando Credenciales
$credential = Get-Credential
$credential = Get-Credential -Message 'Please enter your company email address and password.'
$credential = Get-Credential
$plainPass = $[Link]().Password
$bstr = [[Link]]::SecureStringToBSTR($secStr)
$plainPass = [[Link]]::PtrToStringAuto($bstr)
[Link] 124
Para almacenar y recuperar credenciales cifradas fácilmente, use la serialización XML
incorporada de PowerShell (Clixml):
$credential = Get-Credential
Como resultado, la credencial cifrada no puede ser importada por un usuario diferente ni
por el mismo usuario en una computadora diferente.
Al poner el nombre del usuario y la computadora en el nombre del archivo, puede almacenar
todos los secretos encriptados de una manera que permita que el mismo código los use sin
codificar nada:
Encriptador
# run as each user, and on each computer
$credential = Get-Credential
La versión correcta del archivo para el usuario en ejecución se cargará automáticamente (o fallará
porque el archivo no existe).
[Link] 125
$username = "user1@[Link]"
$pwdTxt = Get-Content "C:\temp\Stored_Password.txt"
$securePwd = $pwdTxt | ConvertTo-SecureString
$credObject = New-Object [Link] -ArgumentList $username,
$securePwd
# Now, $credObject is having the credentials stored and you can pass it wherever you want.
$username = "user1@[Link]"
$AESKey = Get-Content $AESKeyFilePath
$pwdTxt = Get-Content $SecurePwdFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString -Key $AESKey
$credObject = New-Object [Link] -ArgumentList $username,
$securePwd
# Now, $credObject is having the credentials stored with AES Key and you can pass it wherever
you want.
[Link] 126
Capítulo 40: Módulo ActiveDirectory
Introducción
Este tema le presentará algunos de los cmdlets básicos utilizados en el Módulo de Active
Directory para PowerShell, para manipular usuarios, grupos, computadoras y objetos.
Observaciones
Recuerde que el sistema de ayuda de PowerShell es uno de los mejores recursos que puede
utilizar.
Examples
Módulo
Usuarios
Nuevo usuario de AD
New-ADUser -Name "MarySmith" -GivenName "Mary" -Surname "Smith" -DisplayName "MarySmith" -Path
"CN=Users,DC=Domain,DC=Local"
[Link] 127
Los grupos
Get-ADGroup -Identity "My-First-Group" #Ensure if group name has space quotes are used
Ordenadores
Recuperar AD Computer
Objetos
[Link] 128
Move-ADObject -Identity "CN=JohnSmith,OU=Users,DC=Domain,DC=Local" -TargetPath
"OU=SuperUser,DC=Domain,DC=Local"
[Link] 129
Capítulo 41: Módulo de archivo
Introducción
El módulo de archivo [Link] proporciona funciones para almacenar archivos
en archivos ZIP ( Compress-Archive ) y extraerlos ( Expand-Archive ). Este módulo está disponible en
PowerShell 5.0 y superior.
Sintaxis
• Expandir-Archivo / Comprimir-Archivo
• -Camino
la ruta del archivo (s) a comprimir (Compress-Archive) o la ruta del archivo para
○
• -DestinationPath (opcional)
Si no proporciona esta ruta, el archivo se creará en el directorio de trabajo actual
○
Parámetros
Parámetro Detalles
Y si Simular el comando
[Link] 130
Observaciones
Ver MSDN [Link] (5.1) para referencia adicional
Examples
Compress-Archive con comodines
Este comando:
• esto agregará o reemplazará todos los archivos [Link] con los nuevos de
C:\Documents
[Link] 131
Capítulo 42: Módulo de SharePoint
Examples
Cargando complemento de SharePoint
Add-PSSnapin "[Link]"
Para obtener una lista de todos los Cmdlets de SharePoint disponibles, ejecute lo siguiente:
Get-SPFeature también se puede ejecutar en el ámbito web ( -Web <WebUrl> ), ámbito agrícola ( -
Farm ) y ámbito de aplicación web ( -WebApplication <WebAppUrl> ).
[Link] 132
Obtenga todas las características huérfanas en una colección de sitios
Otro uso de Get-SPFeature puede ser encontrar todas las características que no tienen alcance:
[Link] 133
Capítulo 43: Módulo de tareas programadas
Introducción
Ejemplos de cómo usar el módulo Tareas programadas disponible en Windows 8 / Server 2012 y
en.
Examples
Ejecutar PowerShell Script en tareas programadas
Crea una tarea programada que se ejecuta de inmediato, luego en el inicio para ejecutar
C:\myscript.ps1 como SYSTEM
[Link] 134
Capítulo 44: Módulo ISE
Introducción
Windows PowerShell Integrated Scripting Environment (ISE) es una aplicación host que le permite
escribir, ejecutar y probar scripts y módulos en un entorno gráfico e intuitivo. Las características
clave de Windows PowerShell ISE incluyen colores de sintaxis, finalización de pestañas,
Intellisense, depuración visual, conformidad con Unicode y ayuda sensible al contexto, y
proporcionan una rica experiencia de scripting.
Examples
Scripts de prueba
El uso simple y poderoso del ISE es, por ejemplo, escribir código en la sección superior (con color
de sintaxis intuitiva) y ejecutar el código simplemente marcándolo y presionando la tecla F8.
function Get-Sum
{
foreach ($i in $Input)
{$Sum += $i}
$Sum
1..10 | Get-Sum
#output
55
[Link] 135
Capítulo 45: Módulos Powershell
Introducción
A partir de la versión 2.0 de PowerShell, los desarrolladores pueden crear módulos de
PowerShell. Los módulos de PowerShell encapsulan un conjunto de funcionalidades comunes.
Por ejemplo, hay módulos PowerShell específicos del proveedor que administran varios servicios
en la nube. También hay módulos genéricos de PowerShell que interactúan con los servicios de
redes sociales y realizan tareas de programación comunes, como la codificación Base64, el
trabajo con Named Pipes, y más.
Los módulos pueden exponer alias de comandos, funciones, variables, clases y más.
Examples
Crear un módulo de manifiesto
@{
RootModule = 'MyCoolModule.psm1'
ModuleVersion = '1.0'
CompatiblePSEditions = @('Core')
GUID = '6b42c995-67da-4139-be79-597a328056cc'
Author = 'Bob Schmob'
CompanyName = 'My Company'
Copyright = '(c) 2017 Administrator. All rights reserved.'
Description = 'It does cool stuff.'
FunctionsToExport = @()
CmdletsToExport = @()
VariablesToExport = @()
AliasesToExport = @()
DscResourcesToExport = @()
}
Todo buen módulo de PowerShell tiene un módulo manifiesto. El manifiesto del módulo
simplemente contiene metadatos sobre un módulo de PowerShell, y no define el contenido real
del módulo.
El ejemplo anterior proporciona una lista de las claves básicas de HashTable que conforman un
módulo manifiesto, pero hay muchos otros. El comando New-ModuleManifest ayuda a crear un
nuevo esqueleto de manifiesto de módulo.
[Link] 136
function Add {
[CmdletBinding()]
param (
[int] $x
, [int] $y
)
return $x + $y
}
Este es un ejemplo simple de cómo podría verse un archivo de módulo de script de PowerShell.
Este archivo se llamaría MyCoolModule.psm1 y se hace referencia desde el archivo de manifiesto del
módulo (.psd1). Notará que el comando Export-ModuleMember nos permite especificar qué funciones
en el módulo queremos "exportar" o exponer al usuario del módulo. Algunas funciones serán solo
internas, y no deberían estar expuestas, por lo que se omitirán de la llamada a Export-
ModuleMember .
$FirstName = 'Bob'
Export-ModuleMember -Variable FirstName
Para exportar una variable desde un módulo, use el comando Export-ModuleMember , con el
parámetro -Variable . Sin embargo, recuerde que si la variable tampoco se exporta explícitamente
en el archivo de manifiesto del módulo (.psd1), entonces la variable no será visible para el
consumidor del módulo. Piense en el módulo manifest como un "portero". Si una función o
variable no está permitida en el manifiesto del módulo, no será visible para el consumidor del
módulo.
Nota: Exportar una variable es similar a hacer público un campo en una clase. No es aconsejable.
Sería mejor exponer una función para obtener el campo y una función para establecer el campo.
En lugar de definir todas sus funciones en un solo archivo de módulo de script PowerShell .psm1 ,
es posible que desee dividir su función en archivos individuales. A continuación, puede crear
puntos de estos archivos desde su archivo de módulo de script, que en esencia los trata como si
fueran parte del archivo .psm1 .
\MyCoolModule
\Functions
Function1.ps1
Function2.ps1
Function3.ps1
MyCoolModule.psd1
MyCoolModule.psm1
[Link] 137
Dentro de su archivo MyCoolModule.psm1 , puede insertar el siguiente código:
Un módulo llamado foo , en una carpeta llamada foo se encontrará con Import-Module foo
Por defecto, solo las funciones definidas en un módulo son visibles fuera del módulo. En otras
palabras, si define variables y alias en un módulo, no estarán disponibles excepto en el código del
módulo.
Para anular este comportamiento, puede usar el cmdlet Export-ModuleMember . Tiene parámetros
denominados -Function , -Variable y -Alias que le permiten especificar exactamente qué
miembros se exportan.
Es importante tener en cuenta que si utiliza Export-ModuleMember , solo estarán visibles los
elementos que especifique.
[Link] 138
Capítulo 46: Módulos, Scripts y Funciones.
Introducción
Los módulos de PowerShell brindan extensibilidad al administrador de sistemas, al DBA y al
desarrollador. Ya sea simplemente como un método para compartir funciones y scripts.
Las funciones de Powershell son para evitar códigos repetitivos. Consulte [Funciones PS] [1] [1]:
Funciones de PowerShell
Los scripts de PowerShell se utilizan para automatizar tareas administrativas que consisten en un
shell de línea de comandos y cmdlets asociados construidos sobre .NET Framework.
Examples
Función
Una función es un bloque de código con nombre que se utiliza para definir un código reutilizable
que debería ser fácil de usar. Normalmente se incluye dentro de un script para ayudar a reutilizar
el código (para evitar el código duplicado) o se distribuye como parte de un módulo para que sea
útil para otros en múltiples scripts.
Las funciones se crean utilizando la palabra clave de function , seguida de un nombre de una sola
palabra y un bloque de script que contiene el código que se ejecutará cuando se llame el nombre
de la función.
function NameOfFunction {
Your code
}
Manifestación
function HelloWorld {
Write-Host "Greetings from PowerShell!"
}
Uso:
[Link] 139
> HelloWorld
Greetings from PowerShell!
Guión
Una secuencia de comandos es un archivo de texto con la extensión de archivo .ps1 que contiene
los comandos de PowerShell que se ejecutarán cuando se llame la secuencia de comandos.
Debido a que los scripts son archivos guardados, son fáciles de transferir entre computadoras.
Manifestación
MyFirstScript.ps1:
Uso:
> .\MyFirstScript.ps1
Hello World!
4
Un script también puede importar módulos, definir sus propias funciones, etc.
MySecondScript.ps1:
function HelloWorld {
Write-Host "Greetings from PowerShell!"
}
HelloWorld
Write-Host "Let's get started!"
2+2
HelloWorld
Uso:
> .\MySecondScript.ps1
Greetings from PowerShell!
[Link] 140
Let's get started!
4
Greetings from PowerShell!
Módulo
• Uno o más archivos de código con la extensión de archivo .psm1 que contiene funciones o
ensamblajes binarios ( .dll ) que contienen cmdlets
• Un módulo manifest .psd1 describe el nombre, la versión, el autor, la descripción de los
módulos, las funciones / cmdlets que proporciona, etc.
• Otros requisitos para que funcione incl. dependencias, scripts etc.
Ejemplos de módulos:
Para facilitar a PowerShell encontrar e importar un módulo, a menudo se coloca en una de las
ubicaciones de módulos de PowerShell conocidas definidas en $env:PSModulePath .
Manifestación
Enumere los módulos que están instalados en una de las ubicaciones de módulos conocidas:
Get-Module -ListAvailable
Import-Module Hyper-V
Funciones avanzadas
Las funciones avanzadas se comportan de la misma manera que los cmdlets. El ISE de
[Link] 141
PowerShell incluye dos esqueletos de funciones avanzadas. Acceda a ellos a través del menú,
editar, fragmentos de código o con Ctrl + J. (A partir de PS 3.0, las versiones posteriores pueden
diferir)
Versión simple:
<#
.Synopsis
Short description
.DESCRIPTION
Long description
.EXAMPLE
Example of how to use this cmdlet
.EXAMPLE
Another example of how to use this cmdlet
#>
function Verb-Noun
{
[CmdletBinding()]
[OutputType([int])]
Param
(
# Param1 help description
[Parameter(Mandatory=$true,
ValueFromPipelineByPropertyName=$true,
Position=0)]
$Param1,
Begin
{
}
Process
{
}
End
{
}
}
Versión completa:
<#
.Synopsis
Short description
.DESCRIPTION
Long description
[Link] 142
.EXAMPLE
Example of how to use this cmdlet
.EXAMPLE
Another example of how to use this cmdlet
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
function Verb-Noun
{
[CmdletBinding(DefaultParameterSetName='Parameter Set 1',
SupportsShouldProcess=$true,
PositionalBinding=$false,
HelpUri = '[Link]
ConfirmImpact='Medium')]
[OutputType([String])]
Param
(
# Param1 help description
[Parameter(Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true,
ValueFromRemainingArguments=$false,
Position=0,
ParameterSetName='Parameter Set 1')]
[ValidateNotNull()]
[ValidateNotNullOrEmpty()]
[ValidateCount(0,5)]
[ValidateSet("sun", "moon", "earth")]
[Alias("p1")]
$Param1,
Begin
{
[Link] 143
}
Process
{
if ($[Link]("Target", "Operation"))
{
}
}
End
{
}
}
[Link] 144
Capítulo 47: MongoDB
Observaciones
La parte más difícil es adjuntar un subdocumento al documento que aún no se ha creado. Si
necesitamos que el subdocumento tenga el aspecto esperado, deberemos iterar con un bucle for
de la matriz en una variable y usar $[Link]("Key", "Value") lugar de usar la matriz actual de
foreach con índice. Esto hará que el subdocumento en dos líneas, como se puede ver en las
"Tags" = [[Link]] $doc2 .
Examples
MongoDB con controlador C # 1.7 utilizando PowerShell
$MachinesList # Array
$ResourceList # Array
$MachineTags # Array
pseudo code
[Link] 145
$mongoDriverPath = 'C:\Program Files (x86)\MongoDB\CSharpDriver 1.7';
Add-Type -Path "$($mongoDriverPath)\[Link]";
Add-Type -Path "$($mongoDriverPath)\[Link]";
$db = [[Link]]::Create('mongodb://[Link]:2701/RGrpMachines');
[[Link]]$TagList = $[Link]
$A1 = $[Link]
$A2 = $[Link]
foreach ($Machine in $MachinesList)
{
foreach($Resource in $ResourceList)
{
$doc2 = $null
[[Link]] $doc2 = @{}; #Create a Document here
for($i = 0; $i -lt $[Link]; $i++)
{
$A1Key = $A1[$i].ToString()
$A2Value = $A2[$i].toString()
$[Link]("$A1Key", "$A2Value")
}
[[Link]] $doc = @{
"_id"= [[Link]]::GenerateNewId();
"ProcessTime"= [[Link]] $ProcessTime;
"LocalTime" = "$LocalTime";
"Tags" = [[Link]] $doc2;
"ResourceGrp" = "$RGName";
"HostName"= "$VMName";
"Status"= "$VMStatus";
"IPAddress"= "$IPAddress";
"ResourceGroupName"= "$RGName";
"SubscriptionName"= "$CurSubName";
"SubscriptionID"= "$subid";
"OS"= "$OSType";
}; #doc loop close
$[Link]($doc);
}
}
[Link] 146
Capítulo 48: Operadores Especiales
Examples
Operador de Expresión de Array
@(Get-ChildItem $env:windir\System32\[Link])
@(Get-ChildItem $env:windir\System32)
Devolverá una matriz con todos los elementos en la carpeta (que no es un cambio de
comportamiento de la expresión interna.
Operación de llamada
$command = 'Get-ChildItem'
& $Command
Ejecutará Get-ChildItem
. . \ myScript.ps1
ejecuta .\myScript.ps1 en el ámbito actual haciendo que todas las funciones y variables estén
disponibles en el ámbito actual.
[Link] 147
Capítulo 49: Parámetros comunes
Observaciones
Los parámetros comunes se pueden usar con cualquier cmdlet (eso significa que tan pronto como
marque su función como cmdlet [vea CmdletBinding() ], obtendrá todos estos parámetros de forma
gratuita).
Aquí está la lista de todos los parámetros comunes (el alias está entre paréntesis después del
parámetro correspondiente):
-Debug (db)
-ErrorAction (ea)
-ErrorVariable (ev)
-InformationAction (ia) # introduced in v5
-InformationVariable (iv) # introduced in v5
-OutVariable (ov)
-OutBuffer (ob)
-PipelineVariable (pv)
-Verbose (vb)
-WarningAction (wa)
-WarningVariable (wv)
-WhatIf (wi)
-Confirm (cf)
Examples
Parámetro ErrorAction
Los valores posibles son Continue | Ignore | Inquire | SilentlyContinue | Stop | Suspend
El valor de este parámetro determinará cómo el cmdlet manejará los errores de no terminación
(los generados por Write-Error, por ejemplo; para obtener más información sobre el manejo de
errores, vea [ tema aún no creado ]).
-ErrorAction Continuar
Esta opción producirá un mensaje de error y continuará con la ejecución.
[Link] 148
-ErrorAction Ignore
Esta opción no producirá ningún mensaje de error y continuará con la ejecución. Tampoco se
añadirán $Error la variable automática $Error .
Esta opción fue introducida en v3.
-ErrorAction Consultar
Esta opción producirá un mensaje de error y le pedirá al usuario que elija una acción para
realizar.
-ErrorAction SilentlyContinue
Esta opción no producirá un mensaje de error y continuará con la ejecución. Todos los errores
serán agregados a la variable automática $Error .
-ErrorAction Stop
Esta opción producirá un mensaje de error y no continuará con la ejecución.
[Link] 149
PS C:\> Write-Error "test" -ErrorAction Stop ; Write-Host "Second command"
-ErrorAction Suspend
Solo disponible en flujos de trabajo Powershell. Cuando se usa, si el comando se ejecuta en un
error, el flujo de trabajo se suspende. Esto permite la investigación de dicho error y ofrece la
posibilidad de reanudar el flujo de trabajo. Para obtener más información sobre el sistema de flujo
de trabajo, consulte [tema aún no creado].
[Link] 150
Capítulo 50: Parámetros dinámicos de
PowerShell
Examples
Parámetro dinámico "simple"
function MyTestFunction
{
[CmdletBinding(DefaultParameterSetName='DefaultConfiguration')]
Param
(
[Parameter(Mandatory=$true)][int]$SomeUsefulNumber
)
DynamicParam
{
$paramDictionary = New-Object -Type
[Link]
$attributes = New-Object [Link]
$[Link] = "__AllParameterSets"
$[Link] = $true
$attributeCollection = New-Object -Type
[Link][[Link]]
$[Link]($attributes)
# If "SomeUsefulNumber" is greater than 5, then add the "MandatoryParam1" parameter
if($SomeUsefulNumber -gt 5)
{
# Create a mandatory string parameter called "MandatoryParam1"
$dynParam1 = New-Object -Type
[Link]("MandatoryParam1", [String],
$attributeCollection)
# Add the new parameter to the dictionary
$[Link]("MandatoryParam1", $dynParam1)
}
return $paramDictionary
}
process
{
Write-Host "SomeUsefulNumber = $SomeUsefulNumber"
# Notice that dynamic parameters need a specific syntax
Write-Host ("MandatoryParam1 = {0}" -f $PSBoundParameters.MandatoryParam1)
}
Uso:
[Link] 151
MandatoryParam1 =
[Link] 152
Capítulo 51: Perfiles de Powershell
Observaciones
El archivo de perfil es un script de powershell que se ejecutará mientras se inicia la consola
powershell. De esta manera, podemos tener nuestro entorno preparado para nosotros cada vez
que iniciemos una nueva sesión de powershell.
Hay varios archivos de perfil y ubicaciones que tienen diferentes usos y también una jerarquía de
orden de inicio:
Orden
Anfitrión Usuario Camino de Variable
inicio
% WINDIR% \ System32 \
Todos Todos WindowsPowerShell \ v1.0 \ 1 $ [Link]
profile.ps1
% USERPROFILE% \ Documents \
Todos Corriente 3 $ [Link]
WindowsPowerShell \ profile.ps1
% WINDIR% \ System32 \
Consola Todos WindowsPowerShell \ v1.0 \ 2 $ [Link]
Microsoft.PowerShell_profile.ps1
% USERPROFILE% \ Documents \
$
Consola Corriente WindowsPowerShell \ 4
[Link]
Microsoft.PowerShell_profile.ps1
% WINDIR% \ System32 \
ISE Todos WindowsPowerShell \ v1.0 \ 2 $ [Link]
Microsoft.PowerShellISE_profile.ps1
% USERPROFILE% \ Documents \
$
ISE Corriente WindowsPowerShell \ 4
[Link]
Microsoft.PowerShellISE_profile.ps1
[Link] 153
Examples
Crear un perfil básico.
Un perfil de PowerShell se utiliza para cargar las funciones y variables definidas por el usuario
automáticamente.
Una manera fácil de comenzar con su perfil personal para el host actual es guardar algo de texto
en la ruta almacenada en la variable $profile
La variable $profile -variable devuelve el perfil de usuario actual para el host actual de manera
predeterminada, pero puede acceder a la ruta a la política de la máquina (todos los usuarios) y / o
al perfil para todos los hosts (consola, ISE, terceros) utilizando es propiedades
AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost :
C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\user\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost :
C:\Users\user\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length : 75
PS> $[Link]
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
[Link] 154
Capítulo 52: PowerShell "Streams";
Depuración, detallado, advertencia, error,
salida e información
Observaciones
[Link]
Examples
Escritura-salida
Write-Output genera salida. Esta salida puede ir al siguiente comando después de la canalización
o a la consola, por lo que simplemente se muestra.
El cmdlet envía objetos a la tubería principal, también conocida como "flujo de salida" o
"canalización exitosa". Para enviar objetos de error por la tubería de error, use Write-Error.
# 2.) Output to the console since Write-Output is the last command in the pipeline
Write-Output 'Hello world'
# 3.) 'Write-Output' CmdLet missing, but the output is still considered to be 'Write-Output'
'Hello world'
Preferencias de escritura
[Link] 155
Write-Progress "Progress Message"
Write-Warning "Warning Message"
$VerbosePreference = "SilentlyContinue"
$InformationPreference = "SilentlyContinue"
$DebugPreference = "SilentlyContinue"
$ProgressPreference = "Continue"
$WarningPreference = "Continue"
$InformationPreference = "SilentlyContinue"
Write-Information "This message will not be shown and execution continues"
$InformationPreference = "Continue"
Write-Information "This message is shown and execution continues"
$InformationPreference = "Inquire"
Write-Information "This message is shown and execution will optionally continue"
$InformationPreference = "Stop"
Write-Information "This message is shown and execution terminates"
$[Link] = "Black"
$[Link] = "Red"
[Link] 156
Capítulo 53: Powershell Remoting
Observaciones
• about_Remote
• about_RemoteFAQ
• about_RemoteTroubleshooting
Examples
Habilitando el control remoto de PowerShell
El control remoto de PowerShell primero debe estar habilitado en el servidor al que desea
conectarse de forma remota.
Enable-PSRemoting -Force
En cualquier caso, deberá agregar los sistemas remotos a su lista de hosts de confianza de
[Link] 157
WSMan.
A continuación, en el equipo que desee conectar, usted debe indicarle a confiar en el equipo que
se está conectando.
Set-Item WSMan:\localhost\Client\TrustedHosts *
Enter-PSSession [Link]
Una vez que Powershell remoting esté habilitado (Enable-PSRemoting), puede ejecutar
comandos en la computadora remota de esta manera:
El método anterior crea una sesión temporal y la cierra justo después de que finalice el comando
o scriptblock.
Para dejar la sesión abierta y ejecutar otro comando más adelante, primero debe crear una sesión
remota:
[Link] 158
Luego, puede usar esta sesión cada vez que invoque comandos en la computadora remota:
$Cred = Get-Credential
Invoke-Command -Session $Session -Credential $Cred -ScriptBlock {...}
TypeName: [Link]#root\cimv2\Win32_Printer
TypeName: [Link]#root\cimv2\Win32_Printer
[Link] 159
RenamePrinter Method [Link]
RenamePrinter([Link] NewPrinterName)
Reset Method [Link] Reset()
Usando ArgumentList con parámetros sin nombre (es decir, en el orden en que se pasan al bloque
de secuencias de comandos):
$servicesToShow = "service1"
$fileName = "C:\temp\[Link]"
Invoke-Command -Session $session -ArgumentList $servicesToShow,$fileName -ScriptBlock {
Write-Host "Calling script block remotely with $($[Link])"
Get-Service -Name $args[0]
Remove-Item -Path $args[1] -ErrorAction SilentlyContinue -Force
}
$servicesToShow = "service1"
$fileName = "C:\temp\[Link]"
Invoke-Command -Session $session -ArgumentList $servicesToShow,$fileName -ScriptBlock {
Param($serviceToShowInRemoteSession,$fileToDelete)
$servicesToShow = "service1"
$fileName = "C:\temp\[Link]"
Invoke-Command -Session $session -ScriptBlock {
Get-Service $Using:servicesToShow
Remove-Item -Path $fileName -ErrorAction SilentlyContinue -Force
}
[Link] 160
Cuando se crea una sesión remota a través del cmdlet New-PSsession , la PSSession continúa
hasta que finaliza la sesión actual de PowerShell. Lo que significa que, de forma predeterminada,
la PSSession y todos los recursos asociados se seguirán utilizando hasta que finalice la sesión
actual de PowerShell.
Múltiples PSSessions activas pueden convertirse en una carga para los recursos, en particular para
los scripts de larga ejecución o interconectados que crean cientos de PSSessions en una sola
sesión de PowerShell.
Es una buena práctica eliminar explícitamente cada PSSession después de que se termine de usar.
[1]
try
{
$session = New-PSsession -Computername "RemoteMachineName"
Invoke-Command -Session $session -ScriptBlock {write-host "This is running on
$ENV:ComputerName"}
}
catch
{
Write-Output "ERROR: $_"
}
finally
{
if ($session)
{
Remove-PSSession $session
}
}
[Link] 161
Capítulo 54: Propiedades calculadas
Introducción
Las propiedades calculadas en Powershell son propiedades derivadas personalizadas
(calculadas). Le permite al usuario dar formato a una determinada propiedad de la forma en que
quiere que sea. El cálculo (expresión) puede ser una cosa muy posiblemente.
Examples
Mostrar tamaño de archivo en KB - Propiedades calculadas
Simplemente genera el contenido de la carpeta con las propiedades seleccionadas. Algo como,
¿Qué pasa si quiero mostrar el tamaño del archivo en KB? Aquí es donde las propiedades
calculadas son útiles.
Lo que produce,
La Expression es lo que contiene el cálculo para la propiedad calculada. Y sí, puede ser cualquier
cosa!
[Link] 162
Capítulo 55: PSScriptAnalyzer - Analizador de
scripts de PowerShell
Introducción
PSScriptAnalyzer, [Link] , es un comprobador de
código estático para los módulos y scripts de Windows PowerShell. PSScriptAnalyzer verifica la
calidad del código de Windows PowerShell ejecutando un conjunto de reglas basadas en las
mejores prácticas de PowerShell identificadas por el equipo de PowerShell y la comunidad.
Genera Resultados de Diagnóstico (errores y advertencias) para informar a los usuarios sobre
posibles defectos de código y sugiere posibles soluciones para mejoras.
Sintaxis
1. Get-ScriptAnalyzerRule [-CustomizedRulePath <string[]>] [-Name <string[]>] [-Severity
<string[]>] [<CommonParameters>]
2. Invoke-ScriptAnalyzer [-Path] <string> [-CustomizedRulePath <string[]>] [-ExcludeRule
<string[]>] [-IncludeRule<string[]>] [-Severity <string[]>] [-Recurse] [-SuppressedOnly]
[<CommonParameters>]
Examples
Análisis de scripts con los conjuntos de reglas preestablecidos incorporados
ScriptAnalyzer incluye conjuntos de reglas predefinidas incorporadas que se pueden usar para
analizar scripts. Estos incluyen: PSGallery , DSC y CodeFormatting . Se pueden ejecutar de la
siguiente manera:
Reglas DSC
[Link] 163
Invoke-ScriptAnalyzer -Path /path/to/module/ -Settings CodeFormatting -Recurse
Get-ScriptAnalyzerRule
[Link] 164
Capítulo 56: Reconocimiento de Amazon Web
Services (AWS)
Introducción
Amazon Rekognition es un servicio que facilita agregar análisis de imágenes a sus aplicaciones.
Con Rekognition, puede detectar objetos, escenas y rostros en las imágenes. También puedes
buscar y comparar caras. La API de Rekognition le permite agregar rápidamente la búsqueda
visual sofisticada basada en el aprendizaje profundo y la clasificación de imágenes a sus
aplicaciones.
Examples
Detectar etiquetas de imagen con AWS Rekognition
$BucketName = 'trevorrekognition'
$FileName = '[Link]'
$[Link]
RESULTS:
Confidence Name
---------- ----
86.87605 Indoors
86.87605 Interior Design
86.87605 Room
77.4853 Kitchen
77.25354 Housing
77.25354 Loft
66.77325 Appliance
66.77325 Oven
Al usar el módulo AWS PowerShell junto con el servicio de reconocimiento de AWS, puede
detectar etiquetas en una imagen, como identificar objetos en una habitación, los atributos sobre
las fotos que tomó y el nivel de confianza correspondiente que tiene el reconocimiento de AWS
para cada uno de esos atributos.
[Link] 165
luego apuntar el servicio de Reconocimiento a los Objetos S3 que desea analizar. El ejemplo
anterior muestra cómo lograr esto.
$BucketName = 'trevorrekognition'
### Perform a facial comparison between the two photos with AWS Rekognition
$Comparison = @{
SourceImageBucket = $BucketName
TargetImageBucket = $BucketName
SourceImageName = '[Link]'
TargetImageName = '[Link]'
Region = 'us-east-1'
}
$Result = Compare-REKFace @Comparison
$[Link]
Face Similarity
---- ----------
[Link] 90
El servicio de reconocimiento de AWS le permite realizar una comparación facial entre dos fotos.
El uso de este servicio es bastante sencillo. Simplemente cargue dos archivos de imagen, que
desea comparar, a un AWS S3 Bucket. Luego, invoque el comando Compare-REKFace , similar al
ejemplo proporcionado anteriormente. Por supuesto, deberá proporcionar su propio nombre de S3
Bucket y nombres de archivo únicos a nivel mundial.
[Link] 166
Capítulo 57: Salpicaduras
Introducción
Splatting es un método para pasar múltiples parámetros a un comando como una sola unidad.
Esto se hace almacenando los parámetros y sus valores como pares clave-valor en una tabla
hash y dividiéndolos en un cmdlet usando el operador de distribución @ .
Splatting puede hacer que un comando sea más legible y le permite reutilizar parámetros en
múltiples llamadas de comando.
Observaciones
Nota: El operador de expresión de Array o @() tienen un comportamiento muy diferente al del
operador de Splatting @ .
Examples
Parámetros de salpicadura
$MyParameters = @{
Name = "iexplore"
FileVersionInfo = $true
}
Get-Process @MyParameters
Sin salpicaduras:
Puede combinar parámetros normales con parámetros distribuidos para agregar fácilmente
parámetros comunes a sus llamadas.
$MyParameters = @{
ComputerName = "StackOverflow-PC"
}
[Link] 167
Pasando un parámetro Switch usando Splatting
Para usar Splatting para llamar a Get-Process con el interruptor -FileVersionInfo similar a esto:
Get-Process -FileVersionInfo
$MyParameters = @{
FileVersionInfo = $true
}
Get-Process @MyParameters
Nota: esto es útil porque puede crear un conjunto predeterminado de parámetros y hacer la
llamada muchas veces de esta manera
$MyParameters = @{
FileVersionInfo = $true
}
Tubería y salpicaduras
Declarar el splat es útil para reutilizar conjuntos de parámetros varias veces o con ligeras
variaciones:
$splat = @{
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
}
Sin embargo, si el splat no tiene sangría para su reutilización, es posible que no desee declararlo.
Se puede canalizar en su lugar:
@{
ComputerName = $env:COMPUTERNAME
Class = "Win32_SystemEnclosure"
Property = "Manufacturer"
ErrorAction = "Stop"
} | % { Get-WmiObject @_ }
[Link] 168
Sin salpicaduras es muy complicado intentar pasar los valores a través de la pila de llamadas.
Pero si combina splatting con la potencia de @PSBoundParameters , puede pasar la colección
de parámetros de nivel superior a través de las capas.
Function Outer-Method
{
Param
(
[string]
$First,
[string]
$Second
)
Inner-Method @PSBoundParameters
}
Function Inner-Method
{
Param
(
[string]
$Second
)
$parameters = @{
First = "Hello"
Second = "World"
}
Outer-Method @parameters
[Link] 169
Capítulo 58: Seguridad y criptografía
Examples
Cálculo de los códigos hash de una cadena a través de .Net Cryptography
#calculate
$hash=[[Link]]::Create("sha256").ComputeHash(
[[Link]]::[Link]($example))
#convert to hex
[[Link]]::ToString($hash)
#2E-DF-DA-DA-56-52-5B-12-90-FF-16-FB-17-44-CF-B4-82-DD-29-14-FF-BC-B6-49-79-0C-0E-58-9E-46-2D-
3D
#2edfdada56525b1290ff16fb1744cfb482dd2914ffbcb649790c0e589e462d3d
#convert to base64
[Convert]::ToBase64String($hash)
#Lt/a2lZSWxKQ/xb7F0TPtILdKRT/vLZJeQwOWJ5GLT0=
[Link] 170
Capítulo 59: Servicio de almacenamiento
simple de Amazon Web Services (AWS) (S3)
Introducción
Esta sección de documentación se centra en el desarrollo contra el Servicio de almacenamiento
simple (S3) de Amazon Web Services (AWS). S3 es realmente un servicio simple para
interactuar. Crea "cubos" de S3 que pueden contener cero o más "objetos". Una vez que crea un
grupo, puede cargar archivos o datos arbitrarios en el grupo S3 como un "objeto". Hace referencia
a los objetos S3, dentro de un grupo, por la "clave" (nombre) del objeto.
Parámetros
Parámetro Detalles
Examples
Crear un nuevo cubo S3
El nombre del depósito del Servicio de almacenamiento simple (S3) debe ser globalmente único.
Esto significa que si alguien más ya ha usado el nombre del depósito que desea usar, entonces
debe decidir un nombre nuevo.
Cargar archivos de su sistema de archivos local en AWS S3 es fácil, utilizando el comando Write-
S3Object . En su forma más básica, solo necesita especificar el parámetro -BucketName , para
indicar en qué grupo de S3 desea cargar un archivo, y el parámetro -File , que indica la ruta
relativa o absoluta al archivo local que desea subir en el cubo S3.
[Link] 171
Eliminar un S3 Bucket
Para eliminar una cubeta S3, primero debe eliminar todos los objetos S3 que se almacenan
dentro de la cubeta, siempre que tenga permiso para hacerlo. En el ejemplo anterior, estamos
recuperando una lista de todos los objetos dentro de un cubo, y luego Remove-S3Object comando
Remove-S3Object para eliminarlos. Una vez que se hayan eliminado todos los objetos, podemos
usar el comando Remove-S3Bucket para eliminar el depósito.
Lea Servicio de almacenamiento simple de Amazon Web Services (AWS) (S3) en línea:
[Link]
web-services--aws---s3-
[Link] 172
Capítulo 60: Set básico de operaciones
Introducción
Un conjunto es una colección de elementos que puede ser cualquier cosa. Cualquiera que sea el
operador que necesitamos para trabajar en estos conjuntos son, en resumen, los operadores
establecidos y la operación también se conoce como operación establecida . La operación de
configuración básica incluye Unión, Intersección, así como suma, resta, etc.
Sintaxis
• Objeto grupal
• Ordenar-Objeto
Examples
Filtrado: ¿Dónde-Objeto / dónde /?
Sinónimos:
[Link] 173
Where-Object
where
?
Ejemplo:
Devoluciones:
Aaron
Albert
Alphonse
Sinónimos:
Sort-Object
sort
Asumiendo:
$names | Sort-Object
$names | sort
Aaron
Aaron
Bernie
Charlie
Danny
Danny
Charlie
[Link] 174
Bernie
Aaron
Aaron
Aaron
Aaron
Danny
Bernie
Charlie
Sinónimos:
Group-Object
group
Ejemplos:
Respuesta:
2 6 {Albert, Bernie}
1 8 {Alphonse}
1 7 {Charlie}
Proyectar una enumeración le permite extraer miembros específicos de cada objeto, extraer todos
los detalles o calcular valores para cada objeto
Sinónimos:
[Link] 175
Select-Object
select
$d | select -first 1 *
PSPath
PSParentPath
PSChildName
PSDrive
PSProvider
PSIsContainer
Nombre base
Modo
Nombre
Padre
Existe
Raíz
Nombre completo
Extensión
[Link] 176
Tiempo de creación
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc
Atributos
[Link] 177
Capítulo 61: Trabajando con archivos XML
Examples
Accediendo a un archivo XML
# First Method
$xdoc = New-Object [Link]
$file = Resolve-Path(".\[Link]")
$[Link]($file)
# Second Method
[xml] $xdoc = Get-Content ".\[Link]"
# Third Method
$xdoc = [xml] (Get-Content ".\[Link]")
PS C:\> $[Link]
person
--------
{Jon Lajoie, Lord Gaben, Gordon Freeman}
PS C:\> $[Link]
id name age
-- ---- ---
[Link] 178
101 Jon Lajoie 22
102 Lord Gaben 65
103 Gordon Freeman 29
PS C:\> $[Link][0].name
Jon Lajoie
PS C:\> $[Link][1].age
65
PS C:\> $[Link][2].id
103
PS C:\> $[Link]("//people")
person
--------
{Jon Lajoie, Lord Gaben, Gordon Freeman}
PS C:\> $[Link]("//people//person")
id name age
-- ---- ---
101 Jon Lajoie 22
102 Lord Gaben 65
103 Gordon Freeman 29
PS C:\> $[Link]("people//person[1]//name")
Jon Lajoie
PS C:\> $[Link]("people//person[2]//age")
65
PS C:\> $[Link]("people//person[3]//@id")
103
[Link] 179
PS C:\> $[Link]("ns", $[Link])
PS C:\> $[Link]("//ns:people/ns:person", $ns)
id name
-- ----
101 Jon Lajoie
102 Lord Gaben
103 Gordon Freeman
$[Link]("Property1","Value 1")
$[Link]("Property2","Value 2")
[Link] 180
Añadiendo fragmentos de XML a XMLDocument actual
Data de muestra
Documento XML
Primero, definamos un documento XML de muestra llamado " [Link] " en nuestro directorio
actual:
[Link] 181
<publisher>
<isbn>978-08-08587-35-4</isbn>
<name>Penguin Putnam</name>
<year>2010</year>
<binding>Paperback</binding>
</publisher>
</publishers>
<characters>
<character name="Marko Alexadrovich Ramius" />
<character name="Jack Ryan" />
<character name="Admiral Greer" />
<character name="Bart Mancuso" />
<character name="Vasily Borodin" />
</characters>
<film>True</film>
</book>
</books>
Nuevos datos
Lo que queremos hacer es agregar algunos libros nuevos a este documento, digamos Patriot
Games por Tom Clancy (sí, soy un fan de los trabajos de Clancy ^ __ ^) y un favorito de ciencia
ficción: La guía del autoestopista de la galaxia. por Douglas Adams principalmente porque
Zaphod Beeblebrox es divertido de leer.
De alguna manera, hemos adquirido los datos para los nuevos libros y los hemos guardado como
una lista de PSCustomObjects:
$newBooks = @(
[PSCustomObject] @{
"Title" = "Patriot Games";
"Author" = "Tom Clancy";
"PageCount" = 540;
"Publishers" = @(
[PSCustomObject] @{
"ISBN" = "978-0-39-913241-4";
"Year" = "1987";
"First" = $True;
"Name" = "Putnam";
"Binding" = "Hardcover";
}
);
"Characters" = @(
"Jack Ryan", "Prince of Wales", "Princess of Wales",
"Robby Jackson", "Cathy Ryan", "Sean Patrick Miller"
);
"film" = $True;
},
[PSCustomObject] @{
"Title" = "The Hitchhiker's Guide to the Galaxy";
"Author" = "Douglas Adams";
"PageCount" = 216;
"Publishers" = @(
[PSCustomObject] @{
"ISBN" = "978-0-33-025864-7";
"Year" = "1979";
"First" = $True;
[Link] 182
"Name" = "Pan Books";
"Binding" = "Hardcover";
}
);
"Characters" = @(
"Arthur Dent", "Marvin", "Zaphod Beeblebrox", "Ford Prefect",
"Trillian", "Slartibartfast", "Dirk Gently"
);
"film" = $True;
}
);
Plantillas
Ahora necesitamos definir unas pocas estructuras XML esqueléticas para que nuestros nuevos
datos ingresen. Básicamente, desea crear un esqueleto / plantilla para cada lista de datos. En
nuestro ejemplo, eso significa que necesitamos una plantilla para el libro, los personajes y los
editores. También podemos usar esto para definir algunos valores predeterminados, como el
valor de la etiqueta de la film .
[Link] 183
# Read the xml document
$xml = [xml] Get-Content .\[Link];
# Outputs:
# title author ISBN
# ----- ------ ----
# Of Mice And Men John Steinbeck 978-88-58702-15-4
# The Hunt for Red October Tom Clancy 978-08-70212-85-7
# Outputs:
# Title Author ISBN
# ----- ------ ----
# Patriot Games Tom Clancy 978-0-39-913241-4
# The Hitchhiker's Guide to the Galaxy Douglas Adams 978-0-33-025864-7
# Add the template for a book as a new node to the root element
[void]$[Link]($[Link]($t_book.book, $true));
# Update the parameters of that new element to match our current new book data
$[Link] = [String]$[Link];
$[Link] = [String]$[Link];
$[Link] = [String]$[Link];
$[Link] = [String]$[Link];
# Iterate through the properties that are Children of our new Element:
ForEach ( $publisher in $[Link] ) {
# Create the new child publisher element
# Note the use of "SelectSingleNode" here, this allows the use of the "AppendChild"
method as it returns
# a XmlElement type object instead of the $Null data that is currently stored in that
leaf of the
# XML document tree
[void]$[Link]("publishers").AppendChild($[Link]($t_publisher.publisher,
$true));
# Update the attribute and text values of our new XML Element to match our new data
$newPublisherElement = $[Link]("publishers/publisher[last()]");
$[Link] = [String]$[Link];
$[Link] = [String]$[Link];
$[Link] = [String]$[Link];
$[Link] = [String]$[Link];
If ( $[Link] ) {
$[Link] = "True";
}
}
[Link] 184
ForEach ( $character in $[Link] ) {
# Select the characters xml element
$charactersElement = $[Link]("characters");
# Update the attribute and text values to match our new data
$[Link] = [String]$character;
}
}
# Outputs:
# title author ISBN
# ----- ------ ----
# Of Mice And Men John Steinbeck 978-88-58702-15-4
# The Hunt for Red October Tom Clancy 978-08-70212-85-7
# Patriot Games Tom Clancy 978-0-39-913241-4
# The Hitchhiker's Guide to the Galaxy Douglas Adams 978-0-33-025864-7
¡Ahora podemos escribir nuestro XML en disco, pantalla, web o en cualquier lugar!
Lucro
Si bien este puede no ser el procedimiento para todos, lo encontré para ayudar a evitar un
montón de
[void]$[Link]("/complicated/xpath/goes[here]").AppendChild($[Link]("newElementN
seguido de $[Link]("/complicated/xpath/goes/here/newElementName") = $textValue
Creo que el método detallado en el ejemplo es más limpio y más fácil de analizar para los
humanos normales.
Mejoras
Puede ser posible cambiar la plantilla para incluir elementos con niños en lugar de desglosar cada
sección como una plantilla separada. Solo tienes que tener cuidado de clonar el elemento anterior
cuando recorres la lista.
[Link] 185
Capítulo 62: Trabajando con la tubería de
PowerShell
Introducción
PowerShell presenta un modelo de canalización de objetos, que le permite enviar objetos enteros
a través de la tubería para consumir comandos o (al menos) la salida. A diferencia de la
canalización clásica basada en cadenas, la información de los objetos canalizados no tiene que
estar en posiciones específicas. Los Commandlets pueden declarar que interactúan con los
objetos de la canalización como entrada, mientras que los valores de retorno se envían
automáticamente a la canalización.
Sintaxis
• COMENZAR El primer bloque. Ejecutado una vez al principio. La entrada de canalización
aquí es $ null, ya que no se ha establecido.
• PROCESO El segundo bloque. Ejecutado para cada elemento de la tubería. El parámetro
pipeline es igual al elemento procesado actualmente.
• FIN del último bloque. Ejecutado una vez al final. El parámetro de canalización es igual al
último elemento de la entrada, porque no se ha cambiado desde que se estableció.
Observaciones
En la mayoría de los casos, la entrada de la tubería será una matriz de objetos. Aunque el
comportamiento del bloque PROCESS{} puede parecer similar al bloque foreach{} , omitir un
elemento de la matriz requiere un proceso diferente.
Si, como en foreach{} , usó continue dentro del bloque PROCESS{} , se rompería la tubería,
omitiendo todas las siguientes declaraciones, incluido el bloque END{} . En su lugar, use return :
solo finalizará el bloque PROCESS{} para el elemento actual y se moverá al siguiente.
Referencias adicionales:
Examples
[Link] 186
Funciones de escritura con ciclo de vida avanzado
Este ejemplo muestra cómo una función puede aceptar entradas canalizadas e iterar de manera
eficiente.
Tenga en cuenta que las estructuras de begin y end de la función son opcionales cuando se
canalizan, pero ese process es necesario cuando se utiliza ValueFromPipeline o
ValueFromPipelineByPropertyName .
function Write-FromPipeline{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
$myInput
)
begin {
Write-Verbose -Message "Beginning Write-FromPipeline"
}
process {
Write-Output -InputObject $myInput
}
end {
Write-Verbose -Message "Ending Write-FromPipeline"
}
}
$foo = 'hello','world',1,2,3
Salida:
Este es un ejemplo de una función con el soporte más simple posible para la canalización.
Cualquier función con soporte de canalización debe tener al menos un parámetro con el
parámetro ParameterAttribute ValueFromPipeline o ValueFromPipelineByPropertyName , como se
muestra a continuación.
function Write-FromPipeline {
param(
[Parameter(ValueFromPipeline)] # This sets the ParameterAttribute
[String]$Input
)
Write-Host $Input
}
[Link] 187
$foo = 'Hello World!'
$foo | Write-FromPipeline
Salida:
Hello World!
Nota: en PowerShell 3.0 y versiones posteriores, se admiten los valores predeterminados para
ParameterAttributes. En versiones anteriores, debe especificar ValueFromPipeline=$true .
En una serie de tuberías, cada función corre paralela a las demás, como hilos paralelos. El primer
objeto procesado se transmite a la siguiente canalización y el siguiente procesamiento se ejecuta
inmediatamente en otro hilo. Esto explica la ganancia de alta velocidad en comparación con el
estándar ForEach
[Link] 188
Capítulo 63: Trabajando con objetos
Examples
Actualizando objetos
Añadiendo propiedades
Si desea agregar propiedades a un objeto existente, puede usar el cmdlet Add-Member. Con
PSObjects, los valores se mantienen en un tipo de "Propiedades de nota"
Add-Member -InputObject $object -Name "SomeNewProp" -Value "A value" -MemberType NoteProperty
# Returns
PS> $Object
Name ID Address SomeNewProp
---- -- ------- -----------
nem 12 A value
# Returns
PS> $newObject
Name ID Address SomeNewProp SomeOtherProp
---- -- ------- ----------- -------------
nem 12 A value Another value
Eliminando propiedades
Puede usar el Cmdlet Seleccionar objeto para eliminar propiedades de un objeto:
# Returns
[Link] 189
PS> $object
Name SomeNewProp SomeOtherProp
---- ----------- -------------
nem A value Another value
Crear un objeto es simple. La mayoría de los objetos que cree serán objetos personalizados en
PowerShell, y el tipo a usar para eso es PSObject. PowerShell también te permitirá crear
cualquier objeto que puedas crear en .NET.
Aquí hay un ejemplo de cómo crear nuevos objetos con algunas propiedades:
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
También puede ser necesario almacenar colecciones de objetos. Esto se puede hacer creando
una variable de colección vacía y agregando objetos a la colección, así:
$newCollection = @()
$newCollection += New-Object -TypeName PSObject -Property @{
Name = $env:username
ID = 12
Address = $null
}
Es posible que desee recorrer esta colección objeto por objeto. Para ello, localice la sección Loop
en la documentación.
[Link] 190
$newObject = 'unuseddummy' | Select-Object -Property Name, ID, Address
$[Link] = $env:username
$[Link] = 12
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
$newObject = [PSCustomObject][Ordered]@{
Name = $env:Username
ID = 12
Address = $null
}
# Returns
PS> $newObject
Name ID Address
---- -- -------
nem 12
Examinando un objeto
Ahora que tiene un objeto, podría ser bueno averiguar qué es. Puede usar el cmdlet Get-Member
para ver qué es un objeto y qué contiene:
Esto produce:
TypeName: [Link]
[Link] 191
Para ver una lista de propiedades que tiene el objeto, junto con sus valores, puede usar el cmdlet
Format-List con su parámetro de propiedad establecido en: * (es decir, todo).
PSPath : [Link]\FileSystem::C:\Windows
PSParentPath : [Link]\FileSystem::C:\
PSChildName : Windows
PSDrive : C
PSProvider : [Link]\FileSystem
PSIsContainer : True
Mode : d-----
BaseName : Windows
Target : {}
LinkType :
Name : Windows
Parent :
Exists : True
Root : C:\
FullName : C:\Windows
Extension :
CreationTime : 30/10/2015 [Link]
CreationTimeUtc : 30/10/2015 [Link]
LastAccessTime : 16/08/2016 [Link]
LastAccessTimeUtc : 16/08/2016 [Link]
LastWriteTime : 16/08/2016 [Link]
LastWriteTimeUtc : 16/08/2016 [Link]
Attributes : Directory
Nota: ejemplos escritos para PowerShell 5.1. Puede crear instancias de clases genéricas.
#Nullable [Link]
[Nullable[datetime]]$nullableDate = Get-Date -Year 2012
$nullableDate
$[Link]().FullName
$nullableDate = $null
$nullableDate
#Normal [Link]
[datetime]$aDate = Get-Date -Year 2013
$aDate
$[Link]().FullName
$aDate = $null #Throws exception when PowerShell attempts to convert null to
Da la salida:
[Link] 192
At line:14 char:1
+ $aDate = $null
+ ~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
[[Link][int, String]]$dict =
[[Link][int, String]]::new()
$[Link]().FullName
$[Link](1, 'a')
$[Link](2, 'b')
$[Link](3, 'c')
$dict
Da la salida:
Key Value
--- -----
1 a
2 b
3 c
4 d
5 c
Cannot convert argument "key", with value: "z", for "Add" to type "System.Int32": "Cannot
convert value "z" to type "System.Int32". Error: "Input string was not in a correct format.""
At line:15 char:1
+ $[Link]('z', 'z') #powershell can't convert 'z' to System.Int32 so ...
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
[Link] 193
Capítulo 64: Trabajos de fondo de PowerShell
Introducción
Los trabajos se introdujeron en PowerShell 2.0 y ayudaron a resolver un problema inherente en
las herramientas de línea de comandos. En pocas palabras, si inicia una tarea de ejecución
prolongada, su indicador no estará disponible hasta que la tarea finalice. Como ejemplo de una
tarea de larga ejecución, piense en este simple comando de PowerShell:
Observaciones
PowerShell Jobs se ejecuta en un nuevo proceso. Esto tiene pros y contras que están
relacionados.
Pros:
Contras:
Examples
Creación de empleo básico
[Link] 194
Comience un trabajo utilizando Invoke-Command en una máquina remota:
$username = "Domain\Username"
$password = "password"
$secPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$credentials = New-Object [Link] -ArgumentList @($username,
$secPassword)
Start-Job -ScriptBlock {Get-Process} -Credential $credentials
Get-Job
Tiempo de espera de un trabajo si se ejecuta demasiado tiempo (10 segundos en este ejemplo)
Detener un trabajo (completa todas las tareas que están pendientes en esa cola de trabajos antes
de finalizar):
$job | Stop-Job
$job | Remove-Job
[Link] 195
Suspender un Workflow trabajo (pausa):
$job | Suspend-Job
$job | Resume-Job
[Link] 196
Capítulo 65: Usando clases estáticas
existentes
Introducción
Estas clases son bibliotecas de referencia de métodos y propiedades que no cambian de estado,
en una palabra, inmutables. No necesitas crearlos, simplemente los usas. Las clases y los
métodos como estos se llaman clases estáticas porque no se crean, destruyen o cambian. Puede
referirse a una clase estática rodeando el nombre de la clase entre corchetes.
Examples
Creando nuevo GUID al instante
Use las clases .NET existentes al instante con PowerShell usando [class] :: Method (args):
PS C:\> [guid]::NewGuid()
Guid
----
8874a185-64be-43ed-a64c-d2fe4b6e31bc
PS C:\> New-Guid
Guid
----
8874a185-64be-43ed-a64c-d2fe4b6e31bc
Para obtener el GUID solo como una [String] , haga referencia a la propiedad .Guid :
[guid]::NewGuid().Guid
PS C:\> [[Link]]::Floor(9.42)
[Link] 197
9
PS C:\> [[Link]]::Ceiling(9.42)
10
PS C:\> [[Link]]::Pow(4,3)
64
PS C:\> [[Link]]::Sqrt(49)
7
Sumando tipos
[Link] 198
Capítulo 66: Usando la barra de progreso
Introducción
Se puede usar una barra de progreso para mostrar que algo se encuentra en un proceso. Es una
característica que le permite ahorrar tiempo y es elegante. Las barras de progreso son
increíblemente útiles para depurar qué parte de la secuencia de comandos se está ejecutando, y
son satisfactorias para las personas que ejecutan secuencias de comandos para realizar un
seguimiento de lo que está sucediendo. Es común mostrar algún tipo de progreso cuando una
secuencia de comandos tarda mucho tiempo en completarse. Cuando un usuario inicia la
secuencia de comandos y no sucede nada, uno comienza a preguntarse si la secuencia de
comandos se inició correctamente.
Examples
Uso simple de la barra de progreso.
1..100 | ForEach-Object {
Write-Progress -Activity "Copying files" -Status "$_ %" -Id 1 -PercentComplete $_ -
CurrentOperation "Copying file file_name_$_.txt"
Start-Sleep -Milliseconds 500 # sleep simulates working code, replace this line
with your executive code (i.e. file copying)
}
Tenga en cuenta que, por brevedad, este ejemplo no contiene ningún código ejecutivo (simulado
con Start-Sleep ). Sin embargo, es posible ejecutarlo directamente como está y luego modificarlo
y jugar con él.
[Link] 199
Uso de la barra de progreso interior
1..10 | foreach-object {
$fileName = "file_name_$_.txt"
Write-Progress -Activity "Copying files" -Status "$($_*10) %" -Id 1 -PercentComplete
($_*10) -CurrentOperation "Copying file $fileName"
1..100 | foreach-object {
Write-Progress -Activity "Copying contents of the file $fileName" -Status "$_ %" -
Id 2 -ParentId 1 -PercentComplete $_ -CurrentOperation "Copying $_. line"
Start-Sleep -Milliseconds 500 # sleep simulates working code, replace this line with
your executive code (i.e. file search)
Tenga en cuenta que, por brevedad, este ejemplo no contiene ningún código ejecutivo (simulado
con Start-Sleep ). Sin embargo, es posible ejecutarlo directamente como está y luego modificarlo
y jugar con él.
[Link] 200
Así es como se ve el resultado en PS ISE:
[Link] 201
Capítulo 67: Usando ShouldProcess
Sintaxis
• $ [Link] ("Target")
• $ [Link] ("Target", "Action")
Parámetros
Parámetro Detalles
Observaciones
$[Link]() también escribirá automáticamente un mensaje en la salida detallada.
Examples
Agregando soporte de -WhatIf y -Confirm a su cmdlet
function Invoke-MyCmdlet {
[CmdletBinding(SupportsShouldProcess = $true)]
param()
# ...
}
if ($[Link]("Target of action")) {
# Do the thing
}
Al usar -WhatIf :
Al usar -Confirm :
[Link] 202
Are you sure you want to perform this action?
Performing operation "Invoke-MyCmdlet" on target "Target of action"
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Este ejemplo también muestra que los comandos subyacentes también escucharán la marca -
Confirmar!
<#
Restart-Win32Computer
#>
function Restart-Win32Computer
{
[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact="High")]
param (
[parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string[]]$computerName,
[parameter(Mandatory=$true)]
[string][ValidateSet("Restart","LogOff","Shutdown","PowerOff")] $action,
[boolean]$force = $false
)
BEGIN {
# translate action to numeric value required by the method
switch($action) {
"Restart"
{
$_action = 2
break
}
"LogOff"
{
$_action = 0
break
}
"Shutdown"
{
$_action = 2
break
}
"PowerOff"
{
$_action = 8
break
}
}
# to force, add 4 to the value
if($force)
{
$_action += 4
}
write-verbose "Action set to $action"
}
PROCESS {
write-verbose "Attempting to connect to $computername"
[Link] 203
# this is how we support -whatif and -confirm
# which are enabled by the SupportsShouldProcess
# parameter in the cmdlet bindnig
if($[Link]($computername)) {
get-wmiobject win32_operatingsystem -computername $computername | invoke-wmimethod -
name Win32Shutdown -argumentlist $_action
}
}
}
#Usage:
#This will only output a description of the actions that this command would execute if -WhatIf
is removed.
'localhost','server1'| Restart-Win32Computer -action LogOff -whatif
#This will request the permission of the caller to continue with this item.
#Attention: in this example you will get two confirmation request because all cmdlets called
by this cmdlet that also support ShouldProcess, will ask for their own confirmations...
'localhost','server1'| Restart-Win32Computer -action LogOff -Confirm
[Link] 204
Capítulo 68: Uso del sistema de ayuda
Observaciones
Get-Help es un cmdlet para leer temas de ayuda en PowerShell.
Examples
Actualización del sistema de ayuda
3.0
A partir de PowerShell 3.0, puede descargar y actualizar la documentación de ayuda sin conexión
con un solo cmdlet.
Update-Help
Usando Get-Help
puede usar Get-Help para ver la ayuda en PowerShell. Puede buscar cmdlets, funciones,
Get-Help
proveedores u otros temas.
Get-Help about_Jobs
Puedes buscar temas usando comodines. Si desea enumerar los temas de ayuda disponibles con
un título que comienza con about_ , intente:
Get-Help about_*
Get-Help Select-Object
[Link] 205
También puedes usar los alias help o man .
Ejemplos de visualización
[Link] 206
Capítulo 69: Variables automáticas
Introducción
Las variables automáticas son creadas y mantenidas por Windows PowerShell. Uno tiene la
capacidad de llamar a una variable casi cualquier nombre en el libro; Las únicas excepciones a
esto son las variables que ya están siendo administradas por PowerShell. Estas variables, sin
duda, serán los objetos más repetitivos que utilice en PowerShell junto a las funciones (como $? -
indica el estado de éxito / falla de la última operación)
Sintaxis
• $$ - Contiene el último token en la última línea recibida por la sesión.
• $^ : Contiene el primer token en la última línea recibida por la sesión.
• $? - Contiene el estado de ejecución de la última operación.
• $_ - Contiene el objeto actual en la tubería
Examples
$ pid
PS C:\> $pid
26080
Valores booleanos
$true y $false son dos variables que representan lógicas VERDADERO y FALSO.
Tenga en cuenta que debe especificar el signo de dólar como primer carácter (que es diferente de
C #).
Tenga en cuenta que cuando utiliza booleano verdadero / falso en su código, escribe $true o
$false , pero cuando Powershell devuelve un valor booleano, parece True o False
$ nulo
[Link] 207
$null se utiliza para representar el valor ausente o indefinido.
$null se puede usar como un marcador de posición vacío para el valor vacío en las matrices:
Cuando usamos la misma matriz que la fuente para ForEach-Object , procesará los tres elementos
(incluido $ null):
¡Ten cuidado! Esto significa que ForEach-Object procesará incluso $null por sí mismo:
$ OFS
La variable llamada Output Field Separator contiene un valor de cadena que se utiliza al convertir
una matriz en una cadena. Por defecto $OFS = " " ( un espacio ), pero se puede cambiar:
$ _ / $ PSItem
Contiene el objeto / elemento que está siendo procesado actualmente por la canalización.
$PSItem y $_ son idénticos y se pueden usar indistintamente, pero $_ es, con mucho, el más
utilizado.
[Link] 208
PS
PS C:\> wrt-host
wrt-host : The term 'wrt-host' is not recognized as the name of a cmdlet, function, script
file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and
try again.
At line:1 char:1
+ wrt-host
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (wrt-host:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\> $?
False
$ error
Matriz de los objetos de error más recientes. El primero en la matriz es el más reciente:
Consejos de uso: cuando use la variable $error en un cmdlet de formato (por ejemplo, format-list),
tenga en cuenta que use el interruptor -Force . De lo contrario, el cmdlet de formato generará el
contenido de $error en la forma mostrada anteriormente.
[Link] 209
Capítulo 70: Variables automáticas - parte 2
Introducción
El tema "Variables automáticas" ya tiene 7 ejemplos enumerados y no podemos agregar más.
Este tema tendrá una continuación de Variables automáticas.
Las variables automáticas son variables que almacenan información de estado para PowerShell.
Estas variables son creadas y mantenidas por Windows PowerShell.
Observaciones
No estoy seguro de si esta es la mejor manera de manejar la documentación de variables
automáticas, pero esto es mejor que nada. Por favor comenta si encuentras una manera mejor :)
Examples
$ PSVersionTable
Contiene una tabla hash de solo lectura (Constante, AllScope) que muestra detalles sobre la
versión de PowerShell que se está ejecutando en la sesión actual.
$[Link]
# result :
Major Minor Build Revision
----- ----- ----- --------
5 0 10586 117
[Link] 210
Capítulo 71: Variables de entorno
Examples
Las variables de entorno de Windows son visibles como una unidad PS
llamada Env:
$env:COMPUTERNAME
[Link] 211
Capítulo 72: Variables en PowerShell
Introducción
Las variables se utilizan para almacenar valores. Deje que el valor sea de cualquier tipo,
necesitamos almacenarlo en algún lugar para poder usarlo en toda la consola / script. Los
nombres de variables en PowerShell comienzan con $ , como en $ Variable1 , y los valores se
asignan usando = , como $ Variable1 = "Valor 1". PowerShell admite una gran cantidad de tipos
de variables; como cadenas de texto, enteros, decimales, matrices e incluso tipos avanzados
como números de versión o direcciones IP.
Examples
Variable simple
$foo = "bar"
Esta declaración asigna una variable llamada foo con un valor de cadena de "barra".
Para eliminar una variable de la memoria, se puede usar el cmdlet Remove-Item . Nota: El nombre
de la variable NO incluye el $ .
Remove-Item Variable:\foo
tiene un proveedor para permitir que la mayoría de los cmdlets * -item funcionen de
Variable
manera similar a los sistemas de archivos.
$var = "Some Variable" #Define variable 'var' containing the string 'Some Variable'
$var #For test and show string 'Some Variable' on the console
Alcance
El ámbito predeterminado para una variable es el contenedor adjunto. Si está fuera de un script u
[Link] 212
otro contenedor, el alcance es Global . Para especificar un alcance , se le $scope:varname prefijo al
nombre de variable $scope:varname así:
Salida:
Global Scope
Function (local) scope
Function (local) scope
Global Scope
Global Scope
Esto simplemente devolvería el proceso en ejecución que coincide con el nombre excel, a la
entidad llamante. En este caso, el host de PowerShell. Imprime algo como
Ahora, si asigna la salida a una variable, simplemente no imprimirá nada. Y, por supuesto, la
variable mantiene la salida. (Ya sea una cadena, Objeto - Cualquier tipo para esa materia)
Entonces, digamos que tiene un escenario donde desea asignar una variable por un nombre
dinámico, puede usar el parámetro -OutVariable
Tenga en cuenta que aquí falta el $. Una diferencia importante entre estas dos asignaciones es
que, también imprime el resultado además de asignarlo a la variable AllRunningExcel. También
[Link] 213
puede optar por asignarlo a otra variable.
Aunque, el escenario anterior es muy raro, ambas variables $ VarOne y $ VarTwo tendrán el
mismo valor.
Powershell permite la asignación múltiple de variables y trata casi todo como una matriz o lista.
Esto significa que en lugar de hacer algo como esto:
$input = "[Link]"
$parts = $[Link](".")
$foo = $parts[0]
$bar = $parts[1]
$baz = $parts[2]
Dado que Powershell trata las asignaciones de esta manera como si fueran listas, si hay más
valores en la lista que elementos en su lista de variables a las que asignarlos, la última variable se
convierte en una matriz de los valores restantes. Esto significa que también puedes hacer cosas
como esta:
Arrays
[Link] 214
La declaración de arrays en Powershell es casi lo mismo que crear una instancia de cualquier otra
variable, es decir, se usa una sintaxis de $name = . Los elementos de la matriz se declaran
separándolos con comas ( , ):
$myArrayOfInts = 1,2,3,4
$myArrayOfStrings = "1","2","3","4"
Añadiendo a un arry
Agregar a una matriz es tan simple como usar el operador + :
$myArrayOfInts = $myArrayOfInts + 5
//now contains 1,2,3,4 & 5!
$myArrayOfInts = 1,2,3,4
$myOtherArrayOfInts = 5,6,7
$myArrayOfInts = $myArrayOfInts + $myOtherArrayOfInts
//now 1,2,3,4,5,6,7
[Link] 215
Capítulo 73: Variables incorporadas
Introducción
PowerShell ofrece una variedad de variables "automáticas" (incorporadas) útiles. Algunas
variables automáticas solo se completan en circunstancias especiales, mientras que otras están
disponibles globalmente.
Examples
$ PSScriptRoot
En Windows PowerShell 2.0, esta variable solo es válida en módulos de script (.psm1). A partir de
Windows PowerShell 3.0, es válido en todos los scripts.
$ Args
$Args
En una acción de evento, la variable $ Args contiene objetos que representan los argumentos de
evento del evento que se está procesando. Esta variable se llena solo dentro del bloque de acción
de un comando de registro de eventos. El valor de esta variable también se puede encontrar en la
propiedad SourceArgs del objeto PSEventArgs ([Link])
que devuelve Get-Event.
$ PSItem
[Link] 216
Igual que $_ . Contiene el objeto actual en el objeto de canalización. Puede utilizar esta variable
en comandos que realizan una acción en cada objeto o en objetos seleccionados en una tubería.
PS
$ error
Contiene una matriz de objetos de error que representan los errores más recientes. El error más
reciente es el primer objeto de error en la matriz ($ Error [0]).
Para evitar que un error se agregue a la matriz $ Error, use el parámetro común ErrorAction con
un valor de Ignorar. Para obtener más información, consulte about_CommonParameters (
[Link] .
[Link] 217
Capítulo 74: WMI y CIM
Observaciones
CIM vs WMI
A partir de PowerShell 3.0, hay dos formas de trabajar con clases de administración en
PowerShell, WMI y CIM. PowerShell 1.0 y 2.0 solo admitían el módulo WMI, que ahora está
superpuesto al nuevo y mejorado módulo CIM. En una versión posterior de PowerShell, se
eliminarán los cmdlets de WMI.
Invocar-
Invocar-Método Cim Invoca un método de clase CIM / WMI
WmiMethod
Registro- Registrarse-
Registra un evento para una clase CIM / WMI
CimIndicationEvent WmiEvent
Remove-
Eliminar CimInstance Eliminar objeto CIM / WMI
WmiObject
Set-
Set-CimInstance Actualiza / Guarda objeto CIM / WMI
WmiInstance
Get-WmiObject
Get-CimClass Lista de clases CIM / WMI
-List
[Link] 218
Recursos adicionales
¿Debo usar CIM o WMI con Windows PowerShell? @ ¡Oye, chico del scripting! Blog
Examples
Consulta de objetos
CIM / WMI se usa más comúnmente para consultar información o configuración en un dispositivo.
En una clase que representa una configuración, proceso, usuario, etc. En PowerShell hay varias
formas de acceder a estas clases e instancias, pero las formas más comunes son mediante el
uso de los Get-CimInstance (CIM) o Get-WmiObject (WMI).
3.0
CIM:
WMI:
Usando un filtro
Puede aplicar un filtro para obtener solo instancias específicas de una clase CIM / WMI. Los filtros
se escriben utilizando WQL (predeterminado) o CQL (agregar -QueryDialect CQL ). -Filter utiliza la
parte WHERE de una consulta WQL / CQL completa.
3.0
CIM:
[Link] 219
Get-CimInstance -ClassName Win32_Process -Filter "Name = '[Link]'"
WMI:
...
Caption : [Link]
CommandLine : "C:\Windows\System32\WindowsPowerShell\v1.0\[Link]"
CreationClassName : Win32_Process
CreationDate : 20160913184324.393887+120
CSCreationClassName : Win32_ComputerSystem
CSName : STACKOVERFLOW-PC
Description : [Link]
ExecutablePath : C:\Windows\System32\WindowsPowerShell\v1.0\[Link]
ExecutionState :
Handle : 4800
HandleCount : 673
....
3.0
CIM:
3.0
CIM:
[Link] 220
WMI:
__GENUS : 2
__CLASS : AntiVirusProduct
__SUPERCLASS :
__DYNASTY : AntiVirusProduct
__RELPATH : [Link]="{D68DDC3A-831F-4fae-9E44-
DA132C1ACF46}"
__PROPERTY_COUNT : 6
__DERIVATION : {}
__SERVER : STACKOVERFLOW-PC
__NAMESPACE : ROOT\SecurityCenter2
__PATH : \\STACKOVERFLOW-
PC\ROOT\SecurityCenter2:[Link]="{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"
displayName : Windows Defender
instanceGuid : {D68DDC3A-831F-4fae-9E44-DA132C1ACF46}
pathToSignedProductExe : %ProgramFiles%\Windows Defender\[Link]
pathToSignedReportingExe : %ProgramFiles%\Windows Defender\[Link]
productState : 397568
timestamp : Fri, 09 Sep 2016 [Link] GMT
PSComputerName : STACKOVERFLOW-PC
Hay muchas clases disponibles en CIM y WMI que están separadas en múltiples espacios de
nombres. El espacio de nombres más común (y predeterminado) en Windows es root/cimv2 . Para
encontrar la clase correcta, puede ser útil hacer una lista de todos o buscar.
3.0
CIM:
Get-CimClass
WMI:
Get-WmiObject -List
[Link] 221
3.0
CIM:
NameSpace: ROOT/CIMV2
WMI:
3.0
CIM:
NameSpace: ROOT/SecurityCenter2
[Link] 222
FirewallProduct {} {displayName, instanceGuid,
pathToSignedProductExe, pathToSignedReportingE...
WMI:
3.0
CIM:
Name PSComputerName
---- --------------
subscription
DEFAULT
CIMV2
msdtc
Cli
SECURITY
HyperVCluster
SecurityCenter2
RSOP
PEH
StandardCimv2
WMI
directory
Policy
virtualization
Interop
Hardware
ServiceModel
SecurityCenter
Microsoft
aspnet
Appv
WMI:
[Link] 223
Creditos
S.
Capítulos Contributors
No
¿Cómo descargar el
último artefacto de
2 Artifactory usando el ANIL
script de Powershell
(v2.0 o inferior)?
3 Alias jumbo
Anonimizar IP (v4 y
5 v6) en un archivo de NooJ
texto con Powershell
Automatización de
6 Giulio Caccin, Ranadip Dutta
infraestructura
Ayuda basada en
7 Christophe
comentarios
Clases de boeprox, Brant Bobby, Frode F., Jaqueline Vanek, Mert Gülsoy,
10
PowerShell Ranadip Dutta, xvorsx
12 Codificar / VertigoRay
[Link] 224
Decodificar URL
Comportamiento de
Bert Levrau, camilohe, Eris, jumbo, Ranadip Dutta, Thomas
13 retorno en
Gerot
PowerShell
Comunicación TCP
14 autosvet, RamenChef, Richard
con PowerShell
Configuración del
16 autosvet, CmdrTchort, Frode F., RamenChef
estado deseado
Conjuntos de
17 Bert Levrau, Poorkenny
parámetros
consultas de
18 Venkatakrishnan
powershell sql
Convenciones de
19 niksofteng
nombres
Creación de
20 recursos basados en Trevor Sullivan
clases DSC
Cumplimiento de
21 requisitos previos de autosvet, Frode F., jumbo, RamenChef
script
Ejecutando
22 RamenChef, W1M0R
ejecutables
Expresiones
24 Frode F.
regulares
Flujos de trabajo de
26 Trevor Sullivan
PowerShell
[Link] 225
28 Gestión de paquetes TravisEz13
Incrustar código
31 gestionado (C # | ajb101
VB)
Instrumentos de
32 Frode F., restless1987, void
cuerda
Línea de comandos
35 Frode F.
de [Link]
Manejo de secretos
39 4444, briantist, Ranadip Dutta, TravisEz13
y credenciales
Módulo
40 Lachie White
ActiveDirectory
Módulo de
42 Raziel
SharePoint
Módulo de tareas
43 Sam Martin
programadas
Módulos, Scripts y
46 Frode F., Ranadip Dutta, Xalorous
Funciones.
48 Operadores TravisEz13
[Link] 226
Especiales
Parámetros
49 autosvet, jumbo, RamenChef
comunes
Parámetros
50 dinámicos de Poorkenny
PowerShell
Perfiles de
51 Frode F., Kolob Canyon
Powershell
PowerShell
"Streams";
Depuración,
52 DarkLite1, Dave Anderson, megamorf
detallado,
advertencia, error,
salida e información
Propiedades
54 Prageeth Saravanan
calculadas
PSScriptAnalyzer -
55 Analizador de scripts Mark Wragg, mattnicola
de PowerShell
Reconocimiento de
56 Amazon Web Trevor Sullivan
Services (AWS)
Seguridad y
58 YChi Lu
criptografía
Servicio de
almacenamiento
59 simple de Amazon Trevor Sullivan
Web Services (AWS)
(S3)
Set básico de
60 Euro Micelli, Ranadip Dutta, TravisEz13
operaciones
[Link] 227
Trabajando con la
Alban, Atsch, Clijsters, Deptor, James Ruskin, Keith, oɔɯǝɹ,
62 tubería de
Sam Martin
PowerShell
Trabajando con
63 Chris N, djwork, Mathieu Buisson, megamorf
objetos
Trabajos de fondo de
64 Clijsters, mattnicola, Ranadip Dutta, Richard, TravisEz13
PowerShell
Usando clases
65 Austin T French, briantist, motcke, Ranadip Dutta, Xenophane
estáticas existentes
Usando la barra de
66 Clijsters, jumbo, Ranadip Dutta
progreso
Usando
67 Brant Bobby, Charlie Joynt, Schwarzie2478
ShouldProcess
Variables
70 Roman
automáticas - parte 2
Variables
73 Trevor Sullivan
incorporadas
[Link] 228