Public/RegisteredIp/Add-PanRegisteredIp.ps1

function Add-PanRegisteredIp {
   <#
   .SYNOPSIS
   Register PAN-OS registered-ip(s) with tag(s).
   .DESCRIPTION
   Register PAN-OS registered-ip(s) with tag(s).
   Register with -Ip and -Tag Strings or using a -PanRegisteredIp object (from New-PanRegisteredIp).
   If multiple -Device are passed (via array), the registered-ip and tagging is applied to every device.
   If multiple -Ip and -Tag are passed (via arrays), every -Ip is tagged with every -Tag.
   If multiple -RegisteredIp are passed (via array), each -RegisteredIp represents a complete registration action.
   .NOTES
   PAN-OS registered-ip is not added to a Dynamic Address Group (DAG) directly. Instead, a PAN-OS registered-ip is registered with tag(s). Multiple tags can be registered to a single registered-ip.
   The tag(s) against which a registered-ip can be registered can be defined in Objects > Tags OR arbitrary string values that do not exist in Objects > Tags.
   DAG match criteria is based on tag(s). After registering a registered-ip with tag(s), PAN-OS then dynamically computes to which DAG(s) the registered-ip is added.
   .INPUTS
   PanDevice[]
      You can pipe a PanDevice to this cmdlet
   .OUTPUTS
   PanResponse
   .EXAMPLE
   PS. Add-PanRegisteredIp -Device $Device -Ip "1.1.1.1" -Tag "MyTag"
   .EXAMPLE
   PS> Add-PanRegisteredIp -Device $Device -Ip "1.1.1.1","2.2.2.2" -Tag "HerTag","HisTag"
   "HerTag" and "HisTag" are both applied to both 1.1.1.1 and 2.2.2.2 registered-ip's.
   .EXAMPLE
   PS> Add-PanRegisteredIp -Device $Device -RegisteredIp $(New-PanRegisteredIp -Ip "1.1.1.1" -Tag "HerTag","HisTag")
   "HerTag" and "HisTag" are both applied to 1.1.1.1 registered-ip.
   #>

   [CmdletBinding()]
   param(
      [parameter(
         Mandatory=$true,
         ValueFromPipeline=$true,
         HelpMessage='PanDevice against which IP registration and tagging will take place')]
      [PanDevice[]] $Device,
      [parameter(
         Mandatory=$true,
         Position=0,
         ParameterSetName='RegisterWithStrings',
         HelpMessage='IP address to register')]
      [String[]] $Ip,
      [parameter(
         Mandatory=$true,
         Position=1,
         ParameterSetName='RegisterWithStrings',
         HelpMessage='Tag(s) to apply to IP address')]
      [String[]] $Tag,
      [parameter(
         Mandatory=$true,
         Position=0,
         ParameterSetName='RegisterWithPanRegisteredIp',
         HelpMessage='PanRegisteredIp object to apply')]
      [PanRegisteredIp[]] $RegisteredIp
   )

   Begin {
      # Propagate -Debug and -Verbose to this module function, https://tinyurl.com/y5dcbb34
      if($PSBoundParameters.Debug) { $DebugPreference = 'Continue' }
      if($PSBoundParameters.Verbose) { $VerbosePreference = 'Continue' }
      # Announce
      Write-Debug ($MyInvocation.MyCommand.Name + ':')
   }

   Process {
      foreach($DeviceCur in $Device) {
         # Seed a herestring with XML-API "uid-message" beginning elements. Rebuild for every new device iteration.
         $CmdCur = @'
<uid-message>
 <version>2.0</version>
 <type>update</type>
 <payload>
  <register>
 
'@

         Write-Debug ($MyInvocation.MyCommand.Name + ': Device: ' + $DeviceCur.Name)

         if($PSCmdlet.ParameterSetName -eq 'RegisterWithStrings') {
            foreach($IpCur in $Ip) {
               Write-Debug ($MyInvocation.MyCommand.Name + ": registered-ip: $IpCur")
               $CmdCur += " <entry ip=`"$IpCur`">`n"
               $CmdCur += " <tag>`n"

               foreach($TagCur in $Tag) {
                  Write-Debug ($MyInvocation.MyCommand.Name + ": tag: $TagCur")
                  $CmdCur += " <member>$TagCur</member>`n"
               }

               $CmdCur += " </tag>`n"
               $CmdCur += " </entry>`n"
            }
         }
         elseif($PSCmdlet.ParameterSetName -eq 'RegisterWithPanRegisteredIp') {
            foreach($RegisteredIpCur in $RegisteredIp) {
               Write-Debug ($MyInvocation.MyCommand.Name + ": registered-ip: $($RegisteredIpCur.Ip)")
               $CmdCur += " <entry ip=`"$($RegisteredIpCur.Ip)`">`n"
               $CmdCur += " <tag>`n"

               foreach($RegisteredIpCurTagCur in $RegisteredIpCur.Tag) {
                  Write-Debug ($MyInvocation.MyCommand.Name + ": tag: $RegisteredIpCurTagCur")
                  $CmdCur += " <member>$RegisteredIpCurTagCur</member>`n"
               }

               $CmdCur += " </tag>`n"
               $CmdCur += " </entry>`n"
            }
         }
         # Complete the XML-API "uid-message" ending elements.
         $CmdCur += @'
  </register>
 </payload>
</uid-message>
 
'@

         Write-Debug ($MyInvocation.MyCommand.Name + ': Device: ' + $Device.Name)
         Write-Debug ($MyInvocation.MyCommand.Name + ': Prepared uid-message: ' + $CmdCur)
         $PanResponse = Invoke-PanXApi -Device $DeviceCur -Uid -Cmd $CmdCur
         Write-Debug ($MyInvocation.MyCommand.Name + ': PanResponseStatus: ' + $PanResponse.Status)
         Write-Debug ($MyInvocation.MyCommand.Name + ': PanResponseMsg: ' + $PanResponse.Message)
      } # foreach Device
   } # Process block

   End {
   } # End block
} # Function