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?

jchap1590
quelle

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
Micky Balladelli
quelle
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