robocopy / mir dupliziert keine Ordnerstruktur


0

Ich verwende das folgende Skript, um alles vor dem 1. Januar 2013 zu archivieren:

foreach  ($i in Get-ChildItem "O:\Projects” -Force -Recurse)
{
    if ($i.LastWriteTime -gt ($(Get-Date).AddDays(-649)))
    {
          robocopy $i.FullName "A:\Operations\Projects" /Z /S /MOVE /MIR
    }
}

Das Problem ist, dass das Skript nicht den genauen Verzeichnisbaum kopiert. Es wird nur der Ordner mit einer entsprechenden Datei in das Stammverzeichnis des Zielverzeichnisses kopiert.

Als Beispiel würde dies unsere Ordnerstruktur darstellen:

  • Projekt A
    • Zitat
      • QuoteA.pdf (letzte Änderung 6/2011)
    • Ausschließen
      • CloseoutA.pdf (letzte Änderung 11/2011)
  • Projekt B
    • Zitat
      • QuoteB.pdf (letzte Änderung 10/2012)
    • Ausschließen
      • CloseoutB.pdf (letzte Änderung 4/2013)

Mein obiges Skript würde den folgenden Zielordner ergeben:

  • Zitat
    • QuoteA.pdf
    • QuoteB.pdf
  • Ausschließen
    • CloseoutA.pdf

Das obige Beispiel ist sehr einfach. Einige der Dateien sind 8 oder 9 Ordner tief. Es gibt fast 30.000 Ordner im Quellverzeichnis. Ich benötige den vollständigen Pfad der entsprechenden Datei, um beim Verschieben intakt zu bleiben. Wie kann ich das erreichen?

Antworten:


0

Bearbeiten von Kommentaren unten:

Sie könnten versuchen, Robocopy entscheiden zu lassen, ob eine Datei in einem Baum verschoben werden muss, und die Verwendung von Get-Childitem vermeiden:

robocopy "O:\Projects" "A:\Operations\Projects" /Z /S /MOVE /MIR /MINAGE:649

Ich habe $ i.FullName verwendet, aber $ i.DirectoryName hat trotzdem nicht geholfen. Es wurden nur alle Dateien im Stammverzeichnis des Zielverzeichnisses abgelegt, ohne Unterordner. Es heißt aus irgendeinem Grund "ERROR 2 (0x00000002) Accessing Source Directory". Die Berechtigungen für "Jeder" auf dem gesamten Ziellaufwerk sind auf "Voll" gesetzt. Ich bin mir nicht sicher, warum sonst beim Zugriff auf das Quellverzeichnis ein Fehler auftreten würde. Außerdem bin ich ein wenig verwirrt, wenn ich mit -gt oder -lt Objekte auswählen soll, die älter als die angegebene Zeit sind.
Jchap1590

In Bezug auf das Datum, das Sie erwähnt haben ($ i.LastWriteTime -gt ($ (Get-Date) .AddDays (-649)), bedeutet dies, dass $ i.LastWriteTime aktueller als vor 649 Tagen ist. Wenn Sie älter sein möchten als, verwenden Sie - lt.
Micky Balladelli

Ich denke, dass Get-ChildItem Robocopy verwirrt. Sie sehen, Sie erhalten zuerst einen Verzeichnisbaum, dann fordern Sie Robocopy auf, / MIR und / MOVE für diesen Baum zu erstellen. Dann greift Foreach auf das nächste Element im Baum zu, das jedoch bereits durch die vorherige Iteration verschoben wurde.
Micky Balladelli

Ich werde den Robocopy-Befehl versuchen, ohne ihn über Powershell auszuführen, aber ich dachte, ich hätte gelesen, dass es keine Möglichkeit gibt, Robocopy an und für sich rekursiv zu machen, daher der Grund für die Ausführung über Powershell.
Jchap1590

der befehl scheint zu tun was ich will! EDIT: egal, ich habe es verstanden. vielen Dank!
Jchap1590
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.