At the time of this blog post there is no parameter built into the OSIsoft library of PowerShell commands to search for elements generated using a specific template. If your element tree is complex with varied levels and parent elements throughout your element structure you may need a way to quickly locate and identify the elements generated using a specific template. Here is a code sample that worked for me:

 

<#region Descriptor:

    This script connects to an af server (pi system), loops through elements, then outputs

    a list of AF elements generated using a specific element template, and then disconnects.

#>

 

# CONFIGURATION VARIABLES:

$afSrvNAME = "YOUR_AF_SERVER_NAME_HERE"

$afDBName = "YOUR_AF_DATABASE_NAME_HERE"

$afElemTemplateName = "YOUR_AF_ELEMENT_TEMPLATE_NAME_HERE"

 

# Connect to Target AF Server:

     $myAFServer = Get-AFServer -Name $afSrvNAME                          #~ Explicitly identify target AF Server

# OPTIONAL: $afConn = Get-AFServer -Default                               #~ Connects to the Default AF Server

     $afConn = Connect-AFServer -AFServer $myAFServer

 

# Generate Global Variable for Target AF Database (later in code known more simply as '$afDatabase'):

    $global:afDatabase = Get-AFDatabase -Name $afDBName -AFServer $myAFServer

 

# Generate Global Variable for Target Element Template:

    $global:afElementTemplate = Get-AFElementTemplate -Name $afElemTemplateName -AFDatabase $afDatabase

    $global:targetTemplate = $afElementTemplate.Name

 

# Loop Through All The Elements To Locate Those Generated Using The Target Template:

    $afElements = Get-AFElement -AFDatabase $afDatabase  #~ This loops through the parent elements

    foreach ($afElement in $afElements){

        #~ Pass This Element To the Primary Function Below:

        ChildElementsQuest01($afElement)

    }

<#

    That's it! - - The rest of the code is the pair of repeating functions to find elements that have children

    until you reach the elements that match your target template.

#>

 

# Primary Function To Check for Elements Generated Using The Target Template:

    function ChildElementsQuest01 ($testElement){

        $thisChildElements = $testElement.Elements

        foreach ($thisChildElement in $thisChildElements){

            # Test if this element has children AND the template is not our target template:

            if($thisChildElement.Elements.Count -gt 0 -and $thisChildElement.Template.Name -ne $targetTemplate) {

                # this element has children and it was not generated using the target template,

                # so we pass it to the secondary check function for more processing

                ChildElementsQuest02($thisChildElement)

            }

            # Otherwise there are no children and still need to check if the element was generated using the target template:

            else {

                if($thisChildElement.Template.Name -eq $targetTemplate){

                    <# ---  Y O U R  C O D E  S T A R T S    H E R E    --- #>

 

                    Write-Host $thisChildElement.Name "was generated using the" $thisChildElement.Template.Name "element template."

 

                    <# ---  Y O U R  C O D E  E N D S    H E R E    --- #>

                }

            }

        }

    } 

 

# Secondary Function to Cycle Through Child Elements of Element Sent Here From The Primary Function:

    # elements only get passed here if they have children AND were not generated using the target template.

    # The idea is to process all of its child elements using the the primary function (ChildElementsQuest01 above)

    function ChildElementsQuest02 ($testElement){

        $thisChildElements = $testElement.Elements

        foreach($thisChildElement in $thisChildElements){

            ChildElementsQuest01($thisChildElement)

        }

    }

 

# The last step is to disconnect from the AF Server:

    Disconnect-AFServer -AFServer $myAFServer