mik.c.os
Goto Top

(CMD) verzeichnis auflösen

hallo, ich versuche gerade verzweifelt ein befehl zusammenzuzimmern

es soll alle dateien & unterverzeichnisse eine ebene höhr verschieben
und dann das verzeichnis entfernen

ich habe das ganze schon mit robocopy bewerkstelligen können
robocopy "%~1" "%~1\.." /E /move

das problem:
robocopy verschiebt nicht wirklich sondern kopiert und köscht dann

da meine dateien auf dem selben volume nur eine ebene höhr versoben werden soll
und das z.t. gigabyte weise, ist es schon eine ziehmliche zeitverschwendung

es gibt ja noch den befehl move
das problem mit move ist, das es keine unterverzeichnisse verarbeitet

wenn man versuch das ganze in eine FOR-schleife zu packen gibt es schon wieder ein problem
denn wenn ich eine verzeichnisliste anvertigen will, müsste sie relative-pfade erzeugen,
da 1# das script schön dynamisch sein soll und 2# die ordnerstruktur gewart bleiben soll

ich habe noch kein weg gefunden wie ich den pfad %cd% (arbeitsverzeichnis) in %1 wegkürzen kann

also nochmal zurrück zum anfang
ich suche eine möglichkeit alle dateien/verzeichnisse mit struktur eine ebene höhr zu verschieben
welcher schneller arbeitet als robocopy (echtes moving)

[windows 7 ultimate x64]

p.s.
ich versuche es möglichst erstmal mit windows eigenen "on-board" werkzeugen zu lösen...

falls jemand ein grund von mir verlangt, dem sei gesagt:
sieht es als ein lernprozess um die grenzen von windows zu durchbrechen :P
Kommentar vom Moderator Biber am 11.12.2010 um 22:54:26 Uhr
hallo, ich versuche gerade verzweifelt ein befehl zusammenzuzimmern
Na dann verschieb ich dich mal von "Windows-oder-wie-es-heisst" nach "Batch & Shell".
Wer schickt denn immer diese Verzweifelten in unser Forum?

Content-Key: 156811

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

Ausgedruckt am: 28.03.2024 um 12:03 Uhr

Mitglied: bastla
bastla 11.12.2010 um 22:33:09 Uhr
Goto Top
Hallo Mik.c.OS!
das problem mit move ist, das es keine unterverzeichnisse verarbeitet
Würde ich der Gerüchteküche zuordnen ...

Soll demnach das derzeitige "Start"-Verzeichnis der Struktur aufgelassen werden? Wenn ja, würde ich das (völlig ungetestet) so versuchen:
pushd %1
for /f "delims=" %%i in ('dir /a /b') do move "%%i" ..  
popd
rd %1
Achtung: In einem Batch überschreibt "move" ohne Rückfrage (daher vielleicht noch ein "if not exist" ergänzen)!

Das "rd" hat übrigens absichtlich kein "/s /q" - falls trotz des "/a" beim "dir" nicht alle Dateien / Verzeichnisse "erwischt" worden sein sollten ...

Grüße
bastla
Mitglied: Mik.c.OS
Mik.c.OS 11.12.2010 um 23:34:05 Uhr
Goto Top
wow. klappt

erklär mir bitte mal das
hat das wasmit "pushd" & "popd " zu tun? warum nicht ohne?

[edit:]
hab mir mal das ganze etwas nähr angeschaut
ergebnis:
die codezeile:
for /f "delims=" %i in ('dir "%~1" /a /b') do move "%i" ..
reicht völlig aus

warum ich FOR nicht weiter verfolgt habe lag an der tatsache,
dass move allein keine "%dir%\*" unterverzeichnisse unterstützt
und dir alleine keine relativen pfadnahmen erzeugte

dabei liefert "dir /a" alles was ich gebraucht hätte...

move kann ja doch unterverzeichnisse mitkopieren, indem man das stammverzeichnis kopiert,
will man aber nur den inhalt mit wildcards * kopieren, so klappt es nicht

aber zugegeben ist move blöd programiert,
mit einer besseren wildcard unterstützung währe einiges leichter und man könnte auf for-schleifen verzichten...

ich sehe so viel design fehler in den cmd-tools von windows, einige sind z.t. antik
warum die nicht mal repariert werden... *kotz*

[p.p.s.:]
übrigens habe ich den ganzen spaß auch mit cmd/powershell umsetzen können
powershell move-item -path \"%drop%\*\" -destination \"%drop%\..\"
leider ein 'ab windows 7 only" bzw. extra nachinstallieren von powershell...
auf ' statt \" habe ich verzichtet, weil es probleme mit dateinamen verusacht, welche ' im dateinamen verwenden
ich frage mich ob das unter linux auch so ist, müsste mal einer testen
sonderzeichen in dateinamen ist immerwieder lustig :P
Mitglied: bastla
bastla 11.12.2010 um 23:41:01 Uhr
Goto Top
Hallo Mik.c.OS!
hat das wasmit "pushd" & "popd " zu tun?
Das Wechseln in den Zielordner macht's nur einfacher - als Ziel des "move" genügt dann "..", ein relativer (bzw der übergeordnete) Pfad muss dann gar nicht ermittelt werden ...

Grüße
bastla
Mitglied: Mik.c.OS
Mik.c.OS 12.12.2010 um 00:04:52 Uhr
Goto Top
ich habe mein vorigen beitrag bearbeitet

"pushd" & "popd " werden nicht zwingend benötigt
in der codezeile hab ich den löschbefel mal weggelassen...
Mitglied: bastla
bastla 12.12.2010 um 00:25:00 Uhr
Goto Top
Hallo Mik.c.OS!
for /f "delims=" %i in ('dir "%~1" /a /b') do move "%i" ..
reicht völlig aus
Mit nur einem "%"-Zeichen für die Schleifenvariable in einem Batch schon mal gar nicht (und wenn es kein Batch ist, ist "%~1" leer, womit wir wieder bei meinem Ansatz oben wären), und ansonsten auch nur, wenn Du aus dem entsprechenden Verzeichnis startest (dann wiederum ist "%~1" auch unnötig und es braucht natürlich auch kein "pushd", um in dieses Verzeichnis zu wechseln) ...

Wenn der Batch tatsächlich allgemein verwendbar (und von einem beliebigen Pfad aus startbar) sein soll, müsstest Du komplette Pfade (auch für das Ziel, da sich ".." ohne Pfad davor auf das Verzeichnis, von dem aus gestartet wurde, bezieht) erzeugen, da ja "dir /b" nur Datei-/Verzeichnisnamen, aber (ohne "/s", und das wäre hier kontraproduktiv) keine vollständigen Pfade liefert:
for /f "delims=" %%i in ('dir "%~1" /a /b') do move "%~1\%%i" "%~1\.."
Grüße
bastla
Mitglied: Mik.c.OS
Mik.c.OS 12.12.2010 um 01:19:49 Uhr
Goto Top
hast schon recht, ich hätt das doppelte "%"-zeichen für diesen beitrag nicht wegkürzen dürfen.
das mit den pfaden ist gut zu wissen. thx

übrigens wenn man den ganzen spaß in den explorer inegrieren will,
dann kommt sowas dabei raus
cmd /c if 0==0 (for /f "delims=" %%i in ('dir "%V" /a /b') do move "%%i" ..) & cd .. & rd /s /q "%V" & explorer "%V\.."
%V deshalb weil es dieser regestryschlüssel ist (funktioniert glabe ich erst ab windows 7)
HKEY_CLASSES_ROOT\Directory\Background\shell\zz.SuspendDir\command

if 0==0 brauchte ich um den for befehl zu seperieren,
da der for befehl sonnst die "&"-kettenbefehle mit ausfürt
da der cmd prozess sich auch noch selbst im weg steht muss man mit cd .. das verzeichnis verlassen

mit einer verlinkten script.cmd währe es vielleicht einfacher gewesen, aber ich wollte halt ein "single"-befehl in der regestry... :P
ziel erreicht XD