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.
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. –