about_Script_Blocks
Descripción breve
Define qué es un bloque de script y explica cómo usar bloques de script en el lenguaje de programación de PowerShell.
Descripción larga
En el lenguaje de programación de PowerShell, un bloque de script es una colección de instrucciones o expresiones que se pueden usar como una sola unidad. La colección de instrucciones se puede incluir entre llaves ({}
), definidas como una función o guardadas en un archivo de script. Un bloque de script puede devolver valores y aceptar parámetros y argumentos.
Sintácticamente, un bloque de script es una lista de instrucciones entre llaves, como se muestra en la sintaxis siguiente:
{<statement list>}
Un bloque de script devuelve la salida de todos los comandos del bloque de script, ya sea como un único objeto o como una matriz.
También puede especificar un valor devuelto mediante la return
palabra clave . La return
palabra clave no afecta ni suprime otra salida devuelta desde el bloque de script. Sin embargo, la return
palabra clave sale del bloque de script en esa línea. Para obtener más información, consulte about_Return.
Al igual que las funciones, un bloque de script puede incluir parámetros. Use la palabra clave Param para asignar parámetros con nombre, como se muestra en la sintaxis siguiente:
{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}
Nota:
En un bloque de script, a diferencia de una función, no se pueden especificar parámetros fuera de las llaves.
Al igual que las funciones, los bloques de script pueden incluir las dynamicparam
palabras clave , begin
, process
y end
. Para obtener más información, consulte about_Functions y about_Functions_Advanced.
Uso de bloques de script
Un bloque de script es una instancia de un tipo System.Management.Automation.ScriptBlock
de Microsoft .NET Framework. Los comandos pueden tener valores de parámetros de bloque de script. Por ejemplo, el Invoke-Command
cmdlet tiene un ScriptBlock
parámetro que toma un valor de bloque de script, como se muestra en este ejemplo:
Invoke-Command -ScriptBlock { Get-Process }
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
999 28 39100 45020 262 15.88 1844 communicator
721 28 32696 36536 222 20.84 4028 explorer
...
Invoke-Command
también puede ejecutar bloques de script que tengan bloques de parámetros.
Los parámetros se asignan mediante la posición mediante el parámetro ArgumentList .
Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second
El bloque de script del ejemplo anterior usa la param
palabra clave para crear parámetros $p1
y $p2
. La cadena "First" está enlazada al primer parámetro ($p1
) y "Second" está enlazado a ($p2
).
Para obtener más información sobre el comportamiento de ArgumentList, vea about_Splatting.
Puede usar variables para almacenar y ejecutar bloques de script. En el ejemplo siguiente se almacena un bloque de script en una variable y se pasa a Invoke-Command
.
$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status Name DisplayName
------ ---- -----------
Running BITS Background Intelligent Transfer Ser...
El operador de llamada es otra manera de ejecutar bloques de script almacenados en una variable.
Al igual que Invoke-Command
, el operador de llamada ejecuta el bloque de script en un ámbito secundario. El operador de llamada puede facilitar el uso de parámetros con los bloques de script.
$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First
Puede almacenar la salida de los bloques de script en una variable mediante la asignación.
PS> $a = { 1 + 1}
PS> $b = &$a
PS> $b
2
PS> $a = { 1 + 1}
PS> $b = Invoke-Command $a
PS> $b
2
Para obtener más información sobre el operador de llamada, consulte about_Operators.
Uso de bloques de script de enlace retrasado con parámetros
Un parámetro con tipo que acepta la entrada de canalización permite el uso de bloques de script de enlace retrasado en el parámetro . Puede usar bloques de script de enlace retrasado como abreviatura para definir parámetros para un cmdlet canalización antes de ejecutarlo.
Dentro del bloque de script de enlace retrasado, puede hacer referencia al canalización en el objeto mediante la variable $_
de canalización .
# Both examples rename config.log to old_config.log
# Without delay-binding
dir config.log | ForEach-Object -Process {
Rename-Item -Path $_ -NewName "old_$($_.Name)"
}
# With delay-binding
dir config.log | Rename-Item -NewName { "old_$($_.Name)" }
En cmdlets más complejos, los bloques de script de enlace retrasado permiten la reutilización de un canalización en el objeto para rellenar otros parámetros.
Notas sobre los bloques de script de enlace retrasado como parámetros:
Debe especificar explícitamente los nombres de parámetro que use con bloques de script de enlace retrasado.
El parámetro no debe estar sin tipo y el tipo del parámetro no puede ser
[scriptblock]
ni[object]
.Recibirá un error si usa un bloque de script de enlace retrasado sin proporcionar entrada de canalización.
Rename-Item -NewName {$_.Name + ".old"}
Rename-Item : Cannot evaluate parameter 'NewName' because its argument is specified as a script block and there is no input. A script block cannot be evaluated without input. At line:1 char:23 + Rename-Item -NewName {$_.Name + ".old"} + ~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [Rename-Item], ParameterBindingException + FullyQualifiedErrorId : ScriptBlockArgumentNoInput, Microsoft.PowerShell.Commands.RenameItemCommand