2012-09-28 4 views
0

J'ai écrit un script Powershell qui suit les étapes suivantes.Powershell robocopy/mir Copier des fichiers avant/mir supprime

  1. Il RoboCopies fichiers à partir d'un serveur sur un disque dur externe (sauvegarde incrémentielle)
  2. La prochaine fois qu'il est censé vérifier si des fichiers ont été supprimés sur le serveur, le cas échéant déplacer ces fichiers dans le dossier de sauvegarde un dossier appelé _DeletedFiles dans le disque dur de sauvegarde.
  3. RoboCopy avec/MIR (qui supprimera les fichiers qui sont supprimés sur le serveur également sur la sauvegarde, et c'est correct parce que je les ai sauvés déjà sur le dossier _DeletedFiles)

point de ce _DeletedFiles dossier est que Même si quelqu'un a supprimé un fichier, nous voulons le garder quelque part pendant au moins 60 jours.

Maintenant, ce script est un peu plus complexe, y compris l'écriture dans le fichier journal, chemins de test, et la première course instruction if etc.

Tout semble fonctionner, sauf l'étape où je veux copier les fichiers qui sont supprimés sur le serveur à partir du BackUp vers un nouveau dossier.

Cette étape ressemble à ceci:

$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 

     } 

L'erreur que je reçois que les fichiers ne peuvent pas être copiés parce qu'ils n'existent pas à la destination; cependant, il essaie de copier des fichiers qui ne devraient pas être copiés en premier lieu.

Je me demande si quelqu'un a une idée pour résoudre cela plus élégant, ou comment réparer mon code snip.

Répondre

1

Je pense que le problème peut être dans les commandes de chemin de test. Je voudrais remplacer le include $file avec include $file.Name. Le paramètre include attend une chaîne, pas un objet. Et dans l'intérêt de la maintenabilité du code, je remplacerais également ($result -like "False") par (-not $result). C'est parce que $result contiendra une valeur booléenne ($true ou $false), pas une chaîne.

+0

Merci cela m'a rapproché de la solution. Je posterai un code mis à jour demain ou à peu près. – seN

+0

Je vais poser la question plus généralement, jusqu'à présent, c'était la meilleure réponse. – seN

Questions connexes