2016-04-29 2 views
-1

Ich bin neu beim Erstellen von .bat-Dateien. Ich versuche, eine Batch-Datei zu erstellen, die Datei (en) von einem Verzeichnis zu einem anderen verschiebt oder kopiert, und wenn die Datei (en) im Zielverzeichnis vorhanden ist, wird sie die Datei mit einem (1) umbenennen. Unten ist, was ich für eine .bat-Datei zu kopieren habe, aber es überschreibt die Datei im Zielverzeichnis.Batch-Datei, die beide Dateien enthält, wenn ein Namenskonflikt auftritt und Datei umbenennt

copy /-y "C:\Users\Private\Desktop\Move-Copy\1\1.txt" "C:\Users\Private\Desktop\Move-Copy\2" 
    pause 
+3

Es gibt keinen einzigen Befehl, der das tut, was Sie fragen. Es ist Funktionalität, die der Explorer hinzufügt. Wenn Sie dasselbe implementieren möchten, müssen Sie 'if exist' und einen eigenen Schleifencode verwenden, um herauszufinden, ob eine oder mehrere Kopien der Datei bereits existieren. –

Antwort

0

Das folgende Skript stellt eine Unterroutine :SUB_COPY, das tun kann, was Sie wollen, und zwar das Kopieren von Dateien ohne bestehende zu überschreiben bereits sondern auch neue eindeutige Namen für den Fall zu erzeugen. Die Routine erwartet zwei Befehlszeilenargumente: Der erste ist der Pfad zum Quellelement (die Platzhalter ? und * werden unterstützt; ein Verzeichnis ist ebenfalls zulässig), das zweite ist der Pfad zum Zielverzeichnis (Zielverzeichnis). Also hier ist das Skript:

@echo off 
call :SUB_COPY "C:\Users\Private\Desktop\Move-Copy\1\1.txt" "TARGET=C:\Users\Private\Desktop\Move-Copy\2" 
exit /B 


:SUB_COPY source_item target_dir 
if not "%~3"=="" (
    >&2 echo ERROR: too many arguments! 
) 
set "SOURCE=%~f1" 
if not defined SOURCE (
    >&2 echo ERROR: missing argument! 
    exit /B 1 
) else if not exist "%SOURCE%" (
    >&2 echo ERROR: source not found! 
    exit /B 1 
) 
set "TARGET=%~f2" 
if not defined TARGET set "TARGET=." 

for /F "delims=" %%I in (' 
    2^> nul xcopy /L /Y /I "%SOURCE%" "%TEMP%\" ^| findstr /V /R "^[0-9]" 
') do (
    call :SUB_DO "%%~I" "%TARGET%" 
) 
exit /B 

:SUB_DO source_file target_dir 
set "SUFFIX=" 
:CHECK 
if exist "%~f2\%~n1%SUFFIX%%~x1" (
    set /A SUFFIX-=1 
) else (
    2> nul md "%~f2" 
    > nul 2>&1 copy /B "%~f1" "%~f2\%~n1%SUFFIX%%~x1" && (
     echo INFO: copied "%~nx1" as "%~n1%SUFFIX%%~x1". 
    ) || (
     >&2 echo ERROR: copying of "%~nx1" failed! 
     exit /B 1 
    ) 
    exit /B 
) 
goto :CHECK 

Zuerst werden die Unterroutine :SUB_COPY prüft die bereitgestellten Argumente für die Gültigkeit. Danach gibt es eine for /F Schleife, die die Quellelemente auflistet, so Verzeichnisse und Platzhalter ? und * für den Fall aufzulösen (diese Schleife analysiert die Ausgabe von xcopy /L, nur um die Quelle aufzulösen und einzelne Dateien (nicht rekursiv) zurückgeben; /L erzählt zu nichts kopieren, sondern nur die Dateien auflisten). Innerhalb dieser Schleife wird eine weitere Unterroutine :SUB_DO aufgerufen, die das Kopieren einer einzelnen Datei ausführt; Diese Routine prüft, ob im Zielverzeichnis eine Datei mit dem gleichen Namen existiert, und wenn dies der Fall ist, wird ein Suffix -1 an den Dateinamen angehängt; Die Prüfung wird dann wiederholt, und wenn noch eine Datei gefunden wird, wird das Suffix -2 usw., bis ein neuer Dateiname gefunden wird, der nicht in dem Zielverzeichnis auftritt, und so wird das Kopieren tatsächlich ausgeführt.

+0

Wie kann ich damit rekursiv eine Reihe von Unterordnern durchsuchen und die Dateien in den übergeordneten Ordner verschieben? –

+0

Was meinen Sie mit "Elternordner" in dieser Situation? Möchten Sie die Dateien um eine Verzeichnisebene nach oben verschieben oder möchten Sie sie in das gemeinsame Stammverzeichnis verschieben, in dem rekursiv gesucht werden soll? – aschipfl

+0

Ja, gemeinsames Stammverzeichnis, das rekursiv recherchiert wird Ich habe das verwendet ... für/f "Tokens = *" %% f in ('dir/a: -D/s/b') verschiebe "%% f" . aber verschieben wird die Datei überschreiben –

Verwandte Themen