dispatcher
Goto Top

Dateien kopieren und umbenennen wenn bereits vorhanden

Hallo Zusammen,

ich habe unzählige Ordner inkl. Unterordner, von denen ich nur die Dateien in einen einzigen Ordner kopieren will.
Mit
Get-ChildItem -path "\\srv1\folder1" -include *.txt -recurse | Move-Item -Destination "srv2\folder1"  
funktioniert das auch.
Es kann vorkommen, das einige zu kopierende Dateien den gleichen Namen aufweisen. Wie muss ich das Skript erweitern, das Dateien, die aufgrund bestehender Dateien nicht kopiert werden können, umbenannt werden in bspw. Datei_1.txt.

Content-ID: 3265046815

Url: https://administrator.de/contentid/3265046815

Ausgedruckt am: 24.11.2024 um 05:11 Uhr

TomTomBon
Lösung TomTomBon 06.07.2022 um 08:08:26 Uhr
Goto Top
Moin Moin,

Ich weiß, Ich bin OldSchool.
Aber Ich würde bei sowas ROBOCOPY verwenden.

Das kann sowas hervorragend:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robustes Dateikopieren für Windows
-------------------------------------------------------------------------------

  Gestartet: Mittwoch, 6. Juli 2022 08:07:23
             Syntax :: ROBOCOPY Quelle Ziel [Datei [Datei]...] [Optionen]

             Quelle :: Quellverzeichnis (Laufwerk:\Pfad oder
                       \\Server\Freigabe\Pfad)
               Ziel :: Zielverzeichnis (Laufwerk:\Pfad oder
                       \\Server\Freigabe\Pfad)
              Datei :: Zu kopierende Dateien (Namen/Platzhalter: Standard
                       ist "*.*")  

::
:: Kopieroptionen:
::
                 /S :: Kopiert Unterverzeichnisse, jedoch keine leeren
                       Unterverzeichnisse.
                 /E :: Kopiert Unterverzeichnisse, einschließlich leerer
                       Unterverzeichnisse.
             /LEV:n :: Kopiert nur die obersten Ebenen der
                       Quellverzeichnisstruktur.

                 /Z :: Kopiert Dateien im Neustartmodus.
                 /B :: Kopiert Dateien im Sicherungsmodus.
                /ZB :: Verwendet den Neustartmodus. Im Fall einer
                       Zugriffsverweigerung wird der Sicherungsmodus verwendet.
                 /J :: kopieren mit ungepuffertem E/A (empfohlen für sehr große
                       Dateien).
            /EFSRAW :: Kopiert alle verschlüsselten Dateien im EFS RAW-Modus.

    /COPY:copyflags :: Gibt an, welche Inhalte für Dateien kopiert werden
                       sollen (der Standard ist "/COPY:DAT").  
                       (Kopierflags : D=Daten, A=Attribute, T=Zeitstempel, X=Alternative Datenströme überspringen).
                       (S=Sicherheit=NTFS-ACLs, O=Besitzerinformationen,
                       U=Überwachungsinformationen).


               /SEC :: Kopiert Dateien mit Sicherheitsinformationen
                       (entspricht "/COPY:DATS").  
           /COPYALL :: Kopiert alle Dateiinformationen
                       (entspricht "/COPY:DATSOU").  
            /NOCOPY :: Kopiert keine Dateiinformationen
                       (hilfreich in Verbindung mit "/PURGE").  
            /SECFIX :: Korrigiert die Dateisicherheit in allen Dateien, auch
                       in ausgelassenen Dateien.
            /TIMFIX :: Korrigiert die Uhrzeitangaben für Dateien in allen
                       Dateien, auch in ausgelassenen Dateien.

             /PURGE :: Löscht Zieldateien/-verzeichnisse, die in der Quelle
                       nicht mehr vorhanden sind.
               /MIR :: Spiegelt eine Verzeichnisstruktur
                       (Entspricht "/E" mit "/PURGE").  

               /MOV :: Verschiebt Dateien
                       (löscht Dateien nach dem Kopieren an der Quelle).
              /MOVE :: Verschiebt Dateien UND Verzeichnisse
                       (löscht sie nach dem Kopieren an der Quelle).

     /A+:[RASHCNET] :: Fügt die vorhandenen Attribute den kopierten Dateien
                       hinzu.
     /A-:[RASHCNET] :: Entfernt die vorhandenen Attribute aus kopierten
                       Dateien.

            /CREATE :: Erstellt eine Verzeichnisstruktur und nur Dateien mit
                       einer Länge von Null.
               /FAT :: Erstellt Zieldateien nur unter Verwendung von
                       8.3 FAT-Dateinamen.
               /256 :: Deaktiviert die Unterstützung für sehr lange Pfade
                       (> 256 Zeichen).

             /MON:n :: Überwacht die Quelle. Wird erneut ausgeführt, wenn mehr
                       als n Änderungen gefunden werden.
             /MOT:m :: Überwacht die Quelle. Wird bei einer Änderung erneut
                       ausgeführt in m Minuten.

      /RH:hhmm-hhmm :: Ausführungsstunden - Steuert, wann neue Kopiervorgänge
                       gestartet werden können.
                /PF :: Überprüft die Ausführungsstunden pro Datei
                       (nicht pro Durchgang).

             /IPG:n :: Abstand zwischen Paketen (ms), um bei langsamen
                       Verbindungen Bandbreite freizugeben.

                /SJ :: Kopiert Verbindungen als Verbindungen anstatt als Verbindungsziele.
                /SL :: Kopiert symbolische Verknüpfungen als Verknüpfungen anstatt als Verknüpfungsziele.

            /MT[:n] :: Multithreadkopien mit n Threads erstellen (Standardwert: "8").  
                       n muss zwischen 1 und 128 (einschließlich) liegen.
                       Die Option ist nicht mit "/IPG" und "/EFSRAW" kompatibel.  
                       Die Ausgabe kann mit "/LOG" umgeleitet werden, um eine bessere Leistung zu erzielen.  

/DCOPY:Kopierflag[s] :: zu kopierende Elemente für Verzeichnisse (Standard: "/DCOPY:DA").  
                       (Kopierflags : D=Daten, A=Attribute, T=Zeitstempel, E=EAs, X=Alternative Datenströme überspringen).

           /NODCOPY :: kopiert keine Verzeichnisinformationen
                       (standardmäßig wird "/DCOPY:DA" ausgeführt).  

         /NOOFFLOAD :: Dateien werden ohne den Windows-Kopieabladungs-
                       mechanismus kopiert.

          /COMPRESS :: Fordert während der Dateiübertragung ggf. Netzwerkkomprimierung an.

::
:: Dateiauswahloptionen:
::
                 /A :: Kopiert nur Dateien mit dem "Archive"-Attribut.  
                 /M :: Kopiert nur Dateien mit dem "Archive"-Attribut und setzt  
                       das Attribut zurück.
     /IA:[RASHCNETO]:: Schließt nur Dateien ein, bei denen eines der Attribute
                       festgelegt ist.
     /XA:[RASHCNETO]:: Schließt Dateien aus, bei denen eines der Attribute
                       festgelegt ist.

    /XF Datei[Datei]:: Schließt Dateien aus, die mit den angegebenen
                       Namen/Pfaden/Platzhaltern übereinstimmen.
    /XD Verz.[Verz.]:: Schließt Verzeichnisse aus, die mit den angegebenen
                       Namen/Pfaden übereinstimmen.

                /XC :: Schließt geänderte Dateien aus.
                /XN :: Schließt neuere Dateien aus.
                /XO :: Schließt ältere Dateien aus.
                /XX :: Schließt zusätzliche Dateien und Verzeichnisse aus.
                /XL :: Schließt einsame Dateien und Verzeichnisse aus.
                /IS :: Schließt identische Dateien ein.
                /IT :: Schließt optimierte Dateien ein.

             /MAX:n :: Maximale Dateigröße - schließt Dateien aus, die größer
                       als n Bytes sind.
             /MIN:n :: Minimale Dateigröße - schließt Dateien aus, die kleiner
                       als n Bytes sind.

          /MAXAGE:n :: Maximales Dateialter - schließt Dateien aus, die älter
                       als n Tage/Datum sind.
          /MINAGE:n :: Minimales Dateialter - schließt Dateien aus, die neuer
                       als n Tage/Datum sind.
          /MAXLAD:n :: Maximales Datum des letztes Zugriffs - schließt Dateien
                       aus, die seit n nicht verwendet wurden.
          /MINLAD:n :: Minimales Datum des letztes Zugriffs - schließt Dateien
                       aus, die seit n verwendet wurden.
                       (Wenn n < 1900, dann ist n = n Tage, andernfalls ist
                       n = Datum im Format JJJJMMTT).

               /FFT :: Geht von FAT-Uhrzeitangaben für Dateien aus (Granularität von zwei Sekunden).
               /DST :: Kompensiert Zeitunterschiede von einer Stunde aufgrund
                       der Sommerzeit.

                /XJ :: Schließt Links (für Dateien und Verzeichnisse) und Verbindungspunkte aus.
               /XJD :: Schließt symbolische Verknüpfungen für Verzeichnisse und Verknüpfungspunkte aus.
               /XJF :: Schließt symbolische Verknüpfungen für Dateien aus.

                /IM:: Enthält geänderte Dateien (abweichende Änderungszeiten).
::
:: Wiederholungsoptionen:
::
               /R:n :: Anzahl von Wiederholungsversuchen bei fehlerhaften
                       Kopiervorgängen. Der Standardwert ist 1 Million.
               /W:n :: Wartezeit zwischen Wiederholungsversuchen.
                       Der Standardwert ist 30 Sekunden.

               /REG :: Speichert "/R:n" und "/W:n" in der Registrierung als  
                       Standardeinstellungen.

               /TBD :: Wartet, dass Freigabenamen definiert werden (Wiederholungsfehler 67).

               /LFSM :: Betrieb im Modus "wenig freier Speicherplatz", ermöglicht Kopieren, Anhalten und Fortsetzen (siehe Anmerkungen).  

               /LFSM:n[KMG] :: /LFSM, gibt die Floor-Größe in [K:Kilo,M:Mega,G:Giga] Byte an.

::
:: Protokollierungsoptionen :
::
                 /L :: Listet nur auf. Es werden keine Kopiervorgänge
                       ausgeführt, Zeitstempel erstellt oder Dateien gelöscht.
                 /X :: Meldet alle zusätzlichen Dateien, nicht nur die
                       ausgewählten Dateien.
                 /V :: Erstellt eine ausführliche Ausgabe mit ausgelassenen
                       Dateien.
                /TS :: Schließt Zeitstempel von Quelldateien in die Ausgabe ein.
                /FP :: Schließt den vollständigen Pfadnamen von Dateien in
                       die Ausgabe ein.
             /BYTES :: Gibt Größen in Bytes aus.

                /NS :: Keine Größe - Dateigrößen werden nicht protokolliert.
                /NC :: Keine Klasse - Dateiklassen werden nicht protokolliert.
               /NFL :: Keine Dateiliste - Dateinamen werden nicht protokolliert.
               /NDL :: Keine Verzeichnisliste - Verzeichnisnamen werden nicht
                       protokolliert.

                /NP :: Kein Status - der Prozentsatz kopierter Elemente wird
                       nicht angezeigt.
               /ETA :: Zeigt die ungefähre Empfangszeit der kopierten Dateien
                       an.

         /LOG:Datei :: Gibt den Status der Protokolldatei aus (überschreibt das
                       vorhandene Protokoll).
        /LOG+:Datei :: Gibt den Status der Protokolldatei aus
                       (wird an das vorhandene Protokoll angefügt).

      /UNILOG:Datei :: Gibt den Status der Protokolldatei als UNICODE aus
                       (überschreibt das vorhandene Protokoll).
     /UNILOG+:Datei :: Gibt den Status der Protokolldatei als UNICODE aus
                       (wird an das vorhandene Protokoll angefügt).

               /TEE :: Gibt Daten in das Konsolenfenster und die Protokolldatei
                       aus.

               /NJH :: Kein Auftragsheader.
               /NJS :: Keine Auftragszusammenfassung.

           /UNICODE :: Gibt den Status als UNICODE aus.

::
:: Auftragsoptionen:
::
  /JOB:Auftragsname :: Übernimmt Parameter aus der angegebenen Auftragsdatei.
 /SAVE:Auftragsname :: Speichert Parameter in der angegebenen Auftragsdatei.
              /QUIT :: Beendet den Vorgang nach der Verarbeitung
                       der Befehlszeile (zum Anzeigen von Parametern).
              /NOSD :: Es ist kein Quellverzeichnis angegeben.
              /NODD :: Es ist kein Zielverzeichnis angegeben.
                /IF :: Schließt die folgenden Dateien ein.

::
:: Hinweise:
::
       Bei der Verwendung von /PURGE oder /MIR im Stammverzeichnis des Volumes
       wurde der angeforderte Vorgang von Robocopy zuvor auch auf Dateien innerhalb
       des Verzeichnisses mit Systemvolumeinformationen angewendet.
       Dies ist nicht länger der Fall. Falls angegeben, überspringt Robocopy Dateien
       oder Verzeichnisse mit diesem Namen im obersten Quell- und Zielverzeichnis des Kopiervorgangs.

       Die geänderte Dateiklassifizierung gilt nur, wenn sowohl die Quell-
       als auch die Zieldateisysteme Änderungszeitstempel unterstützen (z. B. NTFS)
       und die Quell-und Zieldateien unterschiedliche Änderungszeiten aufweisen, ansonsten jedoch
       identisch sind. Diese Dateien werden nicht standardmäßig kopiert. Geben Sie /IM an,
       um sie einzubeziehen.

       Das /DCOPY:E-Flag erfordert, dass das Kopieren erweiterter Attribute
       für Verzeichnisse versucht werden sollte. Beachten Sie, dass robocopy derzeit fortgesetzt wird,
       wenn die EAs eines Verzeichnisses nicht kopiert werden können. Dieses Flag ist auch nicht
       in /COPYALL.

       Verwendet /LFSM-Anforderungen für robocopy, um im Modus „wenig freier Speicherplatz” zu arbeiten.
       In diesem Modus wird Robocopy angehalten, wenn eine Dateikopie dazu führt,
       dass freier Speicherplatzes auf dem Ziel-Volume unter einen "Floor"-Wert sinkt, der  
       explizit durch die LFSM:n[KMG]-Form des Flags angegeben werden kann.
       Wenn /LFSM ohne expliziten Floor-Wert angegeben ist, wird dieser auf
       zehn Prozent der Größe des Ziel-Volume festgelegt.
       Wenig freier Speicherplatz ist inkompatibel mit /MT, /EFSRAW, /B und /ZB.
colinardo
Lösung colinardo 06.07.2022 aktualisiert um 08:44:18 Uhr
Goto Top
Servus.
Du musst dich schon entscheiden, "Kopieren" oder "Verschieben" sind zwei unterschiedliche Dinge, dein Code verschiebt ... so does this too ... ansonsten Move-Item mit Copy-Item tauschen.
$source = "\\srv1\folder1"  
$target = "\\srv2\folder1"  
foreach($file in Get-ChildItem $source -file -filter *.txt -recurse){
     $dst = "$target\$($file.Name)"  
     $cnt = 1
     while(Test-Path $dst){
         $dst = "$target\$($file.Basename)_$cnt$($file.Extension)"  
         $cnt++
     }
     $file | Move-Item -Destination $dst -force -verbose
}
Grüße Uwe
dispatcher
dispatcher 06.07.2022 um 09:13:58 Uhr
Goto Top
Zitat von @colinardo:

Servus.
Du musst dich schon entscheiden, "Kopieren" oder "Verschieben" sind zwei unterschiedliche Dinge, dein Code verschiebt ... so does this too ... ansonsten Move-Item mit Copy-Item tauschen.

Hi Uwe,
da hast du recht, ich habe mich da unglücklich ausgedrückt. Verschieben ist schon richtig, daher auch
move-item

Funktioniert übrigens hervorragend