romy: Dateien aus Verzeichnis X nach Verzeichnis Y mit cmd

Hallöchen,

so ich habe mal eine private Frage. Ich würde gern Dateien von X nach Y kopieren mit einem kleinen Batchprogramm auf einem Windowsrechner. Dabei sollen die Dateien in Y aber nicht überschrieben werden, sondern wenn es eine gleiche Datei schon gibt, soll die zu kopierende umbenannt werden (meinetwegen eine laufende Nummer dran oder so).

Ich habe mich gerade dämlich gesucht, aber ich verstehe einfach die Syntax nicht.

xcopy kopiert ja problemlos: xcopy c:\Test\A\*.* c:\Test\B\ /Q /C /Y
Aber entweder fragt xcopy oder überschreibt eben. Naja, also ne for-Schleife um die Verzeichnisse auszulesen. Ich kann die Syntax echt nicht nachvollziehen, mir fehlen so viele Hinweise. Kann mich bitte jemand aufhellen?

Das wäre nett, danke.

ciao
romy

  1. Yerf!

    Aber entweder fragt xcopy oder überschreibt eben. Naja, also ne for-Schleife um die Verzeichnisse auszulesen. Ich kann die Syntax echt nicht nachvollziehen, mir fehlen so viele Hinweise. Kann mich bitte jemand aufhellen?

    Die cmd kennt zwar eine for-Schleife, die Syntax ist aber total komisch...

    Ich würde sowas per JScript lösen, da kann man wenigstens "normal" programmieren ;-)

    Gruß,

    Harlequin

    1. Hi Harlequin,

      Ich würde sowas per JScript lösen, da kann man wenigstens "normal" programmieren ;-)

      Auch diese Sprache ist mir nicht wirklich eingängig, aber danke für den Tipp.

      ciao
      romy

  2. Hallo romy,

    nur eine Idee:

    in einer Schleife läufst du durch alle Dateien und rufst für jede Datei eine Kopierbatch auf, die prüft und bei Bedarf renamed. Dieses Prüfen muss natürlich in einer Schleife passieren, um zu testen ob schon weitere Versionen der Datei existieren.

    Befehle, die du benötigst, sind u.a.

    xcopy
    for
    if
    goto

    Mit help erhältst du eine Liste aller Batchbefehle, mit z.B. help if erhältst du Infos zum if-Befehl.

    Gruß, Jürgen

    1. Hi JürgenB,

      in einer Schleife läufst du durch alle Dateien und rufst für jede Datei eine Kopierbatch auf, die prüft und bei Bedarf renamed. Dieses Prüfen muss natürlich in einer Schleife passieren, um zu testen ob schon weitere Versionen der Datei existieren.

      klingt gut.

      Befehle, die du benötigst, sind u.a.
      xcopy
      for
      if
      goto

      Mit help erhältst du eine Liste aller Batchbefehle, mit z.B. help if erhältst du Infos zum if-Befehl.

      Ich weiß, aber ich kann mit der Erklärung zu "help for" nichts anfangen.
      Mal ein Beispiel:

      C:>help for
      Führt einen Befehl für jede einzelne Datei für einen Satz von Dateien aus.

      FOR %Variable IN (Satz) DO Befehl [Parameter]

      %Variable  Ein ersetzbarer Parameter bestehend aus einem einzelnen
                    Buchstaben.
        >>> Was soll das heißen? Was ist ein ersetzbarer Parameter?  Muss der dahin?

      (Satz)      Ein Satz von mindestens einer Datei. Platzhalter sind zulässig.
         >>> Was ist mit Satz gemeint?

      Befehl      Befehl, der für jede Datei ausgeführt werden soll.
        Parameter   Parameter und Optionen für den angegebenen Befehl.

      Verstehst du, ich begreife die Hilfe nicht. Ich kann PHP-Code schreiben, ich verstehe C-Code und ein bisschen Delphi, selbst Java könnte ich lesen. Ich kann einfach keinen Bezug herstellen zu dieser Art von Code.

      Pseudocodemäßig würde ich sagen:
      Schleife über alle Dateien des angebenen Verzeichnisses
      wenn Datei in Zielvorzeichnis vorhanden, dann rename, dann copy
      wenn Datei nicht vorhanden, dann copy

      rename am Besten mit Timestamp, dann muss ich nicht umständlich nach schon umbenannten laufenden Nummern suchen.

      So, jetzt fange ich an mit der Batch-Datei:

      REM Ich gehe davon aus, dass %%i die Datei ist, %% habe ich schon irgendwo gelesen
      FOR %%i IN (A:) DO
      SET datum=TIME(now,yyyymmtt)
      IF EXIST B:%%i (REN %%i %%i%datum%)
      XCOPY %%i B:\ /Q /C /Y

      Dabei passiert allerdings nichts. Ich bekomme auch keinen Fehler.
      Kannst du mir weiterhelfen?

      ciao
      romy

      1. Hi ICH,

        FOR %%i IN (A:) DO
        SET datum=TIME(now,yyyymmtt)
        IF EXIST B:%%i (REN %%i %%i%datum%)
        XCOPY %%i B:\ /Q /C /Y

        Wenn ich Klammern setze kommt zumindest ein Fehler:
        FOR %%i IN (A:) DO (
        SET datum=TIME(now,yyyymmtt)
        IF EXIST B:%%i (REN %%i %%i%datum%)
        XCOPY A:%%i B:\ /Q /C /Y
        )

        nämlich %i nicht gefunden???

        ciao
        romy

        1. Yerf!

          Wenn ich Klammern setze kommt zumindest ein Fehler:
          FOR %%i IN (A:) DO (
          SET datum=TIME(now,yyyymmtt)
          IF EXIST B:%%i (REN %%i %%i%datum%)
          XCOPY A:%%i B:\ /Q /C /Y
          )

          nämlich %i nicht gefunden???

          Die Klammern sind wichtig, damit alle Befehle innerhald der For-Schleife ausgeführt werden (ansonsten nur der Befehl direkt hinter DO in der selben Zeile). Allerding erwartet FOR eine Datei, die dann Zeilenweise verarbeitet wird. Folgende Anweisung sollte da weiterhelfen:

          for /f "usebackq" %%i in (dir a: /b) do (echo %%i)

          Dabei wird die Ausgabe des Dir-Befehls für die FOR-Schleife verwendet.

          Gruß,

          Harlequin

          PS: Ganz ehrlich: ich finde da JScript wesentlich einfacher, vor allem wenn man schon mal mit JavaScript zu tun hatte.

      2. Hallo romy,

        so richtig Fit in Sachen DOS bin ich auch nicht mehr, aber so weit ich weiß kann for nur einen Befehl. "Begin" und "End" gibt es nicht. Daher der Vorschlag, mit for eine zweite Batch aufzurufen, die das Kopieren etc. übernimmt. Das hat auch den Vorteil, dass die Kopierbatch an einzelnen Dateien getestet werden kann.

        Versuch mal

        for %d in (*.*) do echo %d

        um for zu verstehen. Statt echo %d kommt dann mycopy %d, und mycopy prüft, renamed bei Bedarf und kopiert. Übergabeparameter kommen dann als %1, %2, ... in der Batch an.

        Gruß, Jürgen