Acerca de los bloques de scriptAbout Script Blocks

Descripción breveShort description

Define lo que es un bloque de script y explica cómo usar los bloques de scripts en el lenguaje de programación de PowerShell.Defines what a script block is and explains how to use script blocks in the PowerShell programming language.

Descripción largaLong description

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.In the PowerShell programming language, a script block is a collection of statements or expressions that can be used as a single unit. Un bloque de script puede aceptar argumentos y valores devueltos.A script block can accept arguments and return values.

Sintácticamente, un bloque de script es una lista de instrucciones entre llaves, tal como se muestra en la sintaxis siguiente:Syntactically, a script block is a statement list in braces, as shown in the following syntax:

{<statement list>}

Un bloque de script devuelve la salida de todos los comandos del bloque de script, ya sea un solo objeto o una matriz.A script block returns the output of all the commands in the script block, either as a single object or as an array.

También puede especificar un valor devuelto mediante la return palabra clave.You can also specify a return value using the return keyword. La return palabra clave no afecta ni elimina otra salida devuelta por el bloque de script.The return keyword does not affect or suppress other output returned from your script block. Sin embargo, la return palabra clave sale del bloque de script en esa línea.However, the return keyword exits the script block at that line. Para obtener más información, vea about_Return.For more information, see about_Return.

Al igual que las funciones, un bloque de script puede incluir parámetros.Like functions, a script block can include parameters. Use la palabra clave param para asignar parámetros con nombre, tal y como se muestra en la sintaxis siguiente:Use the Param keyword to assign named parameters, as shown in the following syntax:

{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}

Nota

En un bloque de scripts, a diferencia de una función, no se pueden especificar parámetros fuera de las llaves.In a script block, unlike a function, you cannot specify parameters outside the braces.

Al igual que las funciones, los bloques de scripts pueden incluir las DynamicParam Begin Process palabras clave,, y End .Like functions, script blocks can include the DynamicParam, Begin, Process, and End keywords. Para obtener más información, vea about_Functions y about_Functions_Advanced.For more information, see about_Functions and about_Functions_Advanced.

Uso de bloques de scriptsUsing Script Blocks

Un bloque de script es una instancia de un tipo de marco de Microsoft .NET System.Management.Automation.ScriptBlock .A script block is an instance of a Microsoft .NET Framework type System.Management.Automation.ScriptBlock. Los comandos pueden tener valores de parámetro de bloque de script.Commands can have script block parameter values. Por ejemplo, el Invoke-Command cmdlet tiene un ScriptBlock parámetro que toma un valor de bloque de script, tal como se muestra en este ejemplo:For example, the Invoke-Command cmdlet has a ScriptBlock parameter that takes a script block value, as shown in this example:

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 scripts que tengan bloques de parámetros.Invoke-Command can also execute script blocks that have parameter blocks. Los parámetros se asignan por posición mediante el parámetro ArgumentList .Parameters are assigned by position using the ArgumentList parameter.

Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second

El bloque de script del ejemplo anterior utiliza la param palabra clave para crear parámetros $p1 y $p2 .The script block in the preceding example uses the param keyword to create a parameters $p1 and $p2. La cadena "First" se enlaza al primer parámetro ( $p1 ) y "Second" se enlaza a ( $p2 ).The string "First" is bound to the first parameter ($p1) and "Second" is bound to ($p2).

Para obtener más información sobre el comportamiento de ArgumentList , vea about_Splatting.For more information about the behavior of ArgumentList , see about_Splatting.

Puede usar variables para almacenar y ejecutar bloques de scripts.You can use variables to store and execute script blocks. En el ejemplo siguiente se almacena un bloque de script en una variable y se pasa a Invoke-Command .The example below stores a script block in a variable and passes it to 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.The call operator is another way to execute script blocks stored in a variable. Al igual Invoke-Command que, el operador de llamada ejecuta el bloque de script en un ámbito secundario.Like Invoke-Command, the call operator executes the script block in a child scope. El operador de llamada puede facilitar el uso de parámetros con los bloques de scripts.The call operator can make it easier for you to use parameters with your script blocks.

$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 scripts en una variable mediante la asignación.You can store the output from your script blocks in a variable using assignment.

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, vea about_Operators.For more information about the call operator, see about_Operators.

Usar bloques de scripts de enlace retrasado con parámetrosUsing delay-bind script blocks with parameters

Un parámetro con tipo que acepta la entrada de canalización ( by Value ) o ( by PropertyName ) permite el uso de bloques de scripts de enlace retrasado en el parámetro.A typed parameter that accepts pipeline input (by Value) or (by PropertyName) enables use of delay-bind script blocks on the parameter. Dentro del bloque de script Delay-BIND , puede hacer referencia al objeto canalizado mediante la variable de canalización $_ .Within the delay-bind script block, you can reference the piped in object using the pipeline variable $_.

# Renames config.log to old_config.log
dir config.log | Rename-Item -NewName {"old_" + $_.Name}

En los cmdlets más complejos, los bloques de scripts de retrasos de enlace permiten la reutilización de un objeto canalizado para rellenar otros parámetros.In more complex cmdlets, delay-bind script blocks allow the reuse of one piped in object to populate other parameters.

Notas sobre los bloques de scripts de enlace retrasado como parámetros:Notes on delay-bind script blocks as parameters:

  • Debe especificar explícitamente cualquier nombre de parámetro que se use con bloques de scripts de enlace retrasado .You must explicitly specify any parameter names you use with delay-bind script blocks.

  • El parámetro no debe ser sin tipo y el tipo del parámetro no puede ser [scriptblock] o [object] .The parameter must not be untyped, and the parameter's type cannot be [scriptblock] or [object].

  • Recibirá un error si usa un bloque de script de enlace retrasado sin proporcionar la entrada de canalización.You receive an error if you use a delay-bind script block without providing pipeline input.

    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énSee Also

about_Functionsabout_Functions

about_Functions_Advancedabout_Functions_Advanced

about_Operatorsabout_Operators