Es gibt mehrere Probleme:
- Da Sie versuchen, Verzeichnisse zu bewegen, wird der Verzeichnisbaum durch
for /R
aufgezählt geändert wird. for
/for /R
jedoch nicht das Verzeichnis (Baum) im Voraus, daher können unerwartete Ergebnisse auftreten - siehe die folgende Frage für Details dazu: At which point does for
or for /R
enumerate the directory (tree)?.
for
oder for /R
greift nur dann auf das Dateisystem zu, wenn in der Gruppe Platzhalter vorhanden sind (also der Teil zwischen Klammern).
- Es ist nicht ganz klar ist, was genau Sie erreichen wollen:
- , was im Falle von widersprüchlichen Elemente passieren sollte? überschreiben sie oder nicht? Merge (Sub-) Verzeichnisse?
- im Fall von
E:\TEST\TEST
, möchten Sie E:\TEST
auf einmal verschoben werden, so gibt es kein Verzeichnis TEST
bei E:\
?.
- Beachten Sie, dass der
move
Befehl kann nicht verwendet werden, weil es Probleme verursacht, wenn Verzeichnisse zu bewegen und das Zielverzeichnis bereits vorhanden ist (Access is denied.
Fehler auftreten). for /F "eol=| delims=" %%I in ('dir /B /S /A:D "E:\TEST"') do echo(%%I
Dies erzwingt den gesamten Verzeichnisbaum starten (lesen), bevor die Schleifendurchläufe werden aufgezählt:
Artikel 1. kann durch eine schöne Arbeit-around mit for /F
und dir
gelöst werden.
Doch dies stellt ein weiteres Problem ähnlich Punkt 2.: Wenn ein Name für dir
gegeben wird, die ein Verzeichnis in der angegebenen Position vorhandenen übereinstimmt, wird ihr Inhalt zurückgegeben, anstatt alle Elemente, die Namen übereinstimmen.Was ich meine, ist die folgende:
dir /B /S /A:D "E:\"
gibt alle Verzeichnisse (/A:D
) bei E:\
rekursiv (/S
);
dir /B /S /A:D "E:\file.ext"
gibt alle Verzeichnisse mit der Bezeichnung file.ext
zurück, auch wenn es eine Datei mit dem Namen E:\file.ext
gibt;
- aber:
dir /B /S /A:D "E:\TEST"
gibt alle Unter -directories von E:\TEST
, aber nicht E:\TEST
selbst;
- jedoch:
dir /B /S /A:D "E:\TEST*"
gibt alle Verzeichnisse beginnend mit TEST
zurück, auch jene in E:\
; Um genau den Namen TEST
zu entsprechen, ist eine zusätzliche Filterung erforderlich (unter Verwendung von findstr
);
All dies bedeutet:
for /F "eol=| delims=" %%I in ('dir /B /S /A:D "E:\TEST*" ^| findstr /I /E /C:"\\TEST"') do echo(%%I
Artikel 3. kann nur von Ihnen gelöst werden, aber eine vollständige Antwort zu geben, habe ich einige Annahmen getroffen werden:
- (sub-) Verzeichnisse werden zusammengeführt, bereits vorhandene Elemente werden ohne vorherige Ankündigung überschrieben;
- übergeordnete Verzeichnisse haben Vorrang vor Unterverzeichnissen (wie
for /R
und dir /S
Verhalten, weil für jeden Zweig in einem Baum, gehen sie immer von höheren nach unten Verzeichnis Ebenen);
Artikel 4. kann mit dem Befehl robocopy
zusammen mit Option /MOVE
statt move
gelöst werden.
Also hier ist das letzte Skript:
@echo off
rem // Define constants here:
set "_PATH=E:\"
set "_NAME=TEST"
set "_DEST=E:\FOUND"
2> nul mkdir "%_DEST%"
for /F "eol=| delims=" %%I in ('
dir /B /S /A:D "%_PATH%\%_NAME%*" ^| findstr /I /E /C:"\\%_NAME%"
') do (
> nul robocopy "%%I" "%_FOUND%\%_NAME" /E /MOVE
)
Der > nul
Teil sollten Fortschritte zu unterdrücken und Log-Meldungen und The system cannot find the path specified.
Fehler im Fall zu unterdrücken E:\TEST\TEST
versucht wird, bewegt zu werden, obwohl es nicht mehr funktioniert existieren, da der Elternteil E:\TEST
bereits vorher verschoben wurde.
'for' /' for/R' greift nur dann auf das Dateisystem zu, wenn Wildcards im ''/''vorhanden sind; und 'for' /' for/R' zählt Dateien auf, es sei denn, Sie stellen den Schalter '/ D' bereit. – aschipfl
Entfernen Sie das Leerzeichen nach' = 'equals in' set'. Verwenden Sie außerdem "set" Destination = E: \ FOUND "', um sicherzustellen, dass kein unerwünschter, nachkommender Platz vorhanden ist. – JosefZ