lib/core/framework/Copy-ItemSecure.psm1

<#
.SYNOPSIS
   A more secure way to copy items from one location to another including error handling
.DESCRIPTION
   Wrapper for the Copy-Item Cmdlet to more securely copy items with error
   handling to prevent interuptions during actions
.FUNCTIONALITY
   Copies items from a source to a destination location
.EXAMPLE
   PS>Copy-ItemSecure -Path 'C:\users\public\test.txt' -Destination 'C:\users\public\text2.txt';
.EXAMPLE
   PS>Copy-ItemSecure -Path 'C:\users\public\testfolder\' -Destination 'C:\users\public\testfolder2\' -Recurse;
.PARAMETER Path
   The location you wish to copy from. Can either be a file or a directory
.PARAMETER Destination
   The target destination to copy to. Can either be a file or a directory
.PARAMETER Recurse
   Include possible sub-folders
.PARAMETER Force
   Overwrite already existing files/folders
.INPUTS
   System.String
.OUTPUTS
   System.Boolean
.LINK
   https://github.com/Icinga/icinga-powershell-framework
#>

function Copy-ItemSecure()
{
    param(
        [string]$Path,
        [string]$Destination,
        [switch]$Recurse,
        [switch]$Force
    );

    if ((Test-Path $Path) -eq $FALSE) {
        return $FALSE;
    }

    try {
        if ($Recurse -And $Force) {
            Copy-Item -Path $Path -Destination $Destination -Recurse -Force;
        } elseif ($Recurse -And -Not $Force) {
            Copy-Item -Path $Path -Destination $Destination -Recurse;
        } elseif (-Not $Recurse -And $Force) {
            Copy-Item -Path $Path -Destination $Destination -Force;
        } else {
            Copy-Item -Path $Path -Destination $Destination;
        }
        return $TRUE;
    } catch {
        Write-IcingaConsoleError -Message 'Failed to copy items from path "{0}" to "{1}": {2}' -Objects $Path, $Destination, $_.Exception;
    }
    return $FALSE;
}