Forum Discussion

adrian138's avatar
adrian138
Copper Contributor
Jul 20, 2023

Windows Powershell Copy-item only new Files

Hi, 

 

My Powershellscript copies SQL Dump Files from a Domainjoined SQL Server to a Workgroup Backupserver. This works fine. 

 

The Script now copies always all Backupfiles from the SQL Server to the Backup Server. I want only the Delta (new Backup Files) to be copied to the Backupserver. How can i do this?

 

Thanks alot, 

 

 

 

 

#(get-credential).Password | ConvertFrom-SecureString -key (get-content C:\scripts\aes.key) | set-content "c:\scripts\password.txt"
$password = Get-Content C:\scripts\password.txt | ConvertTo-SecureString -Key (Get-Content c:\scripts\aes.key)
$cred = New-Object System.Management.Automation.PSCredential("192.168.24.5\admin", $password) 
$session = new-pssession -computername 192.168.24.5 -credential $cred
$Source = "E:\Backup\"  
$items = Get-ChildItem $Source -Force
$Destination="D:\remotebackup\SQLDumps\srvsql05\"
ForEach ($item in $items)
{
$destinationFile = $Destination+$item.FullName
if (-not (test-path $destinationFile))
{
Copy-Item -Path $item.FullName -Destination $Destination -ToSession $Session -Recurse -Force -Confirm:$false
}
}

 

 

 

 

 

 

 

1 Reply

  • Hi adrian138 

     

    One way that you could achieve this would be to use a log file that keeps track of a "last runtime" of your delta sync copy and then copying only files that have a creation/last modified time which is greater than the value written to your log file

     

    Here's a sample PowerShell script to get you started:

    $sourceDirectory = "C:\Path\to\source\directory"
    $destinationDirectory = "C:\Path\to\destination\directory"
    $logFile = "C:\Path\to\log\file.txt"
    
    # Check if the log file exists and retrieve last run time
    if (Test-Path -Path $logFile) {
        $lastRunTime = Get-Date (Get-Content $logFile)
    }
    else {
        $lastRunTime = [DateTime]::MinValue
    }
    
    # Get files from the source directory
    $files = Get-ChildItem $sourceDirectory -File
    
    # Filter only files that have been created or modified since the last run time
    $newFiles = $files | Where-Object { $_.CreationTime -gt $lastRunTime -or $_.LastWriteTime -gt $lastRunTime }
    
    # Copy new files to the destination directory
    $newFiles | ForEach-Object {
        $destinationPath = Join-Path -Path $destinationDirectory -ChildPath $_.Name
        Copy-Item -Path $_.FullName -Destination $destinationPath
    }
    
    # Update the last run time in the log file
    (Get-Date).ToString("yyyy-MM-dd HH:mm:ss") | Out-File -FilePath $logFile

     

Resources