2016-12-02 2 views
0

Ich möchte ein Skript erstellen, das ein Mehrfachverzeichnis "zB: TEST" durchsucht und an eine bestimmte Stelle in einem Ordner verschiebt. Ich habe versucht, das folgende Skript zu verwenden. Es zeigen den Ordner Beispiel:Batch-Skript, um mehrere Verzeichnisse zu durchsuchen und in einen bestimmten Ordner zu verschieben

"E:\Example\TEST" 
"E:\TEST\TEST" 

Überprüfen Sie bitte das Skript i erstellt haben. Kann jemand helfen?

@echo off 

set filename=TEST 

set searchPath=E:\ 

set Destination= E:\FOUND 

FOR /R "%searchPath%" %%a in (%filename%) DO (
    IF EXIST "%%~fa" (
     echo "%%~fa" 
    ) 
) 

move "%%~fa" "%Destination%" 
+1

'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

+1

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

Antwort

0

Es gibt mehrere Probleme:

  1. 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)?.
  2. for oder for /R greift nur dann auf das Dateisystem zu, wenn in der Gruppe Platzhalter vorhanden sind (also der Teil zwischen Klammern).
  3. 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:\?.
  4. 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.

Verwandte Themen