This week I am delivering a PowerShell Toolmaking class in
Phoenix. Right now we are studying
advanced functions. While talking about
the BEGIN, PROCESS, and END block, one of my future PowerShell Rock Stars gave
me a great idea. Where should a constant
be created in an advanced function>
A constant is, by definition, something that cannot be
changed after it is created. So, here is
how you create one.
$CONST = New-Variable -Name Constant1 -Value 10 -Option Constant
You cannot modify this constant with Set-Variable -Force and
you cannot remove this constant with Remove-Variable -Force. That is the idea. You need to close your current scope of
memory to get rid of it.
The BEGIN, PROCESS, and END blocks of an advanced function
have unique capabilities.
The BEGIN block is executed when your cmdlet receives the
first object in the pipeline, but before the PROCESS block is executed. It is only ran once to allow you the opportunity
to do any set up operations that the cmdlet will need to do before processing
objects.
The PROCESS block is executed once for each object that is
piped into your cmdlet.
The END block is executed only once when there are no more objects
left in the pipeline. This allows you to
do any cleanup operations after all the work is done.
So the question is, “Do you create a constant in the BEGIN,
PROCESS, or END blocks?” Well, we are
going to just not even try the END block because your constant will not be
available to any other part of your code.
Let’s try building the constant in the PROCESS block.
Function Test1 {
[CmdletBinding()]
Param (
[parameter(ValueFromPipeline=$true)]
$Param1
)
BEGIN {}
PROCESS {$CONST = New-Variable -Name Constant1 -Value 10 -Option Constant}
END {}
}
10, 20, 30 | Test1
At this point you will receive an error because you are
attempting to create multiple constants of the same name in the same scope of
memory. The first iteration worked, but
all others failed. Now for the BEGIN
block
Function Test2 {
[CmdletBinding()]
Param (
[parameter(ValueFromPipeline=$true)]
$Param1
)
BEGIN {$CONST = New-Variable -Name Constant1 -Value 10 -Option Constant}
PROCESS {}
END {}
}
10, 20, 30 | Test2
Now it worked. The
BEGIN block is executed only once. The
constant is placed in the cmdlets scope of memory only once and it is available
to the rest of the code.
Comments