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 DynamicParampalabras clave , Begin, Processy 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.ScriptBlockde 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
    

Consulte también