systemforscher
Goto Top

Robocopy - ECHTES verschieben möglich?

Robocopy kopiert anstatt zu verschieben. Ich brauche ein Tool zum verschieben mit Batch Script.

Hallo!

Ist es möglich mit Robocopy oder einem vergleichbaren CMD Tool, Dateien auf einer HD zu verschieben?

In meinem Batch-Script soll Robocopy aus einer Verzeichnisstruktur, bestimmte Dateien verschieben. Dabei kommt es mir vor allem auf den Geschwindigkeitsvorteil des Verschiebens an. Bisher KOPIERT Robocopy die Dateien einfach in das andere Verzeichnis und löscht die Dateien im Ursprungsverzeichnis hinterher. Die Dateien befinden sich in Unterverzeichnissen und sind mehrere Gb groß.

Meine CL sieht etwa so aus:
ROBOCOPY "C:\1" "C:\2" *.v2i *.bak /S /MOVE

Der Befehl "MOVE C:\1 C:\2" verschiebt zwar die Dateien auf der HD, aber dabei fehlt mir die Filteroption die ich benötige.

Ich verwende Windows 7 und die Version von Robocopy 5.1.10.1027 (XP027). Gibt es eine neuere Version von Robocopy, die das Problem beheben könnte? Auf der Microsoft Seite habe ich bisher nichts entdecken können.
Oder gibt es ein CMD Tool das ähnliche Filteroptionen wir Robocopy besitzt und die Dateien tatsächlich verschieben kann?


mfg

Content-ID: 146980

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

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

60730
60730 15.07.2010 um 16:31:45 Uhr
Goto Top
moin,

Ist es möglich mit Robocopy oder einem vergleichbaren CMD Tool, Dateien auf einer HD zu verschieben?
Theologisch gesehen Jein
Der Befehl "MOVE C:\1 C:\2" verschiebt zwar die Dateien auf der HD, aber dabei fehlt mir die Filteroption die ich benötige.

dazu sagt meine PsychaterinKristallkugel mir fehlt auch was, das ich zum beantworten benötige
Da die Dame/Kugel meistens Recht hat - bist du jetzt dran.

gruß
heparus
heparus 15.07.2010 um 21:55:22 Uhr
Goto Top
Da es sich um ein Skript handelt, kannst du nach dem Robocopy nicht einfach ein Erase auf den Ordner machen?


ROBOCOPY "C:\1" "C:\2" *.v2i *.bak /S /MOVE

Wenn ich den Befehl richtig lese kopierst du alle Dateien mit den Endungen .bak und .v2i und sämtliche Unterordner (außer den Leeren) von C1 nach C2

Wie man die Unterordner dann löscht muss ich mir noch überlegen, da der Parameter /S ine andere Bedeutung beim Erase hat.
Erase c:\1\*.v2i
Erase c:\2\*bak
Friemler
Friemler 16.07.2010 um 15:18:47 Uhr
Goto Top
Hallo SystemForscher,

hier mal ein Vorschlag zur Lösung Deines Problems, habe erstmal den COPY-Befehl in den Code eingesetzt, kannst Du ja nach ausgiebigen Tests durch MOVE ersetzen:

@echo off

setlocal

set src=%~1
set dest=%~2

if "%src:~-1%"=="\" (  
  set src=%src:~0,-1%
)

if "%dest:~-1%"=="\" (  
  set dest=%dest:~0,-1%
)

for /f "delims=" %%p in ('dir "%src%\" /b /-p /a:d 2^>NUL') do (  
  call "%~0" "%src%\%%p" "%dest%\%%p" %3  
)

if "%dest:~-1%"==":" (  
  set dest=%dest%\
)

if exist "%src%\%~1" (  
  md "%dest%" > NUL 2>&1  
  copy "%src%\%~1" "%dest%"  
)

endlocal

Speichere den Code als rmove.bat. Der Aufruf sieht dann so aus:

rmove <Quellverzeichnis> <Zielverzeichnis> <Dateimaske>

Das Zielverzeichnis muss bereits existieren. Sollte einer der Parameter Leerzeichen enthalten, muss er in Anführungszeichen eingeschlossen werden.

Der Code ruft sich selbst rekursiv auf und erstellt dabei im Zielverzeichnis alle (Unter-)Verzeichnisse aus dem Quellverzeichnis, die Dateien enthalten, auf die die Dateimaske passt. COPY/MOVE kann ja von sich aus keine Verzeichnisbäume kopieren/verschieben, daher wahrscheinlich Dein Posting.

Gruß
Friemler
Friemler
Friemler 16.07.2010 um 15:49:05 Uhr
Goto Top
Hallo SystemForscher,

hier noch eine Version, die auch mehrere Dateimasken zulässt:

@echo off

setlocal

set prgname=%~0
set src=%~1
set dest=%~2

if "%src:~-1%"=="\" (  
  set src=%src:~0,-1%
)

if "%dest:~-1%"=="\" (  
  set dest=%dest:~0,-1%
)

shift
shift

for /f "delims=" %%p in ('dir "%src%\" /b /-p /a:d 2^>NUL') do (  
  call "%prgname%" "%src%\%%p" "%dest%\%%p" %1 %2 %3 %4 %5 %6 %7 %8 %9  
)

if "%dest:~-1%"==":" (  
  set dest=%dest%\
)

:loop
  if exist "%src%\%~1" (  
    md "%dest%" > NUL 2>&1  
    copy "%src%\%~1" "%dest%"  
  )

  shift
if not "%~1"== "" goto loop  

endlocal

Gruß
Friemler
60730
60730 16.07.2010 um 16:11:28 Uhr
Goto Top
Moin Mädelz,

back-to-toplest doch mal die Frage...


er will anhand eines nicht genannten Filters Dateien verschieben und nicht kopieren löschen, weil er das innerhalb einer Platte macht und das in kurzer Zeit
laufen soll....

btw: Das Thema scheint vonTO eh schon vergessen worden zu sein - rückfragen werden ja genausowenig beantwortet, wie euere Mühe (in die falsche Richtung)

Gruß
Friemler
Friemler 16.07.2010 um 16:46:34 Uhr
Goto Top
Moin,

LES' DOCH MAL DEN TEXT...

Er braucht doch nur COPY gegen MOVE zu tauschen, schon funktionierts. Und wer hier irgendwas vergisst, weißt Du bestimmt nicht.

Gruß
SystemForscher
SystemForscher 18.07.2010 um 13:53:29 Uhr
Goto Top
Hallo!

Ich war die Tage untewegs und konnte nicht gleich Antworten, sorry.

Das mit der "Filteroption" war wohl etwas zu kryptisch, sorry TimoBeil.
In diesen Verzeichnissen befinden sich auch Dateien, die NICHT verschoben werden sollen (z.B. .txt; .LOG). Es sollen nur bestimmte Dateiendungen verschoben werden, welche man mit ROBOCOPY hervoragend definieren kann. XCOPY und andere Win7 Systemprogramme können dies nicht. Ausser "MOVE" Verschiebt kein CMD Systemprogramm WIRKLICH die Dateien, sondern kopiert sie und löscht hinterher die Dateien. Das macht in meinem Fall keinen Sinn, da ich wirklich auf den geschwindigkeits Vorteil angewiesen bin.

Die Scripts von Friemler sehen vielversprechend aus, ich werde sie später Testen. Vielen Dank, schon mal im voraus, falls sie funktionieren sollten =)


mfg
Friemler
Friemler 18.07.2010, aktualisiert am 18.10.2012 um 18:42:53 Uhr
Goto Top
Hallo Systemforscher,

in dem Code oben waren noch kleine Fehler. Bei einem Wurzelverzeichnis als Quell- oder Zielpfad hätte es Fehlfunktionen gegeben. Peinlich.

Ich habe kurzerhand eine Anleitung im Bereich Batch & Shell erstellt. Link: Verschieben von Verzeichnisbäumen mit MOVE.exe unter Angabe von mehreren Dateimasken

Das Skript dort kann beliebig viele Dateimasken entgegennehmen. Es enthält zum Schluss auch einen Befehl, der leere Verzeichnisse löscht, die während der Abarbeitung entstehen oder schon vorhanden waren. Ob das für Dich sinnvoll ist, musst Du selbst entscheiden.

Gruß
Friemler
SystemForscher
SystemForscher 19.07.2010 um 18:58:29 Uhr
Goto Top
Hallo!

Das 2. Script von Friemler tut genau das was ich brauche. VIELEN, VIELEN DANK!
Einfach COPY mit MOVE ersetzen und die Dateien werden verschoben. Ich bin dir sehr dankbar für dieses einfache und geniale Script. Es wundert mich das MS diese verschiebe Option nicht auch in Robocopy eingebaut hat.

Ja ein Fehler ist mir auch aufgefallen. Wenn in einerm der Unterverzeichnisse ein "&" enhalten war konnte dieser Pfad nicht richtig ausgeführt werden. Es erschien "konnte befehl "yxz & abc" nicht finden.
Aber da dies nur in ein paar Pfaden aufgetreten ist, konnte ich ein workaround machen.

Den verbesserten Script aus deinem Link werde nacher testen. Feedback dazu gebe ich dir später.

Noch eine kleine Frage: wenn eine Batchdatei mit Administrationsrechten gestartet wird und darin mit einem CALL ein 2. Script aufgerufen wird, besitzt dieses 2. Script dann auch Adminrechte?

mfg
Friemler
Friemler 19.07.2010, aktualisiert am 18.10.2012 um 18:42:54 Uhr
Goto Top
Hallo SystemForscher,

freut mich, daß ich Dir helfen konnte.


Berichte doch bitte von Deinem Workaround. Konntest Du eigentlich feststellen, durch welche Zeile die Fehlfunktion bei & hervorgerufen wurde? Vermute mal durch einen SET-Befehl. In dem Skript aus der Anleitung unter Verschieben von Verzeichnisbäumen mit MOVE.exe unter Angabe von mehreren Dateimasken müsste das auch behoben sein.

Gruß
Friemler
SystemForscher
SystemForscher 21.07.2010, aktualisiert am 18.10.2012 um 18:42:55 Uhr
Goto Top
Hallo!
Du wirst lachen, der Workaround besteht einfach nur aus einer manuellen Umbenennung der betroffenen Pfade =)

Das Erweiterte Script aus dem Link hat das Problem, dass durch überlange Pfade der Script und die aufrufende Batchdatei abstürzt.
Ich konnte den Absturz mit diesem Script verhindern indem ich den Backslash Teil aus deinem Batch Script entfernt habe.

Hier der Code den ich entfernt habe damit der Script nicht abstürzt. Es müssen beide Teile entfernt werden, damit es funktioniert.

[code]

:: evtl. Backslash als letztes Zeichen von src und dest entfernen

if "%src:~-1%"=="\" (
set src=%src:~0,-1%
)

if "%dest:~-1%"=="\" (
set dest=%dest:~0,-1%
)

:: Wenn dest ein Wurzelverzeichnis ist, Backslash wieder anhängen

if "%dest:~-1%"==":" (
set dest=%dest%\
)
[/code]

Beim 2. Script von dieser Seite werden die überlangen Pfade zwar nicht Verschoben, aber das Script und Batch kann wenigstens weiter ausgeführt werden. Beim 2. Script werden die überlangen
Pfade einfach übergangen. Das ist zwar unschön, aber für meine Zwecke ausreichend.

Zudem ist das erweiterte Script aus deinem Link sehr langsam, (also der Teil mit der FOR-Schleife), deshalb habe ich diesen FOR Teil entfernt und verwende jetzt den oberen, schnelleren Teil. Bei
Pfaden mit vielen Verzweigungen ist der Unterschied deutlich erkennbar. Fehlermeldungen habe ich bei dem schnelleren Teil keine erhalten.


[quote]
Berichte doch bitte von Deinem Workaround. Konntest Du eigentlich feststellen, durch welche Zeile die Fehlfunktion bei & hervorgerufen wurde? Vermute mal durch einen SET-Befehl.
[/quote]
Richtig, es ist der Set befehl. Ich habe die move-Zeile mit gelogt ">" . In der Letzt zeile des Logs sind vor dem "SET..." 2 Leerzeichen und im Pfadname fehlt 1 Buchstabe.


mfg

PS: meine tests beziehen sich auf die Version vom 19.07 Verschieben von Verzeichnisbäumen mit MOVE.exe unter Angabe von mehreren Dateimasken
Friemler
Friemler 25.07.2010, aktualisiert am 18.10.2012 um 18:42:57 Uhr
Goto Top
Hallo Systemforscher,

danke für Deine Rückmeldung, hat mir interessante Erkenntnisse gebracht.

Zitat von @SystemForscher:
Ich konnte den Absturz mit diesem Script verhindern indem ich den Backslash Teil aus deinem Batch Script entfernt habe.

Bei sehr langen Pfaden werden die von Dir entfernten Ausdrücke wohl nicht korrekt interpretiert. Tja, ich habe immer wieder den Verdacht, das MS den Interpreter für die Batchskript Sprache von einem Praktikanten programmieren ließ...

Zitat von @SystemForscher:
Zudem ist das erweiterte Script aus deinem Link sehr langsam,... Fehlermeldungen habe ich bei dem schnelleren Teil
keine erhalten.

Für Deinen Verwendungszweck ist die schnelle Version auch völlig ausreichend. Du nimmst ja nie die Maske *.*, sondern immer so was wie *.txt oder *.log. Ich glaube mittlerweile auch nicht mehr daran, daß die langsame Version notwendig war, denn alle Dateien und Unterverzeichnisse kann move schon von sich aus verschieben und nur bei der Maske *.* und einem Verzeichnis, das keine Dateien sondern nur Unterverzeichnisse enthält, kann die schnelle Version Fehlermeldungen produzieren.

Zitat von @SystemForscher:
PS: meine tests beziehen sich auf die Version vom 19.07

An dem Tag habe ich mehrere Änderungen an dem Skript aus meiner Anleitung unter Verschieben von Verzeichnisbäumen mit MOVE.exe unter Angabe von mehreren Dateimasken vorgenommen. Der SET-Fehler bei Pfaden mit dem & Zeichen sollte in der letzten Version behoben sein, wenn nicht, liegt es wieder mal an dem Praktikanten.

Gruß
Friemler