Skip to main content

Where to Create a Constant in an Advanced Function?


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

Popular posts from this blog

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.

How to run GPResult on a remote client with PowerShell

In the past, to run the GPResult command, you would need to either physically visit this client, have the user do it, or use and RDP connection.  In all cases, this will disrupt the user.  First, you need PowerShell remoting enabled on the target machine.  You can do this via Group Policy . Open PowerShell and type this command. Invoke-Command –ScriptBlock {GPResult /r} –ComputerName <ComputerName> Replace <ComputerName> with the name of the target.  Remember, the target needs to be online and accessible to you.

Error icon when creating a GPO Preference drive map

You may not have an error at all.  Take a look at the drive mapping below. The red triangle is what threw us off.  It is not an error.  It is simply a color representation of the Replace option of the Action field in the properties of the drive mappings. Create action This give you a green triangle. The Create action creates a new mapped drive for users. Replace Action The Replace action gives you a red triangle.  This action will delete and recreate mapped drives for users. The net result of the Replace action is to overwrite all existing settings associated with the mapped drive. If the drive mapping does not exist, then the Replace action creates a new drive mapping. Update Action The Update action will have a yellow triangle. Update will modify settings of an existing mapped drive for users. This action differs from Replace in that it only updates settings defined within the preference item. All other settings remain as configured on the ma...