2016-12-29 1 views
0

ich einen Datensatz habe, bestehend aus Dateien nach der folgenden hierarchischen Ordner/Unterordner Struktur organisiert:Batch zu bewegen, Dateien außerhalb von zufällig benannte Unterordner

enter image description here

Ich möchte alle Ärgernisse Unterordner entfernen (bewegen ihr Inhalt außerhalb davon auf der gleichen Hierarchieebene + löschen die Belästigung Ordner), so enden mit den Dateien wie folgt organisiert: enter image description here

Wie kann ich dies erreichen, eine Batch-Datei, von einer Eingabeaufforderung in Windows 7? Ich habe eine Reihe von Anweisungen mit% F und %% F versucht, aber keine funktionierte. Dankbar für irgendwelche Tipps.

+1

Ohne einen Hinweis, wie Belästigung von nützlichen weder Datei noch Ordner zu unterscheiden ist diese Aufgabe unlösbar. – LotPings

+2

Sie haben ein potentielles großes Problem mit Ihrem Ziel. Die Namen der Ur-Grand-Child-Ordner können kollidieren, wenn Sie versuchen, sie auf die Ebene "Person n" zu verschieben. Sie können auf das gleiche Problem mit Dateinamen stoßen, wenn jeder nützliche Ordner mehrere untergeordnete Ordner haben kann. – dbenham

+0

@LotPings Sorry, wenn ich unklar war. Ich habe versucht, in den Hierarchien anzugeben, welche Unterordner die lästigen sind. Das sind die zwei Unterordner, die sich direkt unter den übergeordneten Ordnern befinden. und der Unterordner, der sofort die nützlichen Dateien enthält. – z8080

Antwort

2

glaube ich folgendes Ihr Ziel erreichen wird , wenn und nur wenn alle untergeordneten Ordner und Dateinamen eindeutig sind. Wenn es Duplikate gibt, wird die Hölle los.

Ich habe nicht getestet, so Backup und/oder versuchen Sie den Code auf Einwegdaten zuerst.

Sie müssen den ersten PUSHD-Befehl so ändern, dass er auf den Stamm verweist, in dem sich alle Ihre "person n" -Ordner befinden.

@echo off 
pushd "yourRootWherePersonFoldersReside" 
for /d %%U in (*) do (
    pushd "%%U" 
    for /f "eol=: delims=" %%A in ('dir /b /ad 2^>nul') do (
    for /d %%B in ("%%A\*") do (
     for /d %%C in ("%%B\*") do (
     md "%%~nxC" 
     for /d %%D in ("%%C\*") do move "%%D\*" "%%~nxC" >nul 2>nul 
    ) 
    ) 
    rd /s /q "%%A" 
) 
    popd 
) 
popd 

Die zweite FOR-Schleife muss FOR/F anstelle von FOR/D weil FOR/D das Potenzial hat, Ordner zu durchlaufen, die hinzugefügt wurden, nachdem die Schleife begonnen hat. FOR/F speichert das gesamte Ergebnis des DIR-Befehls vor Beginn der Iteration, sodass die neu erstellten Ordner garantiert nicht stören.

+0

Danke. Dies ist sehr nahe am Erreichen des Ziels. Das einzige Problem ist, dass die Dateien auf der gleichen Ebene wie die Ordner verschoben werden, die sie eigentlich enthalten sollten (was ich als "nützlicher Ordner x von N" bezeichnete). Wie folgt: https://snag.gy/HFawxS.jpg – z8080

+0

Oh, und ich stelle fest, dass diese nützlichen Ordnernamen (diejenigen, die sofort die Dateien enthalten) in der Tat die gleichen über Personen sind. Aber das sollte kein Problem sein, da jeder von ihnen im Ordner der Person liegt. – z8080

+0

Leider bin ich in dieser Skriptsprache völlig unversucht, daher kann die wahrscheinlich triviale Änderung an Ihrem Code das Verhalten nicht ändern. Oder wenn es einfacher ist, könnten Sie vielleicht Ihrem Code einige kurze Kommentare hinzufügen, damit ich ihn selbst debuggen kann. Danke nochmal für deine Hilfe! – z8080

Verwandte Themen