A ScriptBlock is a collection of statements surrounded with { curly parenthesis }
a scriptblock can be saved in a variable and executed using the & call operator
Example
$alert = { "Hello World" }
& $alert
& $alert
Notice that to execute a ScriptBlock you must use the call operator “&”, just defining the ScriptBlock is not enough.
A script block can be written to include multiple lines of code:
PS C:\> $mysb = {$a = 123
Echo $a
}
PS C:\> & $mysbHowever in many of the places where you will want to use a scriptblock, it is more convenient to keep everything on a single line, so use the ';' continuation character:
PS C:\> $mysb = {$b = 456 ; Echo $b }
PS C:\> & $mysbFor very long blocks of code, you should use either a function or a script rather then cramming too much into a single line.
Just like a function, we can add a param block to make the scriptblock more flexible:
$alert = { param ($message) "$message" }
& $alert -Message "Hello World"When passing a variable to a scriptblock it is important to consider the variable scope.
- Each time the scriptblock is run; it will dynamically read the current value of the variable.
- When a scriptblock is run using the “&” (call) operator, updates to a variable are not reflected in the parent scope.
- When a scriptblock is run using the “.” (dot) operator, updates to a variable apply to the current scope.
GetNewClosure can be used to reverse the above behaviour (1.) so that a variable will only be read when the scriptblock is initialised. This makes the scriptblock self-contained or closed:
PS C:\> $name = "Hello world" PS C:\> $ScriptBlock = {$name} PS C:\> $closedScriptBlock = $ScriptBlock.GetNewClosure() PS C:\> & $scriptblock Hello world PS C:\> & $closedScriptBlock Hello worldNow if we change the variable and re-run the scriptblock, the closed version does not pick up the change:
PS C:\> $name = "New Green shoes" PS C:\> & $scriptblock New Green shoes PS C:\> & $closedScriptBlock Hello world
Begin {}, Process {} and End {} blocks can be added to a scriptblock, just like a function
For anything more complex, you can take the scriptblock one step further and turn it into a Function or Filter.
“I…confess to a strong bias against the fashion for reusable code. To me, 're-editable code' is much, much better…” ~ Donald Knuth
Related PowerShell Cmdlets:
Set-Variable - Set a variable and its value.
Operators - Format strings and arrays @( ) -f [ ] $( ) :: &
Functions - Write a named block of code.
CMD Shell: Batch file macros