seN
seN

Reputation: 1095

Powershell robocopy /mir Copy Files before /mir deletes

I wrote a Powershell script which does following Steps.

  1. It RoboCopies Files from a Server to an External Hard drive (incremental backup)
  2. Next time it is supposed to check if any files were deleted on the Server, if so move those Files from the Backup Folder to a Folder Called _DeletedFiles in the Backup Hard drive.
  3. RoboCopy with /MIR (which will delete the files which are deleted on the server also on the backup, and that's okay because I saved them already on the _DeletedFiles Folder)

Point of this _DeletedFiles Folder is that even if someone deleted a file we want to keep it somewhere for at least 60 Days.

Now this script is a little bit more complex including writing to log file, testing paths, and first run if statement etc.

All seems to work except the step where I want to copy the Files which are deleted on the Server from the BackUp to a new Folder.

This step looks similar to this:

$testfolder = Test-Path "$UsbDisk\$backupFolder"  

        # If a Backup folder already exist then Compare files and see if any changes have been made
        if ( $testfolder -eq $true ) { #IF_2  

                    # Copy deleted files to BackUp Folder
                    MyLog "Check for Deleted Files on E:\" 0                  
                    $source = "E:\"
                    $sourcelist = Get-ChildItem $source -Recurse
                    $destination = "$UsbDisk\$backupFolder\Data_01\_DeletedFiles"

                    foreach ($file in $sourcelist){
                    $result = test-path -path "E:\*" -include $file
                        if ($result -like "False"){
                            Copy-Item $file -Destination "$destination"
                        }

                    }

                    # Start Synchronizing E:\
                    MyLog "Start Synchronizing E:\" 0
                    Robocopy "E:\" "$UsbDisk\$backupFolder\Data_01" /mir /r:2 /w:3 /M /XD VM_*

                    MyLog "E:\ is up to Date" 0

                    # Copy deleted files to BackUp Folder
                    MyLog "Check for Deleted Files on F:\" 0    
                    $source = "F:\"
                    $sourcelist = Get-ChildItem $source -Recurse
                    $destination = "$UsbDisk\$backupFolder\Data_02\_DeletedFiles"

                    foreach ($file in $sourcelist){
                    $result = test-path -path "F:\*" -include $file
                        if ($result -like "False"){
                            Copy-Item $file -Destination "$destination"
                            # Then Delete it from the BackUp
                        }

                    }

                    # Start Synchronizing F:\
                    MyLog "Start Synchronizing F:\" 0
                    Robocopy "F:\" "$UsbDisk\$backupFolder\Data_02" /mir /r:2 /w:3 /M /XD VM_*

                    MyLog "F:\ is up to Date" 0

        }

The error I get that files can't be copied because they do not exist at the destination; however, it tries to copy files which shouldn't be copied in the first place.

I wonder if anyone has an idea to solve this more elegant, or how to fix my code snip.

Upvotes: 0

Views: 4849

Answers (1)

Eddy Steenbergen
Eddy Steenbergen

Reputation: 36

I think the problem may be in the test-path commands. I would replace the include $file with include $file.Name. The include parameter expects a string, not an object.

And in the interests of code maintainability I would also replace ($result -like "False") with (-not $result). This is because $result will contain a boolean value ($true or $false), not a string.

Upvotes: 1

Related Questions