Scripts/Copy-BPATask.ps1

function Copy-BPATask {
    <#
        .SYNOPSIS
            Copies an AutoMate BPA task.
 
        .DESCRIPTION
            Copy-BPATask can copy a task object within, or between servers.
 
        .PARAMETER InputObject
            The object to copy.
 
        .PARAMETER Name
            The new name to set on the object.
 
        .PARAMETER Folder
            The folder to place the object in.
 
        .PARAMETER BPAServer
            The server to copy the object to.
 
        .INPUTS
            The following BPA object types can be modified by this function:
            Task
 
        .EXAMPLE
            # Copy task "Start Service" from server1 to server2
            Get-BPATask "Start Service" -BPAServer server1 | Copy-BPATask -Folder (Get-BPAFolder TASKS -BPAServer server2) -BPAServer server2
 
        .EXAMPLE
            # Copy task "Start Service" with new name "Restart Service"
            Get-BPATask "Start Service" | Copy-BPATask -Name "Restart Service"
 
        .NOTES
            Author(s): : David Seibel
            Contributor(s) :
            Date Created : 11/09/2016
            Date Modified : 02/08/2018
 
        .LINK
            https://github.com/davidseibel/PoshBPA
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        $InputObject,        

        [ValidateNotNullOrEmpty()]
        [string]$Name,

        [ValidateScript({$_.TypeName -eq "Folder"})]
        $Folder,

        [string]$BPAServer
    )

    BEGIN {
        $currentDate = Get-Date
        $nullDate = Get-Date "12/31/1899 7:00:00 PM"
        if ($BPAServer) {
            $user = Get-BPAUser -BPAServer $BPAServer | Where-Object {$_.Name -ieq ($BPAConnectionInfo | Where-Object {$_.Server -eq $BPAServer}).Credential.UserName}
        }
    }

    PROCESS {
        foreach ($obj in $InputObject) {
            if ($obj.TypeName -eq "Task") {
                $guid = "{$((New-Guid).Guid)}"
                if ($BPAServer) {
                    # Copy from one BPA server to another
                    if ($obj.BPAServer -ne $BPAServer) {
                        if ($Folder) {
                            if ($Folder.BPAServer -ne $BPAServer) {
                                throw "Folder specified exists on $($Folder.BPAServer), the folder must exist on $BPAServer!"
                            }
                        } else {
                            $Folder = Get-BPAFolder -ID $user.TaskFolderID -BPAServer $BPAServer
                        }
                    }
                    $server = $BPAServer
                } else {
                    $user = Get-BPAUser -BPAServer $obj.BPAServer | Where-Object {$_.Name -ieq ($BPAConnectionInfo | Where-Object {$_.Server -eq $obj.BPAServer}).Credential.UserName}
                    $server = $obj.BPAServer
                }

                $copy = Get-BPATask -ID $obj.ID -BPAServer $obj.BPAServer
                $copy.ID          = $guid
                $copy.CreatedBy   = $user.ID
                $copy.CreatedOn   = $currentDate
                $copy.EndedOn     = $nullDate
                $copy.ResultCode  = 0
                $copy.ResultText  = ""
                $copy.ModifiedOn  = $currentDate
                $copy.StartedOn   = $nullDate
                $copy.Version     = 1
                $copy.VersionDate = $currentDate
                if ($Name)   { $copy.Name = $Name }
                if ($Folder) { $copy.ParentID = $Folder.ID }
                $copy | New-BPAObject -BPAServer $server
                Get-BPATask -ID $guid -BPAServer $server
            } else {
                Write-Error -Message "Unsupported input type '$($obj.TypeName)' encountered!" -TargetObject $obj
            }
        }
    }
}