easyvdr
Goto Top

Unterordner in A-Z Ordnerstruktur einsortieren per (Windows) Batch Datei

vorhandene Ordnerstruktur in übersichtliche 0-9, A-Z Struktur verschieben/kopieren

Hallo,
Ich bin nicht wirklich fit was Batch Dateien angeht, und scheitere deshalb an einer Batchdatei die mir etwas Arbeit abnehmen soll:

Ich habe einen Ordner mit vielen verschiedenen Unterordern - nun möchte ich diese in eine bereits vorhandene 0-9 und A-Z Struktur einsortieren.

Die Batch-Datei soll also den ersten Buchstaben des Ordner-names erkennen und diesen dann mit allen darin vorhandenen Dateien in einen Ordner verschieben.

Z.B. sind folgende Ordner vorhanden:

Rügen-Urlaub, Rialto-Eisessen, Egenhausen-Turnier, Estland

diese sollen dann entweder in den Ordner E oder R verschoben werden,
falls in E z.B. schon ein Ordner Egenhausen vorhanden ist, soll der neu zu verschiebende Ordner in NeuEgenhausen oder etwas anderes umbenannt werden.

Klar könnte ich das auch so machen wie bisher: Im Explorer nach Alphabet sortieren und dann per Maus verschieben, aber da Wöchentlich mehrere neue Ordner dazu kommen wird mir das auf dauer relativ lästig...

einzelne Dateien mit bestimmten Anfangsbuchstaben zu verschieben bekomme ich hin, aber ich weiß leider nicht wie ich die Anfangsbuchstaben von Ordnern auslesen kann und diese Ordner verschieben kann

Vielen Dank schon im vorraus für eure Hilfe!!!

Content-Key: 97549

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

Printed on: April 19, 2024 at 10:04 o'clock

Member: bastla
bastla Sep 22, 2008 at 18:39:51 (UTC)
Goto Top
Hallo EasyVdr und willkommen im Forum!

Das könnte etwa so gehen:
@echo off & setlocal
set "Quelle=D:\Alle Meine Fotos"  
set "Ziel=D:\Fotos alphabetisch"  
for /d %%i in ("%Quelle%\*.*") do call :ProcessDir "%%i"  
goto :eof

:ProcessDir
set "Verz=%~nx1"  
echo Bearbeite: %Verz%
set "B=%Verz:~,1%"  
if not exist "%Ziel%\%B%\" goto :eof  
set /a Index=1
:Check
if not exist "%Ziel%\%B%\%Verz%" goto :MoveIt  
set Index+=1
set "Verz=%~nx1-%Index%"  
goto :Check

:MoveIt
move %1 "%Ziel%\%B%\%Verz%">nul  
goto :eof
Wenn Du zuerst nur testen willst, ersetze die Zeile 20 durch:
echo Verschiebe %~nx1 nach "%Ziel%\%B%\%Verz%"  
Soferne der passende Ziel-Unterordner noch nicht vorhanden ist (etwa weil der Name des zu verschiebenden Ordners mit "!" beginnt), wird der betreffende Ordner einfach an seinem Platz gelassen.

Anders als von Dir vorgeschlagen, wird für den Fall, dass im Zielordner bereits ein gleichnamiger Ordner vorhanden ist, eine laufende Nummer angefügt - das Ergebnis wäre lt Deinem Beispiel dann: "Egenhausen-Turnier-2"; sollte es auch diesen Ordner schon geben, wird der Index solange erhöht, bis die nächste freie Nummer gefunden wird (zB "Egenhausen-Turnier-5").

Grüße
bastla
Member: EasyVdr
EasyVdr Sep 22, 2008 at 20:13:28 (UTC)
Goto Top
Danke für die wahnsinnig schnelle Hilfe!!!

Das Skript funktioniert perfekt!

Hab auch gleich die Härte-Fälle getestet:
- Ordner in Ziel-Ordner schon vorhanden -> laufende Nummer wird hinzugefügt!
- mehrere Ordner mit gleichem Anfangsbuchstaben -> kein Problem!

Einfach super!!
Member: EasyVdr
EasyVdr Sep 22, 2008 at 21:08:47 (UTC)
Goto Top
Ich hab gerade festgestellt dass move nur bei gleichen Partitionen funktioniert - ich habe deswegen die :MoveIt etwas angepasst:

 

:MoveIt
xcopy %1 "%Ziel%\%B%\%Verz%" /s /i /c /h /e /r /k /d /y  
del %1 /Q
rmdir %1
goto :eof

So funktionierts auch über Partitionen/Laufwerke hinweg. Vielleicht sogar auch auf Netzlaufwerke, aber das kann ich erst am Wochenende testen
Member: bastla
bastla Sep 22, 2008 at 21:22:44 (UTC)
Goto Top
Hallo EasyVdr!

Nur als Anmerkung: die "xcopy"-Schalter "/s" ("/e" erledigt das mit) sowie (da im Zielordner nichts zu überschreiben ist - dieser wurde ja eben erst erstellt) "/r", "/d" und "/y" sind überflüssig, und mit
rd /s /q %1
kannst Du den Ordner samt Unterordnern und Dateien eliminieren (was die "del"-Zeile einspart).

Grüße
bastla
Member: Roschka
Roschka Jun 17, 2010, updated at Oct 18, 2012 at 16:42:34 (UTC)
Goto Top
Hallo, auch wenn der Tread schon etwas älter ist, das Problem ansich interessiert mich:
Dateien alphabetisch sortiert zu kopieren=verschieben per BATCH.

Die Befehle move und xcopx bewegen alle Dateien nur in der Reihenfolge, wie sie zufällig in der $MFT stehen (in der Reihenfolge ihrer Erstellung).

Ich möchte aber sicherstellen, daß diese trotzdem in alphanumerischer Reihenfolge bewegt werden! Denn dann werden sie auf einem anderen Datenträger in alphanummerischer Reihenfolge in die FAT=MFT geschrieben.

Doch genau darauf ging hier noch keiner ein.
Außerdem bewegt der Befehl move alle Dateien, auch aus Unterverzeichnissen in NUR EINE Zielebene!
Der Befehl xCopy bewegt ganze Verzeichnisstrukturen, aber eben unsortiert!

Per "dir /b /S "Quelle" >Dateienliste.txt" kann man eine Liste anlegen, die sich mit "sort Dateienliste.txt Dateiensortiert.txt" sortieren läßt und in einer BATCH als Quelle für "move" verwenden läßt.
Aber: man müßte für move eine Stringverarbeitung einbauen, die die Verzeichnisstruktur von QUELLE für ZIEL zusammenbastelt. So daß eine Befehlszeile dynamisch erzeugt wird, die etwa so aussähe:

move D:\Alle Meine Fotos\Urlaub1998\*.jpg H:\Fotos alphabetisch\Urlaub1998\

wobei %Pfad%*.jpg aus der alphabetisch sortierten Liste zeilenweise entnommen werden soll, und \Urlaub1998\ auch ganz anders heißen könnte/können sollte.

Zweck:
viele MP3-Player, DVD-Player, digitale Bilderrahmen, spielen die Dateien in der Reihenfolge des Kopierens und somit der FAT=MFT ab und nicht alphabetisch!

Ich habe neulich über tausend mühevoll zusammengestellte und sortierte, sortiert benannte Fotos auf eine SD-Karte kopiert. Doch die ganze Mühe war umsonst, weil der Player/Bilderrahmen die Dateien "wild durcheinander" anzeigt!

Für das Problem des Aufteilens der vollen Pfadnamen habe ich in diesem Tread Batch zum Dateien bewegen zwar einen Gedankenansatz gefunden, aber leider noch nicht ganz vollständig verstanden.
Aus einer Zeile wie z.B.:
for /f "tokens=1-2* delims=_." %%i in ('dir /b *_*') do move %%i_%%j.%%k "%Ziel%\%%jTag"
müßte ich etwa das machenface-sad?)
for /f "tokens=1-2* delims=\" %%i in ('dir /b /s *.*') do move %%i_%%j.%%k "%Ziel%\%subdir1\%subdir2<\%subdir3>"
wobei mir unklar ist was "tokens=1-2" bedeutet und meine Dateinamen keine Datumsangaben enthalten und auch nicht danach einsortiert werden sollen, sondern in die alte Verseichnisstruktur im neunen Ziel mit altem Dateinamen. Die Anzahl der Subdirs ist variabel je nach Quelle.
Mit delims=\ wird wohl das Trennzeichen festgelegt? Kann es richtiger sein delims=:\ zu verwenden um auch den Laufwerksbuchstaben zu entfernen?
Member: bastla
bastla Jun 18, 2010 at 06:47:59 (UTC)
Goto Top
Hallo Roschka und willkommen im Forum!

Was mir noch nicht klar ist: Einerseits bemängelst Du
Außerdem bewegt der Befehl move alle Dateien, auch aus Unterverzeichnissen in NUR EINE Zielebene!
andererseits ging es in dem Thread ja um das Verteilen der Dateien nach Anfangsbuchstaben in entsprechende (Alpha-)Zielordner - insofern könnte die vorgegebene Verzeichnisstruktur ja ohnehin nicht beibehalten werden; daher: Kannst Du bitte (und ein neuer Thread hätte sich dafür besser geeignet) Dein Vorhaben soweit konkretisieren, dass Du anhand einiger Beispiele für Quelle und Ziel darstellst, was Du genau erreichen willst?

Für ein einfaches "Umlagern" in eine neue Struktur unter Berücksichtigung der alphabetischen Reihenfolge innerhalb jedes einzelnen Verzeichnisses könnte das, auf Basis Deines Beispieles, etwa so aussehen:
@echo off & setlocal
set "Typ=jpg"  
set "Basis=D:\Alle Meine Fotos\Urlaub1998"  
set "Ziel=H:\Fotos alphabetisch\ganz anders"  

for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do call :ProcessFile "%%i"  
pause
goto :eof

:ProcessFile
set "Pfad=%Ziel%%~dp1"  
call set "Pfad=%%Pfad:%Basis%=%%"  
echo md "%Pfad%" 2>nul  
echo move %1 "%Pfad%"  
goto :eof
Es wird mit dieser Skizze (wegen der beiden "echo" am Beginn der Zeilen 13 und 14) nur eine Ausgabe der Befehle erzeugt, aber noch kein Zielverzeichnis erzeugt und keine Datei verschoben ...

Grüße
bastla
Member: Roschka
Roschka Jun 19, 2010 at 00:09:27 (UTC)
Goto Top
Zitat von @bastla:
Hallo bastla, danke für deine Antwort.

Was mir noch nicht klar ist: Einerseits bemängelst Du
> Außerdem bewegt der Befehl move alle Dateien, auch aus Unterverzeichnissen in NUR EINE Zielebene!
Mein erster Versuch mit move ohne Unterverzeichnisse klappe ja (Vorher mit dir eine Dateiliste erstellt und mit sort sortiert, diese dann als Quelle für move), doch dann versuchte ich es mit Unterverzeichnissen bei Quelle und alles landete im Wurzelverzeichnis des Ziellaufwerkes. Nicht aber wieder in Unterordnern.

andererseits ging es in dem Thread ja um das Verteilen der Dateien nach Anfangsbuchstaben in entsprechende (Alpha-)Zielordner -
Stimmt. Und der Ansatz Zielordner zu erzeugen, die auf Teilen der Quellnamen basieren interessiert mich. Die hier weiter oben vorgeschlagene Lösung paßt aber so nicht wirklich für mich, weil nur Teile des Dateinamens zur Zielpfadgenerierung verwendet wurden.

insofern könnte die vorgegebene Verzeichnisstruktur ja ohnehin nicht beibehalten werden;
Für den Treadersteller war es wichtig viele Dateien aus einem Ordner heraus zu sortieren.
Für mich dabei interessant der Zielaufbau.

daher: Kannst Du bitte (und ein neuer Thread hätte sich dafür besser geeignet)
Ich versuche es. ;) (Ein neuer Tread, ja, aber es gibt schon viele die ähnlich wie mein Problem klingen und doch anders sind. Wie finde ich den aussagekräftigsten Betreff?)

Dein Vorhaben soweit konkretisieren, dass Du anhand einiger Beispiele
für Quelle und Ziel darstellst, was Du genau erreichen willst?
Also: ich habe keine feststehende Struktur (die vielleicht automatisch generiert würde), sondern ich möchte ein flexibles Skript, das für viele Quellpfade verwendbar ist.
set "Basis=D:\Alle Meine Fotos\Urlaub1998"
set "Ziel=H:\Fotos alphabetisch\ganz anders"
ist mir zu starr. Bei mir müßte es heißen:
set "Basis=D:\Alle Meine Fotos\Urlaub1998"
set "Ziel=H:\Alle Meine Fotos\Urlaub1998"

besser aber noch:
set Basis=%1
set Ziel=%2
denn meiner "moveetwas.bat" sollen auf der Kommandozeile die zwei Parameter Quelle und Ziel übergeben werden. und es soll sich nicht um bestimmte Dateitypen handeln.
Der Zielpfad soll also aus Teilen des Quellpfades generiert werden, nur ist Ziel meist ein anderer Laufwerksbuchstabe und eventuell darin ein anderer Erstordner, die sonstige Struktur der Ordner aber identisch an Parameter Ziel angehängt.
Also angenommen ich habe eine Quelle F:\Bilder\Celebrities\AngelinaJolie\
darin die Dateien
Angelina101.jpg
Angelina_Filmographie.txt
Angelina002.jpg
...
angelina174.jpg
und möchte diese auf eine SD-Karte aber alphabetisch sortiert kopiert haben für einen digitalen Bilderrahmen, der ja nur FAT hat. Das Quelllaufwerk ist eine FAT32-Partition. In deren MFT stehen die Dateien aber nicht in alphabetischer Reihenfolge, sondern in der Reihenfolge der Erstellung=ersten Speicherung. Auf dem digitalen Bilderrahmen, der Dateien in der Reihenfolge seiner FAT anzeigt, werden diese Bilder "wild durcheinander" angezeigt.
Ähnliches Problem ein MP3-Player mit SD-Karte. Die Titel stammen nicht von einem kontinuierlichen CD-Rip, sondern sind Ergebnis einer stückweisen Sammlung, so wie Angelinas Bilder auch. Der MP3-Player soll die Dateien aber alphanumerisch abspielen, und nicht "wild durcheinander"!
Für den digitalen bilderrahmen gilt das gleiche: er soll Bilder chronologisch=alphanumerisch abspielen und nicht "wild durcheinander, wie sie gerade vom WinExplorer kopiert wurden.
Ich las neulich NTFS würde die MFT alphanumerisch sortieren. Kann sein und wäre gut. FAT und FAT32 tun das nicht. daher der Wunsch nach einer BATCH-Datei, die das regelt. Wie ich das sortieren kann weis ich.

Ginge es nur um das reine kopieren/verschieben, bräuchte man keine BATCH-Datei, weil das auch der WinExplorer kann.

Für ein einfaches "Umlagern" in eine neue Struktur unter Berücksichtigung der alphabetischen Reihenfolge
innerhalb jedes einzelnen Verzeichnisses könnte das, auf Basis Deines Beispieles, etwa so aussehen:
@echo off & setlocal
> set "Typ=jpg"  
> set "Basis=D:\Alle Meine Fotos\Urlaub1998"  
> set "Ziel=H:\Fotos alphabetisch\ganz anders"  
> 
> for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do call :ProcessFile "%%i"  
> pause
> goto :eof
> 
> :ProcessFile
> set "Pfad=%Ziel%%~dp1"  
> call set "Pfad=%%Pfad:%Basis%=%%"  
> echo md "%Pfad%" 2>nul  
> echo move %1 "%Pfad%"  
> goto :eof
> 
Es wird mit dieser Skizze (wegen der beiden "echo" am Beginn der Zeilen 13 und 14) nur eine Ausgabe der Befehle
erzeugt, aber noch kein Zielverzeichnis erzeugt und keine Datei verschoben ...

Das mit dem ECHO ist mir klar., aber nicht was %-dp1 bedeutet.
Ich las schon mehrere Batch-Tutorials, aber nie wurde die String-verarbeitung erklärt.
Ich arbeite seit einiger zeit mit WinXP, aber parallel noch mit anderen Betriebssystemen, die NTFS nicht können. Daher habe ich mehrere Partitionen mit FAT32 und in vielen Jahren gewachsenen Dateienbeständen. Ich arbeite seit fast 20 Jahren mit Computern. zuerst AmigaOS, später kamen Win3.1, Win95, Win98 bis hin zu XP dazu. Ansatzweise kenne ich Mac und Linux. Ich will hier aber keinen Betriebssystemstreit erzeugen.

Anderes Beispiel, gleiches Problem:
ich möchte die Bildersammlung von Poserbildern von der festplatte auf die SD-Karte kopieren. Pfade sollen teilweise übernommen werden. ich möchte meine BATCH damit aufrufen:
moveetwas.bat Q:\Metacreations\Poser\Bilder\fremde\*.* H:\Poser\Bilder\fremde
funktioniert solange ich nur in der Ebene \fremde\ bleibe.
Da das inzwischen weit über 500 sind und ich auch einen Ordner \eigene\ habe, dies aber nicht in der BATCH "fest verankern" will, soll die BATCH aus

moveetwas.bat Q:\Metacreations\Poser\Bilder\*.* H:\Poser\

die Zeilen generieren, die dann so aussehen könnten

move Q:\Metacreations\Poser\Bilder\fremde\11elf - Runen kh.jpg h:\Poser\Bilder\fremde\
move Q:\Metacreations\Poser\Bilder\fremde\11elf - Runen R.jpg h:\Poser\Bilder\fremde\
move Q:\Metacreations\Poser\Bilder\eigene\Victoria_01.jpg h:\Poser\Bilder\eigene\
usw.
Es muß also aus dem Quellpfad \Bilder\fremde\ und \Bilder\eigene\ ausgeschnitten werden und an %%Ziel angehängt. Oder eben andere Ordnernamen in anderen Fällen, daher variabel.


Grüße
Ronald
Member: bastla
bastla Jun 19, 2010 at 00:36:35 (UTC)
Goto Top
Hallo Ronald!
set "Basis=D:\Alle Meine Fotos\Urlaub1998"
set "Ziel=H:\Fotos alphabetisch\ganz anders"
ist mir zu starr. Bei mir müßte es heißen:
set "Basis=D:\Alle Meine Fotos\Urlaub1998"
set "Ziel=H:\Alle Meine Fotos\Urlaub1998"
Auch in Deinem Fall muss aber eine Quelle (Basis) und ein Ziel angegeben/festgelegt werden - woher sollte der Batch wissen, ob der relative Pfad bereits nach "D:\" oder erst nach "D::\Alle meine Fotos" oder noch tiefer in der Struktur beginnen soll?
Es muß also aus dem Quellpfad \Bilder\fremde\ und \Bilder\eigene\ ausgeschnitten werden und an %%Ziel angehängt. Oder eben andere Ordnernamen in anderen Fällen, daher variabel.
Bis auf die von Dir ohnehin schon angedeutete Möglichkeit, die Pfade als Parameter zu übergeben (also die Zeilen 2 und 3 auf
set "Basis=%~1"
set "Ziel=%~2"
abzuändern), sollte mein Batchbeispiel eigentlich zu dieser Anforderung passen ...
moveetwas.bat Q:\Metacreations\Poser\Bilder\*.* H:\Poser\

die Zeilen generieren, die dann so aussehen könnten

move Q:\Metacreations\Poser\Bilder\fremde\11elf - Runen kh.jpg h:\Poser\Bilder\fremde\
move Q:\Metacreations\Poser\Bilder\fremde\11elf - Runen R.jpg h:\Poser\Bilder\fremde\
move Q:\Metacreations\Poser\Bilder\eigene\Victoria_01.jpg h:\Poser\Bilder\eigene\
Dazu müsste aber der Batchaufruf mit
moveetwas.bat Q:\Metacreations\Poser\Bilder\*.* H:\Poser\Bilder
erfolgen (wäre zumindest aus meiner Sicht einfacher, als zwei oder mehr Batches zu erzeugen, die sich eigentlich nur darin unterscheiden müssten, dass sie eine unterschiedliche Anzahl von Ordnern am Ende des Quellpfades in den Zielpfad übernehmen) ...
Zur Zerlegung von Schleifenvariablen (wie etwa nur Verwendung von Laufwerk und Pfad = %%~dpi bzw %~dp1, wenn ein Parameter unterteilt werden soll) siehe "for /f" (ziemlich gegen Ende), die Erzeugung von Teilstrings und deren Ersetzung wird in der Hilfe zu "set" beschrieben ...

[Nachtrag]
Eine Variation des obigen Batches zum Kopieren (inkl versteckter / System-Dateien) mit der Möglichkeit, wie gewünscht auch die Dateiauswahl der Quelldaten per Aufrufparameter zu steuern, sähe etwa so aus:
@echo off & setlocal
set "Dateien=%~nx1"  
set "Basis=%~dp1"  
set "Ziel=%~2"  

for /f "delims=" %%i in ('dir /s /b /on /a-d "%Basis%%Dateien%"') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "Pfad=%Ziel%\%~dp1"  
call set "Pfad=%%Pfad:%Basis%=%%"  
xcopy /L /yhrkf %1 "%Pfad%*"|findstr /v /c:"1 Datei(en) kopiert"  
goto :eof
Auch dieser Batch ist im "Testmodus" - nach dem Entfernen des "xcopy"-Schalters "/L" wird tatsächlich kopiert ...

Der Aufruf muss in diesem Fall nach dem Muster
copyetwas.cmd Q:\Metacreations\Poser\Bilder\*.* H:\Poser\Bilder
erfolgen, wobei beim erster Parameter die Angabe der Dateien (sinnvoller Weise per Wildcard/s) erforderlich ist - also etwa auch:
copyetwas.cmd Q:\Metacreations\Poser\Bilder\201?-*.jpg H:\Poser\Bilder
[/Nachtrag]

Grüße
bastla

P.S.: Ob in diesem oder einem neuen Thread: Verwende bitte "<code>"- und "</code>"-Tags zum Posten von (Batch-)Code ...
Member: Roschka
Roschka Jun 19, 2010 at 09:51:16 (UTC)
Goto Top
Hallo bastla,
danke für die Antwort.
Da die Klärung meiner Problemstellung doch ausschweifender wird, als ich zuerst dachte, würde ich einen Moderator bitten, wenn möglich meinen Teil dieses Treads in einen neuen zu verlagern und nur jeweils einen Linkverweis auf den anderen einzubauen, da es jetzt doch zu weit von dem Ursprungsproblem des Treaderöffners abweicht.
Titelvorschlag: "Wie Pfadbestandteile des Quellpfades in Zielpfad einer BATCH einbauen per Stringverarbeitung?"

und ja ich werde in zukunft "
"-und-"  
" verwenden.

Ich habe dein copyetwas.cmd ausprobiert, aber leider tut es immer noch nicht was ich erreichen will. Ich denke man muß bei
for /f "delims=" %%i in ....  
besser "delims=\" verwenden, weil das der Ordnertrenner ist an dem ich aufteilen will.

Wenn ich in der Befehlszeile
c:\copyetwas.bat f:\Bilder\AdamUndEva\ M:\Bilder\
eingebe, kommt folgende Bildschirmmeldung (kürzere Teilbeispiele):
F:\Bilder\AdamUndEva\.picasa.ini -> M:\Bilder\.picasa.ini
0 Datei(en) kopiert
F:\Bilder\AdamUndEva\16137_fastentuch-01_Adam+Eva.jpg -> M:\Bilder\16137_fastentuch-01_Adam+Eva.jpg
F:\Bilder\AdamUndEva\2816_Paar.jpg -> M:\Bilder\2816_Paar.jpg
F:\Bilder\AdamUndEva\Adam-and-Eve-Posters.jpg -> M:\Bilder\Adam-and-Eve-Posters.jpg
F:\Bilder\AdamUndEva\Adam-and-Eve-Posters2.jpg -> M:\Bilder\Adam-and-Eve-Posters2.jpg
F:\Bilder\AdamUndEva\Eve_tempted.jpg -> M:\Bilder\Eve_tempted.jpg
F:\Bilder\AdamUndEva\pano.jpg -> M:\Bilder\pano.jpg
F:\Bilder\AdamUndEva\pano.txt -> M:\Bilder\pano.txt
F:\Bilder\AdamUndEva\pspbrwse.jbf -> M:\Bilder\pspbrwse.jbf
Wie man sieht geht der Ordnername "AdamUndEva" verloren im Zielpfad! Aber \AdamUndEva\ hat keine Subordner!

Verwende ich dein copyetwas.cmd auf einen anderen Ordner mit Subordnern, passiert dann doch ungefähr das was ich will:
(Ausgabe in DOS-Box)
F:\Bilder\Alboin\4bc-Dateien\Born2.gif -> M:\Bilder\4bc-Dateien\Born2.gif
F:\Bilder\Alboin\4bc-Dateien\centBarREV.gif -> M:\Bilder\4bc-Dateien\centBarREV.gi
F:\Bilder\Alboin\4bc-Dateien\NavA.gif -> M:\Bilder\4bc-Dateien\NavA.gif
F:\Bilder\Alboin\4bc-Dateien\NavC.gif -> M:\Bilder\4bc-Dateien\NavC.gif
F:\Bilder\Alboin\4bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\4bc-Dateien\S
F:\Bilder\Alboin\4bc-Dateien\ScavNav.gif -> M:\Bilder\4bc-Dateien\ScavNav.gif
F:\Bilder\Alboin\4bc-Dateien\TSTitle.gif -> M:\Bilder\4bc-Dateien\TSTitle.gif
F:\Bilder\Alboin\3bc-Dateien\Blkbkg.gif -> M:\Bilder\3bc-Dateien\Blkbkg.gif
F:\Bilder\Alboin\3bc-Dateien\Born2.gif -> M:\Bilder\3bc-Dateien\Born2.gif
F:\Bilder\Alboin\3bc-Dateien\centBarREV.gif -> M:\Bilder\3bc-Dateien\centBarREV.gi
F:\Bilder\Alboin\3bc-Dateien\NavA.gif -> M:\Bilder\3bc-Dateien\NavA.gif
F:\Bilder\Alboin\3bc-Dateien\NavC.gif -> M:\Bilder\3bc-Dateien\NavC.gif
F:\Bilder\Alboin\3bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\3bc-Dateien\S
F:\Bilder\Alboin\3bc-Dateien\ScavNav.gif -> M:\Bilder\3bc-Dateien\ScavNav.gif
F:\Bilder\Alboin\3bc-Dateien\TSTitle.gif -> M:\Bilder\3bc-Dateien\TSTitle.gif
F:\Bilder\Alboin\2bc-Dateien\Blkbkg.gif -> M:\Bilder\2bc-Dateien\Blkbkg.gif
F:\Bilder\Alboin\2bc-Dateien\Born2.gif -> M:\Bilder\2bc-Dateien\Born2.gif
F:\Bilder\Alboin\2bc-Dateien\centBarREV.gif -> M:\Bilder\2bc-Dateien\centBarREV.gi
F:\Bilder\Alboin\2bc-Dateien\NavA.gif -> M:\Bilder\2bc-Dateien\NavA.gif
F:\Bilder\Alboin\2bc-Dateien\NavC.gif -> M:\Bilder\2bc-Dateien\NavC.gif
F:\Bilder\Alboin\2bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\2bc-Dateien\S
F:\Bilder\Alboin\2bc-Dateien\ScavNav.gif -> M:\Bilder\2bc-Dateien\ScavNav.gif
F:\Bilder\Alboin\2bc-Dateien\TSTitle.gif -> M:\Bilder\2bc-Dateien\TSTitle.gif
F:\Bilder\Alboin\1bc-Dateien\Blkbkg.gif -> M:\Bilder\1bc-Dateien\Blkbkg.gif
F:\Bilder\Alboin\1bc-Dateien\Born2.gif -> M:\Bilder\1bc-Dateien\Born2.gif
F:\Bilder\Alboin\1bc-Dateien\CaesarBtn.gif -> M:\Bilder\1bc-Dateien\CaesarBtn.gif
F:\Bilder\Alboin\1bc-Dateien\centBarREV.gif -> M:\Bilder\1bc-Dateien\centBarREV.gi
F:\Bilder\Alboin\1bc-Dateien\NavA.gif -> M:\Bilder\1bc-Dateien\NavA.gif
F:\Bilder\Alboin\1bc-Dateien\NavC.gif -> M:\Bilder\1bc-Dateien\NavC.gif
F:\Bilder\Alboin\1bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\1bc-Dateien\S
F:\Bilder\Alboin\1bc-Dateien\ScavNav.gif -> M:\Bilder\1bc-Dateien\ScavNav.gif
F:\Bilder\Alboin\1bc-Dateien\TSTitle.gif -> M:\Bilder\1bc-Dateien\TSTitle.gif
Wie man sieht werden die Subordner von Alboin als Subordner im %%Ziel M:\Bilder\ angelegt und sogar sortiert bearbeitet! Jedoch geht wiederum \Alboin\ verloren.
Das bedeutet ich hätte
copyetwas.bat F:\Bilder\Alboin\ M:\Bilder\Alboin\
schreiben müssen, oder wie ich jetzt ausprobierte, beim Quellpfad den letzten Backslash weglassen müssen! AHA!!!
Denn nun wird \Alboin\ im Zielpfad eingebaut!
Damit sind wir auf dem Weg den ich suchte.
Funktioniert das aber statt mit xcopy auch mit move?

Und hier mal noch der code, den ich zuerst geschrieben hatte, der nur mit einer Ebene funktioniert, und den ich umbauen wollte:
move2.bat
@ECHO OFF
:anfang
IF "%1"=="/?" GOTO help  
IF "%1"=="" GOTO fehler  
IF "%2"=="" GOTO fehler2  
echo Die aktuelle Datei heißt %0%.
REM Dieser Befehl erzeugt eine Pfad:Datei-Liste ohne Zusatzinfos und aber sortiert, jedoch mit vollem Pfad.
dir /N /b /O:N /X %1 > Dateiliste.txt
REM den Parameter /S von DIR mußte ich wieder entfernen, weil alles nur in eine flache Zielstruktur kopiert wird.
set TEXT_T="Dateiliste.txt"  
for /f "eol= tokens=* delims= usebackq" %%i in (%TEXT_T%) do (  
echo move "%%i" %2 >>movelist.bat  
)
REM die folgende zeile kann auskommentiert werden
call notepad Dateiliste.txt
call notepad movelist.bat
GOTO ende
REM (ewentuell weitere Befehle)
:help
echo move2.bat $VER:0.4  17.05.2010
echo Nutzen: Dateien und Ordner in sortierter Form verschieben.
echo.
echo SYNTAX: move2.bat [Quelle:] [Ziel:]
echo.
GOTO ende
:fehler
echo "1. Parameter fehlt!"  
:fehler2
echo "2. Parameter fehlt!"  
:ende
rem del Dateiliste.txt
echo fertig.
REM --- :EOF

Grüße Ronald
Member: bastla
bastla Jun 19, 2010 at 10:02:31 (UTC)
Goto Top
Hallo Ronald!
Das bedeutet ich hätte
copyetwas.bat F:\Bilder\Alboin\ M:\Bilder\Alboin\
schreiben müssen, oder wie ich jetzt ausprobierte, beim Quellpfad den letzten Backslash weglassen müssen! AHA!!!
Du hättest natürlich auch einfach meine Erklärung(en) ernst nehmen können ... face-wink
Um aus dem "copy" ein "move" zu machen, müsste nur nach erfolgreicher Kopie die Originaldatei gelöscht werden - die Zeile 12 würde dann (wieder zur Sicherheit mit "echo") so aussehen:
xcopy /L /yhrkf %1 "%Pfad%*"|findstr /v /c:"1 Datei(en) kopiert" && echo del /f /a %1
Grüße
bastla
Member: Roschka
Roschka Jun 19, 2010 at 13:00:26 (UTC)
Goto Top
Hallo bastla,

natürlich hätte ich deine Erklärungen gern "ernst genommen", wenn ich sie gleich verstanden hätte! ;)
Aber egal, ich danke dir trotzdem für deine Hilfe.

Da ich solche Scripte nicht täglich anwende und mich auch nicht täglich damit befasse, (Vergessen von Details kann auftreten), bevorzuge ich eine Programierung die Fehler abfängt und anzeigt bzw. Hilfen gibt; so wie im Beispiel "move2.bat".
Dieses "del /f /a %1" hätte ich nun gern noch als Auswahlabrfage.
So in der Art:
echo "willst du die Quelldateien löschen, gib "y" ein, sonst "n"  
if Eingabe="y" do (del /f /a %1)  
else if Eingabe="n" do (go to :EOF) ; (oder einer anderen Sprungmarke)  
if Eingabe="" do ("Frage wiederholen")  
REM und abfragen des letzten Zeichens der Quellangabe
if lastchar %%Quelle="\" then do call Syntaxhinweis  
:Syntaxhinweis
echo "wenn das letzte Zeichen von Quelle ein "\" ist, geht dieser Ordner verloren. Quellpfad bitte ohne "\" eingeben.  
goto :Start (oder :EOF)

Unklar ist mir leider immernoch, was so einzelne Platzhalter bedeuten:

Was ist %~nx1?
was ist %-dpi?
Was ist %-dp1?
Was ist %-1?
Was ist %-2?
Was ist %-%%?
Was ist %i?
Was ist %j?
Was ist %k?
Was ist set "B=%Verz:~,1%" ?

Grüße Ronald
Member: bastla
bastla Jun 19, 2010 at 13:17:00 (UTC)
Goto Top
Hallo Ronald!

Du hast in der Liste noch vergessen:

Was ist "for /?"?
Was ist "set /?"?

natürlich hätte ich deine Erklärungen gern "ernst genommen", wenn ich sie gleich verstanden hätte! ;)
Der Zustand scheint noch anzuhalten - anders kann ich mir
echo "wenn das letzte Zeichen von Quelle ein "\" ist, geht dieser Ordner verloren. Quellpfad bitte ohne "\" eingeben.
nicht erklären ...

... denn eigentlich steht doch oben (samt Beispiel, aber zugegebener Maße noch nicht in "fett"):
... wobei beim erster Parameter die Angabe der Dateien (sinnvoller Weise per Wildcard/s) erforderlich ist ...
-die "Nicht-Festlegung" des zu verarbeitenden Dateityps im Batch, sondern die Übergabe als Parameter, folgte dabei ja Deiner Vorgabe (und da hattest Du den Parameter noch als "Q:\Metacreations\Poser\Bilder\*.*" mit Angabe der Dateimaske "*.*" geschrieben) ...
Die Abfrage hinsichtlich des Löschens werde ich nachher noch integrieren ... ist jetzt dabei:
@echo off & setlocal
set "Dateien=%~nx1"  
set "Basis=%~dp1"  
set "Ziel=%~2"  

set "Verschieben="  
:Loop
set "Eingabe="  
set /p Eingabe=Willst du die Quelldateien loeschen, gib "y" ein:   
if not defined Eingabe goto :Loop
if /i "%Eingabe:~,1%"=="y" set "Verschieben=True"  
echo\
if defined Verschieben (
    echo Die Quelldaten werden verschoben = geloescht!
) else (
    echo Die Quelldaten werden kopiert, nicht verschoben!
)
echo\
pause
for /f "delims=" %%i in ('dir /s /b /on /a-d "%Basis%%Dateien%"') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "Pfad=%Ziel%\%~dp1"  
call set "Pfad=%%Pfad:%Basis%=%%"  
xcopy /L /yhrkf %1 "%Pfad%*"|findstr /v /c:"1 Datei(en) kopiert" && if defined Verschieben echo del /f /a %1  
goto :eof
Falls tatsächlich die Ablehnung des Verschiebens zum Abruch des Batches führen soll, kann dies natürlich durch ein
goto :eof
im "else"-Zweig der Abfrage realisiert werden ...

Grüße
bastla
Member: Roschka
Roschka Jun 19, 2010 at 19:17:38 (UTC)
Goto Top
Hallo bastla,
ja ich hatte anfangs ein Pfadbeispiel mit \*.* geschrieben, aber auch, daß ich das flexibel haben will. Du klammerst dich zu sehr an EIN Pfadbeispiel.

Und ich wollte wissen, wie man den Quell-Pfad in Bestandteile zerlegt.
Du hast zwar ein Skript geschrieben, das auch in etwa mein Ziel erreicht, doch war es dabei plötzlich wichtig ob ein Quell-Ordner mit oder ohne "\" am Ende übergeben wird.
Übergebe ich deinen Skript eine Quelle mit "\*.*" am Ende passiert das Gleiche wie nur mit "\": der Ordner VOR den "\" geht verloren! Und das will ich nicht.

Dein Skript löst zwar die Aufgabe, aber ganz anders, als ich erfragte!
Meine Frage war:
Wie löse ich die Aufteilung des Quellpfades in Variablen, die die Ordnernamen enthalten?!
Und eine Lösung für die Stringverarbeitung hast du leider nicht gegeben.

Nach meiner Frage sollte die Zeile, die du mit xcopy machts, etwa so werden:
move %1 "%Ziel%\%Verz1%\%Verz2%"  
oder je nach Pfadlänge auch 
move %1 "%Ziel%\%Verz1%\%Verz2%\%Verz3%\%Verz4%"  
Wobei ich "delims=\" zu verwenden dachte.

In meinem ersten Post habe ich genau danach gefragt.
Wie bekomme ich die Zeile
for /f "tokens=1-2* delims=\" %%i in ('dir /b /s /O:N *.*') do move %%i_%%j.%%k "%Ziel%\%subdir1\%subdir2<\%subdir3>"   
so hin, daß sie richtig ist?
Und daher frage ich was %%j %%k usw bedeuten!

So wie du aber zuletzt geschrieben hast, bist leider du es der nicht versteht was ich will.
Und was ist falsch daran Syntaxhinweise und Fehlerabfragen in ein Script einzubauen?

Grüße Ronald
Member: bastla
bastla Jun 19, 2010 at 19:49:02 (UTC)
Goto Top
Hallo Ronald!
ja ich hatte anfangs ein Pfadbeispiel mit \*.* geschrieben, aber auch, daß ich das flexibel haben will. Du klammerst dich zu sehr an EIN Pfadbeispiel.
Wenn Du das Eingehen auf die von Dir geäußerten Einwände / Wünsche "klammern" nennen willst, bleibt Dir das unbenommen ...

Du hast zwar ein Skript geschrieben, das auch in etwa mein Ziel erreicht, doch war es dabei plötzlich wichtig ob ein Quell-Ordner mit oder ohne "\" am Ende übergeben wird.
Wichtig, weil Du es dazu gemacht hast - in keinem meiner Beispiele kam ein Quell-Ordner mit "\" am Ende vor ...

Übergebe ich deinen Skript eine Quelle mit "\*.*" am Ende passiert das Gleiche wie nur mit "\": der Ordner VOR den "\" geht verloren! Und das will ich nicht.
Auf die Gefahr, mich zu wiederholen: Füge diesen Ordnernamen am Ende des Zielpfades an ...

Und eine Lösung für die Stringverarbeitung hast du leider nicht gegeben.
Entschuldige bitte - ich hätte vielleicht einen Hinweis der Art
for /?
set /?
anbringen sollen ...

Und was ist falsch daran Syntaxhinweise und Fehlerabfragen in ein Script einzubauen?
Wer hier hat derartiges behauptet?

So wie du aber zuletzt geschrieben hast, bist leider du es der nicht versteht was ich will.
Das ist dann schade (auch, weil zu befürchten ist, dass diesen Thread nicht allzu viele Forumsmitglieder frequentieren) - trotzdem: Viel Glück!

Grüße
bastla
Member: Roschka
Roschka Jun 22, 2010 at 00:18:29 (UTC)
Goto Top
Hallo bastla,

ich bedauere sehr, wenn das hier zu einem unerwünschtem Mißverständnis führen würde!
Und ich finde es auch schade, wenn wir aneinander vorbeireden!
Denn ich bin für jede zielführende Hilfe sehr dankbar.
Es kann zwar sein, daß der Tread auf nicht sehr viele Leser hinausläuft, ich denke aber das das davon abhängt wie zielführend die Antworten ausfallen.
Denn in vielen anderen Foren wurde diese Problemstellung von anderen Fragern ebenfalls von den Antwortern nicht richtig verstanden und beantwortet!
Teilweise führte dies zu unsinnigen Betriebssystem-Streitereien oder unnützen Defragmentierungs-Ansichts-Diskusionen.
Unsinnig, weil: die Frage lautete: Wie löse ich das mit MS-DOS, und nicht womit (mit welchem Betriebssystem) löse ich das besser!

Wer hat hier derartiges behauptet?
Du hast den Sinn der Zeile 08. meines Schnipsels
echo "wenn das letzte Zeichen von Quelle ein "\" ist, geht dieser Ordner verloren. Quellpfad bitte ohne "\" eingeben.   
in Frage gestellt!
Dies ergab sich aber für mich erst durch deine Verwendung von xcopy und der anderen Vorgehensweise, als ich dachte! Das Ausprobieren DEINES Skriptes brachte mich zu dem Hinweis!
Auch wenn die Verwendung eines "\" am Ende des Quellpfades ein Fehler von mir war.
Es ist also eine Erkenntnis, die sich aus der Anwendung DEINES Skriptes ergab. Und die ich vorher SO nicht hatte!
Ich habe also aus der Anwendung DEINES Skriptes gelernt, welchen "Denkfehler" ICH hatte!

Ich wollte nicht VORHER am Zielpfad einen Subordner der Quelle einfügen müssen, sondern ihn per Stringbearbeitung aus dem Quellpfad generiert haben! Du mußt dich nicht wiederholen, sondern meine Problemstellung verstehen.

Dein ergänzter Vorschlag der Abfrage des Löschens gefällt mir aber schon ohne ihn ausprobiert zu haben!

Unklar und unbeantwortet bleibt leider weiterhin die Bedeutung von %%-dpi usw.

Freundliche Grüße
Ronald
Member: bastla
bastla Jun 22, 2010 at 05:16:20 (UTC)
Goto Top
Hallo Roschka!
Du hast den Sinn der Zeile 08. meines Schnipsels
 echo "wenn das letzte Zeichen von Quelle ein "\" ist, geht dieser Ordner verloren. Quellpfad bitte ohne "\" eingeben.  
in Frage gestellt!
... aber nur, weil der Hinweis entbehrlich ist - wenn, wie ich deutlich gemacht zu haben glaubte, ein Pfad samt Dateinamen (/-maske) übergeben wird, kann es ohnehin keinen "\" am Ende geben; ein Hinweis auf "Quellpfad" ist demnach am Thema vorbei ...
Du mußt dich nicht wiederholen, sondern meine Problemstellung verstehen.
Ich kann das sogar noch präzisieren: Ich muss gar nix, und das mache ich hier in weiterer Folge auch ...

Grüße
bastla
Member: Biber
Biber Jun 22, 2010 at 08:08:39 (UTC)
Goto Top
Moin bastla,

und ich dachte immer, neben den zwei Dingen, die Albert Einstein als Kandidaten für das Attribut "unendlich" bereits gefunden hat, wäre auch deine schier unerschöpfliche Geduld ein mögliches vollwertiges Drittes. face-wink

Ich kann eure Bedenken zerstreuen, dass dieser Thread nur von wenigen oder nur beiläufig gelesen wird.
Ich jedenfalls lese von Beginn an mit täglich wachsender Begeisterung mit.

@Roschka
Für dich noch mal zum Vorgehen unter Erwachsenen im Allgemeinen und in diesem Forum im Besonderen.

Zu den Eigenheiten unser aller Beschäftigung mit Computergelumpe gehört zwangsläufig, dass hier niemand alles wissen kann - dazu ist die Materie zu komplex oder vielleicht auch einfach zu umfangreich.

Das ist allerdings kein ITler-spezifisches Problem, sondern trifft genauso die Geigenbauer, Mezzosopranistinnen, Opel-Manta-Mechatroniker oder Sammler von Überraschungseiern.

Alle Einsteiger, alle Halb- und Vollprofis kommen irgendwann an eine Stelle, wo aus dem tiefsten Innersten herausbricht
"Upps, wassollndassein? Hab ich ja noch nie nich' gesehn...".

Und die dann weiterführende Informationen suchen, die zur Erhellung dieser Unklarheiten führen.
(--> "suchen" ist hier ein Tu-Wort, etwas aktiv zu leistendes. Von dir zu leistendes. Sonst hätte ich geschrieben ".... die auf Weihnachten warten")

bastla hat dich mehrfach und wiederholt (so wie ich mich jetzt mit dieser Tautologie wiederhole) auf die ultimativen Informationquellen wie z.B. FOR/? und SET/? verwiesen.

Ein ebenso mehrfaches und wiederholtes völliges Ausblenden dieser Hinweise war die Reaktion.

Bitte setz noch mal auf so vor vier oder fünf Kommentaren... und lies noch mal, was bastla dort empfohlen hat.
Danach, wenn das getan ist..
Setz bitte den Beitrag auf erledigt [s.Edit]
- oder -
stelle etwaige verbleibende Verständnisfragen
-oder-
nimm irgendwo Privatstunden
-oder-
verschiebe den Beitrag selbständig in den Papierkorb. [s. Edit]

Du wirst jedenfalls im Forum niemand finden, der sich mehr Geduld und Erklärungskompetenz als bastla zutraut und hier den Thread neu aufrollt.

Grüße
Biber

[Edit] Im Nachhinein musste ich zwei mögliche Optionen wieder streichen - Kollege Roschka ist gar nicht der Threadersteller.[/Edit]
Member: Roschka
Roschka Jun 24, 2010 at 12:53:38 (UTC)
Goto Top
Hallo Biber, hallo bastla,

was ich hier keinesfalls wollte, ist mit jemandem Streit anfangen!!!
Daß aber das Einbauen einer echo-Notitz und Fehlerabfragen in ein Skript, die gegen meine eigene Vergesslichkeit (wenn ich das skript mal länger nicht genutzt habe) helfen sollte, zu einem Streit führen könnte, hätte ich nicht geahnt. Dann hätte ich das nur heimlich zuhause reingeschrieben...

Ich habe eine Problemstellung und bin dankbar für hilfreiche Antworten. Das Skript von bastla funktioniert auch gut für den Zweck, aber eben komplett anders, als ich erfragte, und ich verstand leider nicht alles.
Dennoch ein freundliches Danke an bastla. Ich halte ihn für eine technischen Experten, der auch was kann.
Leider will er aber scheinbar nicht den Sinn der Variablen, nach denen ich fragte erklären. Schade.
Da dies auch kein anderer versuchte, möchte ich hier gern in einem freundlichen Ton zum Ende kommen.

Also vielen Dank für den Lösungsvorschlag.
Die Antwort auf die Frage nach der Bedeutung der Variablen fand ich nun hier:
http://www.windowsitpro.com/article/server-management/how-do-i-pass-par ...

Mit freundlichen Grüßen
Roschka
Member: Biber
Biber Jun 24, 2010 at 14:09:14 (UTC)
Goto Top
Ja nee, Roschka,

viele nennen mich "Biber, den Geduldigen".
Warum auch immer.
Einklagbar ist es jedenfalls nicht.

Ich versuch es noch mal zu erklären.

In der Hilfe zu For, die sich z.B. vom CMD-Prompt aus aufrufen lässt mit FOR /? steht
....
Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert.
Sie können jetzt folgende Syntax verwenden:

    %~I         - Expandiert %I und entfernt alle umschließenden
                  Anführungszeichen (").
    %~fI        - Expandiert %I zu einem vollständigen Dateinamen.
    %~dI        - Erzeugt nur den Laufwerkbuchstaben von %I.
    %~pI        - Erzeugt nur den Pfad von %I.
    %~nI        - Erzeugt nur den Dateinamen von %I.
    %~xI        - Erzeugt nur die Dateierweiterung von %I.
    %~sI        - Erzeugter Pfad enthält nur kurze Dateinamen.
    %~aI        - Erzeugt die Dateiattribute von %I.
    %~tI        - Erzeugt Datum und Zeit von %I.
    %~zI        - Erzeugt die Dateigröße von %I.
    %~$PATH:I   - Durchsucht die in der PATH-Umgebungsvariablen
                  angegebenen Verzeichnisse und expandiert die erste
                  gefundene Datei %I zu dem vollständigen Dateinamen.
                  Wenn der Name der Umgebungsvariablen nicht definiert
                  ist oder diese Datei bei der Suche nicht gefunden wurde,
                  wird dieser Parameter zu einer leeren Zeichenkette
                  expandiert.

Diese Parameter können auch miteinander kombiniert werden:

    %~dpI       - Erzeugt den Laufwerkbuchstaben und Pfad von %I.
    %~nxI       - Erzeugt den Dateinamen und die Dateierweiterung von %I.
    %~fsI       - Expandiert %I zu einem vollständigen Namen, der nur
                  kurze Dateinamen enthält.
    %~dp$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
                  angegebenen Verzeichnisse nach %I und erzeugt den
                  Laufwerkbuchstaben und Pfad der ersten gefundenen Datei.
    %~ftzaI     - Expandiert %I zu einer Zeile, die der Ausgabe des DIR-
                  Befehls entspricht.
...

Darauf hatte bastla mehrfach verwiesen.
Zugegeben, im ersten Moment liest sich der Hilfetext möglicherweise etwas holprig.
in der Hilfe zu CMD/? oder CALL/? steht
...
Zusätzlich hat sich die Auflösung von Referenzen auf Argumente in Batchdateien
(%0, %1 etc.) wie folgt geändert:

    %* in einer Batchdatei bezieht sich auf alle Argumente (z.B. %1 %2
        %3 %4 %5 ...).

    Die Ersetzung von Batchparametern (%n) wurde erweitert. Sie können
    jetzt folgende Syntax benutzen:

        %~1         - Expandiert %1 und entfernt umschließende
                      Anführungszeichen (").
        %~f1        - Expandiert %1 zu einem vollständigen Dateinamen.
        %~d1        - Erzeugt nur den Laufwerkbuchstaben von %1.
        %~p1        - Erzeugt nur den Pfad von %1.
        %~n1        - Erzeugt nur den Dateinamen von %1.
        %~x1        - Erzeugt nur die Dateierweiterung von %1.
        %~s1        - Der erzeugte Pfad enthält nur kurze Namen.
        %~a1        - Expandiert %1 zu Dateiattributen.
        %~t1        - Expandiert %1 zu Datum/Zeit der Datei.
        %~z1        - Expandiert %1 zur Größe der Datei.
        %~$PATH:1   - Durchsucht die in der PATH-Umgebungsvariablen
                      angegebenen Verzeichnisse und expandiert die erste
                      gefundene Datei %1 zu dem vollständigen Dateinamen.
                      Wenn der Name der Umgebungsvariablen nicht definiert
                      ist oder diese Datei bei der Suche nicht gefunden
                      wurde, wird dieser Parameter zu einer leeren
                      Zeichenkette expandiert.

    Diese Parameter können auch miteinander kombiniert werden:

        %~dp1       - Erzeugt den Laufwerkbuchstaben und Pfad von %1.
        %~nx1       - Erzeugt den Dateinamen und die Dateierweiterung von %1.
...

Dann biegst du um Ecke und schreibst
Dennoch ein freundliches Danke an bastla. Ich halte ihn für eine technischen Experten, der auch was kann.
Leider will er aber scheinbar nicht den Sinn der Variablen, nach denen ich fragte erklären. Schade.
Da dies auch kein anderer versuchte, möchte ich hier gern in einem freundlichen Ton zum Ende kommen.

Also vielen Dank für den Lösungsvorschlag.
Die Antwort auf die Frage nach der Bedeutung der Variablen fand ich nun hier:
http://www.windowsitpro.com/article/serve ...

..wo nun steht:
.....
Parameter 	Description
%1 	The normal parameter.
%~f1 	Expands %1 to a fully qualified pathname. If you passed only a filename from the current directory, this parameter would also expand to the drive or directory.
%~d1 	Extracts the drive letter from %1.
%~p1 	Extracts the path from %1.
%~n1 	Extracts the filename from %1, without the extension.
%~x1 	Extracts the file extension from %1.
%~s1 	Changes the n and x options’ meanings to reference the short name. You would therefore use %~sn1 for the short filename and %~sx1 for the short extension.

The following table shows how you can combine some of the parameters.
Parameter 	Description
%~dp1 	Expands %1 to a drive letter and path only.
%~sp1 	For short path.
%~nx1 	Expands %1 to a filename and extension only.
...

Okay..... sagen wir so...
Wenn das Thema für dich nun geklärt ist, sollten wir den Beitrag nicht mehr unnötig in die Länge ziehen.

Sonst bekomm ich bald einen neuen Beinamen.

Grüße
Biber
Member: Roschka
Roschka Oct 01, 2010 at 11:45:09 (UTC)
Goto Top
Entschuldigt bitte, wenn ich mich erst nach langer zeit wieder melde. Ich war drei Monate auswärtz arbeiten, 500 km von zu hause und meinem PC weg.
Danke an Biber für die Erklärung der %~-Variablen. Ich hatte leider übersehen, oder nicht richtig verstanden, daß ich in der Befehlszeile FOR /? usw. eingeben sollte, um diese Infos zu lesen.

Der Scriptvorschlag von bastla, vom 18.6.2010 an mich funktioniert einigermaßen gut, so lange man es auf kleine Ordnerstrukturen und ohne Leerzeichen in Quelle und Ziel zu haben anwendet, aber mit einem "Schönheitsfehler", für den bastla nichts kann: der DIR Befehl sortiert nur Dateien eines Verzeichnisses alphabetisch, nicht aber die Verzeichnisstrukturen selber.
Gemeint ist die Zeile:
for /f "delims=" %%i in ('dir /s /b /o:n %Basis%') do call :ProcessFile "%%i"  
Wenn ich dann aber auch noch in einem Pfadparameter Leerzeichen habe (z.B. D:\Eigene Dateien\) und diese in Anführungszeichen setzen muß, dann gibt es weitere Probleme: (Rückmeldungen im DOSFenster)
E:\>call :ProcessFile "e:\Dokumente und Einstellungen\All Users\Anwendungsdaten\  
Adobe\Photoshop Elements\8.0\Photo Creations\frames\Gold Frame Round 2.metadata.
xml"  

E:\>set "Pfad="O:\Programme_D\Dokumente und Einstellungen"e:\Dokumente und Einst  
ellungen\All Users\Anwendungsdaten\Adobe\Photoshop Elements\8.0\Photo Creations\
frames\"  

E:\>call set "Pfad=%Pfad:"e:\Dokumente und Einstellungen"=%"  

E:\>md ""O:\Programme_D\Dokumente und Einstellungen"e:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Adobe\Photoshop Elements\8.0\Photo Creations\frames\"  
Ein Unterverzeichnis oder eine Datei mit dem Namen "O:\Programme_D\Dokumente" existiert bereits.  
Folgender Fehler trat auf: O:\Programme_D\Dokumente.
Ein Unterverzeichnis oder eine Datei mit dem Namen "und" existiert bereits.  
Folgender Fehler trat auf: und.
**Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.**
^CFolgender Fehler trat auf: Einstellungene:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Adobe\Photoshop Elements\8.0\Photo Creations\frames\.
Batchvorgang abbrechen (J/N)? j

E:\>
Wie man sehen kann, ensteht ein ziemliches Ordnernamens-Chaos, weil Teile falsch zusammengesetzt werden. Diese entstehen wenn man etwa eingibt:
umlagern.bat "D:\Dokumente und Einstellungen" "O:\Archive_D\Dokumente und Einstellungen".
Weil da Leerzeichen drin sind, muß man die Pfade in Anführungszeichen setzen.
(Jetzt aber bitte nicht diese Pfade monieren! Das sind Beispiele.) face-wink

back-to-topMein Konzept mit BATCH war von Anfang an folgendes:

1. starte das BATCH mit 2 Parametern QUELLE und ZIEL
2. erzeuge eine Dateiliste mit dir (Quelle) /B /S /O':N >Dateiliste1.txt
3. sortiere diese mit: sort Dateiliste1.txt /O Dateiliste2.txt
4. lies diese Dateiliste2.txt im BATCH ein und wandle die Zeilen in move-Befehle um, so daß aus einer Zeile wie
X:\Hauptordner\Unterordner 1\ Unterordner2\Datei 1 mit Leerzeichen.ext
eine Zeile in der Art erstellt wird:
move "X:\Hauptordner\Unterordner 1\ Unterordner2\Datei 1 mit Leerzeichen.ext"  "Y:\Archiv Ordner\Hauptordner\Unterordner 1\ Unterordner2"  
Zur Kontrolle wird diese Zeile zuerst mit echo ausgegeben, später mit echo >>movelist.bat
in eine neue Datei umgeleitet.
5. diese movelist.bat soll mit "call notepad movelist.bat" vorübergehend zur Kontrolle angezeigt werden ob alles richtig umgesetzt wurde. wenn ja soll sie
6. ausgeführt werden. (Oder man kann in Notepad mit suchen & Ersetzen noch etwas korrigieren, und dann ausführen lassen)
7. Die Arbeitsdateien Dateiliste*.txt und movelist.bat sollen nach erfolgreicher Abarbeitung gelöscht werden.

Mein Problem bestand im Punkt 4. wie ich in der for-Schleife die Zeile aus der Dateiliste in Pfadbestandteile zerlegen kann um sie im Zielpfad wieder einzusetzen. Das Ziel wird IMMER ein anderer Laufwerksbuchstabe sein, kann auch, aber muß nicht, ein Hauptordner darin sein.
Das will ich flexibel nach Bedarf handhaben.
Ich fragte wie ich die FOR-Schleife zu diesem Zweck schreiben muß und wollte deshalb die %Parameter wissen. Statt dessen bekam ich Vorschläge, wie man sowas ähnliches ganz anders machen kann.

Die "fast" richtige Lösung sieht nun so aus:
...
REM ist nur ein Schnipsel ...
set TEXT_T="Dateiliste2.txt"  
for /f "eol= tokens=* delims= usebackq" %%i in (%TEXT_T%) do (  
		set str=%Ziel%%%~pi 
		set str=!str:~0,-1! 
echo if not exists "%Ziel%%%~pi/nul" md "!str!" >>movelistDoks.bat  
echo move "%%i" "%Ziel%%%~pi" >>movelistDoks.bat  
...
wobei die Zeile set str=!str:~0,-1! +++nicht funktioniert+++.
Der Backslash "\" wird nicht abgeschnitten!
Dabei habe ich doch oben in der Batch stehen setlocal ENABLEDELAYEDEXPANSION.
md x:\test\test2\ funktioniert aber auch ohne Fehlermeldung.
Ansonsten war das die Lösung nach der ich suchte.
Bei dem Anhängsel /nul bin ich nicht sicher ob es nicht \nul heißen müßte. Es soll ja sicherstellen, daß es sich um einen Ordner handelt und nicht um eine Datei.
Allerdings: egal wie das "nul" eingesetzt wird, kommt immer eine Fehlermeldung:

""D:\Programme\DjVuZone\DjVuLibre\share\djvu\djview4\/nul"" ist syntaktisch an dieser Stelle nicht verarbeitbar.


Ein anderes Problem entsteht jedoch im Falle umgekehrter Pfade, wenn ich aus y:\Archiv Ordner\ wieder nach X: schreiben will, möchte ich gerne den teil :\Archiv Ordner\ ausschneiden, weil der nicht im Ziellaufwerk erscheinen soll!
Ich will dann, daß aus Y:\Archiv Ordner\Hauptordner\usw. wieder als Ziel X:\Hauptordner\usw. wird.
Wie kann man das anders lösen, als mit notepad Suchen und Ersetzen?
Member: bastla
bastla Oct 01, 2010 at 15:56:50 (UTC)
Goto Top
Hallo Roschka!

Nur der Ordnung halber: Wenn Du Ausgaben eines Batches postest, dann bitte auch den Batch selbst dazu - und sei es nur, um erkennen zu können, dass er nicht meinem Ansatz vom 18.6.2010 entspricht: Dort wird nämlich ein Pfad mit enthaltenen Leerzeichen genau dann unter Anführungszeichen gesetzt, wenn diese auch tatsächlich benötigt werden; es kann nicht zu
E:\>set "Pfad="O:\Programme_D\Dokumente und Einstellungen"e:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Adobe\Photoshop Elements\8.0\Photo Creations\frames\"
kommen, wenn etwa der Zielpfad meinem Beispiel
set "Ziel=D:\Fotos alphabetisch"
entsprechend mit
set "Ziel=O:\Programme_D\Dokumente und Einstellungen"
und nicht mit
set Ziel="O:\Programme_D\Dokumente und Einstellungen"
festgelegt wird.

Grüße
bastla

P.S.: Die besten Wünsche für die Umsetzung Deines Konzepts ...
Member: Roschka
Roschka Oct 01, 2010 at 18:11:58 (UTC)
Goto Top
Hallo bastla,
du hast solange Recht, solange die Pfade so wie du es vorschlägst in die Batch-datei geschrieben werden.
Ich sagte aber schon immer, daß ich die Pfade als Parameter in der Befehlszeile an die Batch übergeben will!
und da sehen die beiden Set-Zeilen eben so aus:
@echo off & setlocal
...
set "Quelle=%1"  
set "Ziel=%1"  
...
(Ob das nun Basis oder Quelle heißt ist ja egal.)
Und dabei traten die Verstümmelungen auf. egal in welchem Script. Nimm das also bitte nicht persönlich.
Du hättest aber auch gleich schreiben können, daß du wegen DEM Problem mit den Anführungszeichen direkt in die Batch die Pfade schreibst und nicht als Parameter übergeben willst. face-wink
Gibt es denn eine Möglichkeit diese Anführungszeichen aus der Befehlszeile zu erkennen und zu entfernen bevor der String bearbeitet wird? Das wäre hilfreich.

Es treten aber auch noch andere Probleme auf, für die wir beide nichts können:
bescheuerterweise gibt es Dateien und Ordner mir Ausrufezeichen und Prozentzeichen im Namen die bei der Stringverarbeitung stören.
! Mein Ordner soll oben stehen
!! or nö meiner soll noch weiter oben sein
!!! Ätsch und meiner ist jetzt ganz obenj!
Sofort lesen!!!.txt
ein%20Bild.jpg
(oder noch blöder)
img@!325  (Dateinamen einer alten Webcam)
Auch sowas sorg für einzelne verstümmelte Ausgabezeilen, wenn man die Pfade mit Variablen bearbeiten will.
	set str=%Ziel%%%~pi  
set str=!str:~0,-1!  
kommen durcheinander, wenn ein Pfad mit irgendwas\!Mein%20Ordner\ als Originalname in der Liste auftaucht.
Und da kann weder bastla noch ich was dafür. face-wink

Das mit dem "/nul" habe ich aus "Windows 2003 Shell Scripting" abgeschrieben (gefunden bei Google books). es funktioniert aber nicht. Und set str=!str:~0,-1! leider scheinbar auch nicht, der Backslash bleibt dran am Pfad. face-sad
Member: bastla
bastla Oct 01, 2010 at 18:31:12 (UTC)
Goto Top
Hallo Roschka!
Du hättest aber auch gleich schreiben können, daß du wegen DEM Problem mit den Anführungszeichen direkt in die Batch die Pfade schreibst und nicht als Parameter übergeben willst. face-wink
Warum hätte ich das tun sollen, wenn es doch gar nicht so ist (abgesehen davon, dass ich im Fall des Falles "wegens DES Problems" geschrieben hätte ... face-wink)?

Schließlich genügt doch
set "Quelle=%~1"
Grüße
bastla
Member: Roschka
Roschka Oct 01, 2010 at 19:02:35 (UTC)
Goto Top
Zitat von @bastla:

Schließlich genügt doch
set "Quelle=%~1"
> 
Habe ich grade probiert und bekomme:
Das System kann die datei leider nicht finden
zurück.
Member: bastla
bastla Oct 01, 2010 at 19:09:31 (UTC)
Goto Top
Hallo Roschka!
Habe ich grade probiert und bekomme:
>Das System kann die datei leider nicht finden
zurück.
Dein System wird einen Grund für diese Meldung haben, ist dabei allerdings ausnehmend höflich face-wink - das von mir verwendete XP quittiert die Angabe eines falschen (= nicht vorhandenen) Pfades mit einem eher lapidaren
Das System kann die angegebene Datei nicht finden.
Grüße
bastla

P.S.: Irgendwie schade, dass das Ganze nicht auf meine Art durchgeführt werden darf:
@echo off & setlocal
set "Typ=jpg"  
set "Basis=%~1"  
set "Ziel=%~2"  

for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do set "Pfad=%Ziel%%%~dpi" & set "Datei=%%i" & call :ProcessFile  
pause
goto :eof

:ProcessFile
call set "Pfad=%%Pfad:%Basis%=%%"  
echo md "%Pfad%" 2>nul  
echo move "%Datei%" "%Pfad%"  
goto :eof
Member: Roschka
Roschka Oct 02, 2010 at 12:45:43 (UTC)
Goto Top
Zitat von @bastla:
P.S.: Irgendwie schade, dass das Ganze nicht auf meine Art durchgeführt werden darf:
Hallo bastla,
ja es ist schade, daß dein Script nicht so arbeitet, wie ich es möchte. Das es "nicht auf deine Art durchfeführt werden darf" ist nicht dein Fehler, sondern der des DIR-Befehls dir /b /s /o:N, der nicht so arbeitet, wie ich will!
Der Befehl:
dir [quelle] /b /S /o:n
sortiert nur die Dateien IN einem Ordner, aber nicht die Ordnerstruktur selber!!!
Das Ergebnis in einem leeren Zielordner listed sich etwa so im zunächst leeren Zielordner im WinExplorer, wenn es geschrieben wird:
Deine umlagern.bat $Vers1.0 liefert diese Reihenfolge in einen zuvor leeren Zielordner, der im WindowsExlorer angezeigt ist
work\
cache\
Temp\
(Temp\temp1.tmp)
(Temp\temp2.tmp)
(Temp\temp3.tmp)
Archive\
(Archive\Archiv1.zip)
(archive\Archiv2.arc)
(Archive\Archiv3.rar)
Ainedatei.jpg
beinedatei.txt
ceinedatei.rtf
Dokument.doc
EineDateii.png
rtedatei.exe
sortierteDatei.lst
VierteDatei.ext
ztedatei.ext
Thumbnails\
(Thumbnails\thumbnail1.ext)
(Thumbnails\thumbnail2.ext)
(Thumbnails\thumbnail3.ext)
(Thumbnails\thumbnail4.ext)
MeineNeuenDateien\
(MeineNeuenDateien\neue Datei1.ext)
(MeineNeuenDateien\neue Datei2.ext)
Arbeit\
Welt\
nocheinordner\
intertnet\
Briefe\
Aschenputtel\

Die in Klammern () gesetzten Teile sieht man in dem Ordnerfenster des explorers noch nicht.
Der Befehl dir /b /s gibt sie aber in der Reihenfolge auch so aus.

Ich möchte aber, daß die Ordner auch schon in Sortierte Reihenfolge angelegt werden. Aber nicht nach Datum der Erstellung des Quellordners, sondern alphabethisch.
Dein erstes vorgeschlagenes Script (umlagern.bat von mir genannt) funktioniert relativ gut in deinem Sinne (mit hartcodierten Pfaden). und scheiterte nur an blöden Namen mit "!" und "%" drin, wie mein eigenes Script auch.

Dein letztes Sript unverändert copiert als umlagern3.bat benutzt ergibt folgen de Rückmeldung:
D:\>umlagern3.bat O:\Programme_D\Programme\3Dto3D D:\Programme\3Dto3D
md "D:\Programme\3Dto3D\html_help\images\"
move "O:\Programme_D\Programme\3Dto3D\html_help\images\sample_3ds.jpg" "D:\Programme\3Dto3D\html_help\images\"
md "D:\Programme\3Dto3D\html_help\images\"
move "O:\Programme_D\Programme\3Dto3D\html_help\images\sample_pov.jpg" "D:\Programme\3Dto3D\html_help\images\"
Drücken Sie eine beliebige Taste . . .
Das Ergebnis war der Ordner
D:\Programme\3Dto3D\
blieb leer!? Denn es fehlte der Subordner \html_help\
Und das liegt an der Verwendung von TYP=jpg und weil direkt in \html_help\ kein *.jpg zu finden war.
Für meine Zwecke kann ich das aber auf TYP=* ändern, oder TYP weglassen. Ist also nicht wirklich das Problem.

Verwende ich dein Script in deiner ersten Version funktioniert es weitgehend gut, solange ich die Pfade direkt in der Batch im
Set "Ziel=Wunschpfad"
einsetze. und keine bescheuerten Namen mit "!" und "%20" dazwischen kommen.
Aber eben in oben geschilderter Reihenfolge der nicht sortierten Ordnernamen..

Es geht mir doch nicht darum deine Kometenzen in Frage zu stellen!!!
Ich bin dir dankbar dafür, das du versuchst eine mögliche Lösung anzubieten!!! und dafür Zeit opferst darüber nachzudenken. Selbst wenn du "Streit mir mir suchst" bist du bereit Zeit für etwas zu opfern, das du auch einfach ignorieren könntest.
Wenn aber deine Lösungsansätze nicht genau das erfüllen, was ich möchte, dann frage ich eben nach, wie ich Fehler in meinem Script verbessern kann. Und solange es mir nicht gelingt mit entsprechenden Verzweigungen in meiner Batch zu automatisieren, gehe ich dem umständlichen Weg mir Zwischenergebnisse in Arbeitsdateien im Editor anzeigen zu lassen um sie manuel zu korrigieren.
Member: bastla
bastla Oct 02, 2010 at 14:14:24 (UTC)
Goto Top
Hallo Roschka!
Selbst wenn du "Streit mir mir suchst" ...
Wenn Du tatsächlich diesen Eindruck hast, kann ich Dich beruhigen - die (vermeintliche) "Suche" ist hiermit beendet.

Grüße
bastla

P.S.: Und falls Du wirklich wolltest, dass mein letztes Script die Befehle nicht nur anzeigt, sondern auch ausführt, solltest Du die beiden "echo" am Beginn der Zeilen 12 und 13 entfernen ...
Member: Roschka
Roschka Oct 03, 2010 at 13:32:58 (UTC)
Goto Top
Hallo bastla
Zitat von @bastla:
Wenn Du tatsächlich diesen Eindruck hast, kann ich Dich beruhigen - die (vermeintliche) "Suche" ist hiermit
beendet.
Prima. aber das war doch nur eine theoretische Behauptung, nicht ernsthaft. face-wink

P.S.: Und falls Du wirklich wolltest, dass mein letztes Script die Befehle nicht nur anzeigt, sondern auch ausführt, solltest
Du die beiden "echo" am Beginn der Zeilen 12 und 13 entfernen ...
Das ist mir schon klar! Oder man leitet die Echos in eine Datei um.

Also egal ob in deinem oder meinem script, wenn die übergebenen Pfade Leerzeichen enthalten ist es problemärmer, die im Script einzutragen. Soweit sind wir uns wohl einig.

Nun habe ich die Idee dein Script, nennen wir es "umlagern.bat", zu verwenden und etwas abzuändern, damit ich meinem ziel näherkomme.
REM umlagern.bat
@echo off & setlocal
REM made by bastla from administrator.de 02.10.2010
set "Typ=*"  
set "Basis=%~1"  
set "Ziel=%~2"  

for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do set "Pfad=%Ziel%%%~dpi" & set "Datei=%%i" & set "Quell=%%~dpi" & call :ProcessFile  
pause
goto :verarbeiten

:ProcessFile
call set "Pfad=%%Pfad:%Basis%=%%"  
call set "QPfad=%%Datei:%%~dpi"  
echo md "%Pfad%" >>MakeDirs.txt  
echo move "%Datei%" "%Pfad%" >>MoveList.txt  
echo rd "%Quell%" >>rdQuelle.txt  
goto :eof

:verarbeiten
sort MakeDirs.txt /O MakeDirs.bat
sort MoveList.txt /O MoveList.bat
sort /R rdQuelle.txt /O rdQuelle.bat
call MakeDirs.bat
call MoveList.bat
call rdQuelle.bat
rm makedirs.*
rm movelist.*
rm rdquelle.*
goto :eof
(Nimm mir bitte nicht übel, daß ich reingeschrieben habe, wer der Urheber der Grundlage des scriptes ist! face-wink )

Das wäre die Endversion des Scriptes, doch vorher könnte ich mit
call notepad yxz.bat
mir jede erst mal anzeigen lassen. Erste Tests laufen so, wie ich mir das wünsche.
Und das die leeren QuellOrdner per Script gelöscht werden, erspart mir dies nachträglich von Hand zu tun.
Es bleiben lediglich die Ordner übrig, wo Dateien mit "blödem" Namen drin sind, die nicht verschoben wurden, weil "rd" nur leere Ordner löscht.. (Also wo "!" oder "%" im Namen ist.) Die muß ich dann eben noch mit dem WinExplorer nachschieben, aber nicht mehr hunderte Ordner einzeln durchsuchen.
Wobei "Sofort Lesen!.txt" wird mit deinem Script verschoben, weil keine Variablenverarbeitung mit "!" erfolgt, aber "neues%20Bild.jpg" bleibt liegen, und auch nur der "Neue Ordner" übrig, in den ich diese beiden zum Testen anlegte.

back-to-topAber da hätte ich noch eine Frage:

Je nach Menge von Dateien in einem Ordner, werden teils hunderte gleicher Zeilen erzeugt in MakeDirs.bat und rdQuelle.bat.

Beispiele (nur kurze, weil sinnlos hier tausende Zeilen lange Ausgaben zu posten):
 (MakeDirs.bat)
md "x:\test\PFY\"   
md "x:\test\PFY\XtraDocF\"   
md "x:\test\PFY\XtraDocF\"   
md "x:\test\PFY\XtraDocF\"   
md "x:\test\PFY\XtraDocF\"   
md "x:\test\PFY\XtraDocF\Images\"   
md "x:\test\PFY\XtraDocF\Images\"   
md "x:\test\PFY\XtraDocF\Images\"   
md "x:\test\PFY\XtraDocF\Images\"   
md "x:\test\PFY\XtraDocF\Images\"   
md "x:\test\PFY\XtraDocF\Images\"   
md "x:\test\PFY\XtraDocF\Images\"   
md "x:\test\PFY\XtraDocF\Images\"   
natürlich könnte ich auch Zeilen wie
if not exist "x:\test\PFY\XtraDocF\Images\"  md "x:\test\PFY\XtraDocF\Images\"   
erzeugen... doch auch die hätten oft viele Wiederholungen.
oder
 (rdQuelle.bat)
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\Images\"   
rd "F:\PFY\XtraDocF\"   
rd "F:\PFY\XtraDocF\"   
rd "F:\PFY\XtraDocF\"   
rd "F:\PFY\XtraDocF\"   
rd "F:\PFY\"   
Diese Ausgaben entstehen mit der Eingabe von
F:\>d:\umlagern3.bat F:\PFY x:\test\PFY
Gibt es eine Möglichkeit diese doppelten oder mehrfachen Zeilen heraus zu löschen um so die Abarbeitung zu beschleunigen?
Im Original leitest du die Fehlermeldungen in der FOR-Schleife ja mit " 2>nul" ins "Nichts" um.

Ein Vorteil von Deinem Script scheint nämlich zu sein, daß ich im umgekehrten Fall , wo :\test\ aus dem Zielpfad rausgeschnitten werden sollte, nichts extra machen muß!

Bei
F:\>d:\moveto.bat x:\test\PFY F:\PFY
entstehen bei meinem Script Zielpfade, die so aussehen:
move x:\test\PFY\irgendnedatei.ext F:\PFY\test\PFY\
und ich muß dann erst mit einem Editor und suchen/ersetzen das F:\PFY\test\PFY wieder zu F:\PFY kürzen.
Und genau dieser unerwünschte Effekt passiert bei deinem Script nicht!
Prima!!!
Allerdings bekomme ich jetzt viele Meldungen:
Das Verzeichnis existiert bereits... (bei md ZIEL)
oder rd Quelle
Das System kann die Datei nicht finden.
Klar ich könnte es auch mit z.B.
call rdQuelle.bat 2>nul
aufrufen.

Ansonsten läuft das jetzt recht gut. Ich muß nur diese beiden Zeilen wenigstens so abändern:
echo if not exist "%Pfad%" md "%Pfad%" >>MakeDirs.txt  
...
echo  if exist "%Quelle%" rd "%Quell%" >>rdQuelle.txt  
Ich wüßte nur noch gerne, wie ich die überflüssigen Mehrfachzeilen weg bekomme.
Member: bastla
bastla Oct 03, 2010, updated at Oct 18, 2012 at 16:43:40 (UTC)
Goto Top
Hallo Roschka!
wenn die übergebenen Pfade Leerzeichen enthalten ist es problemärmer, die im Script einzutragen. Soweit sind wir uns wohl einig.
Keineswegs - mit dem verwendeten
<code type="plain>set "Basis=%~1"

entstehen nicht mehr und nicht weniger Probleme als durch eine Zuweisung einer Konstanten.
(Nimm mir bitte nicht übel, daß ich reingeschrieben habe, wer der Urheber der Grundlage des scriptes ist! face-wink )
Ich lege keinen Wert darauf, aber es wird ja letztlich Dein Script sein (in welches Du daher schreiben kannst, was Du magst) ...
Es bleiben lediglich die Ordner übrig, wo Dateien mit "blödem" Namen drin sind, die nicht verschoben wurden, weil "rd" nur leere Ordner löscht.. (Also wo "!" oder "%" im Namen ist.)
Wieso sollten solche Dateien nicht verschoben werden? Da es keine "delayedExpansion" gibt ist "!" völlig problemlos, und auch das Prozentzeichen sollte korrekt verarbeitet werden ...

BTW: Natürlich lassen sich mit "rd" auch nicht-leere Ordner löschen (siehe "rd /?") - ob das auch sinnvoll wäre, musst Du entscheiden.

Und: Zum Löschen leerer Ordner gibt es nebenan einen Ansatz ...
Ich wüßte nur noch gerne, wie ich die überflüssigen Mehrfachzeilen weg bekomme.
Da Du offensichtlich gesteigerten Wert darauf legst, etwa so:
findstr /i /c:"%Pfad:\=\\%" MakeDirs.txt>nul||echo md "%Pfad%">>MakeDirs.txt
- für mich wäre die "2>nul"-Variante ausreichend.

Grüße
bastla

P.S.: Deine Batch-Zeile 14 erzeugt eine Variable, die in weiterer Folge nicht verwendet wird, und das "rm" der Zeilen 27 bis 29 heißt in Batch "del" ...
Member: Roschka
Roschka Oct 03, 2010 at 19:06:48 (UTC)
Goto Top

back-to-topHallo bastla,

danke für deine Antwort.
Das ich in meine Batchdateien (oder andere) reinschreibe, worauf sie basieren, dient mir selber zur Orientierung wo ich etwas her habe. face-wink Ist also mehr so 'ne Art "Quellennachweis" für mich selber. So weiß ich auch Wochen, Monate, Jahre später noch, woher hilfreiche Infos kamen. -- oder woher falsche.. face-wink

back-to-topGratulation! "Dein" Script funktioniert mit meinen Modifikationen jetzt besser als mein altes!

back-to-topAlso herzlichen Dank für DEINE Hilfe!

(Ja du hast Recht "rm" mußte "del" heißen... face-wink doch scheinbar funktioniert das "rm" auch?!?! oder doch nicht?)

Wieso sollten solche Dateien nicht verschoben werden? Da es keine "delayedExpansion" (in umlagern.bat) gibt ist "!" völlig problemlos, und auch das Prozentzeichen sollte korrekt verarbeitet werden ...
Leider stimmt das nicht!
"Sofort lesen!.txt" wurde verschoben, aber
"ein%20Bild.jpg" (oder sowas) bleibt unverschoben liegen!!!

In meinem Script "moveto.bat" versuchte ich Zeichenkettenbearbeitung, (set str=!str:~0,-2! ) (die ich woanders las), mit "delayedExpansion" und "!" im Namen ging nicht mehr! Es ergab "Müll"-Zeilen. Sowas wie "Pfad\str" statt "Pfad\dateiname.ext".

BTW: Natürlich lassen sich mit "rd" auch nicht-leere Ordner löschen (siehe "rd /?") - ob das auch sinnvoll wäre, musst Du entscheiden.
Ja gut. Sinnvoll ist für mich nur wirklich leere Ordner zu löschen. Ich habe mir rd /? angesehen.
"rm" gibt es wohl wirklich nicht bei MSDOS. Aber beim Testen war das egal. Jetzt verwende ich "del".


Da Du offensichtlich gesteigerten Wert darauf legst, etwa so:
Oha! Interessant! Meinst du Zeile
15. echo md "%Pfad%" >>MakeDirs.txt
damit zu ersetzen?
Dann müßte ich auch Zeile 17 so ähnlich ändern, von
echo rd "%Quell%" >>rdQuelle.txt
zu
???
back-to-topReicht es, wenn ich diese Zeilen einfach mit deinem Vorschlag ersetze??? Oder wo baue ich diese Zeile(n) ein?

- für mich wäre die "2>nul"-Variante ausreichend.
Die unterdrückt zwar die Ferhlermeldungen, verkürzt aber nicht die Zeit der Verarbeitung...
Bei Ordnerstrukturen mit 100.000 Dateien oder mehr kann das eine Rolle spielen! besonders wenn mehrere hundert Dateien in einem Ordner vorkommen und ebensooft unnötig der Befehl "makedir schon vorhandenen Ordner" aufgerufen wird.
Bei 5-10 Aufrufen vielleicht noch nicht spürbar. Bei Ordnern mit 500 Dateien aber schon. (Manch Bilderordner bei mir hat rund 500 Bilder! Der Ordner \Ahead\NeroDB\ enthält 1288 Objekte (49,1 kb). = 1287 überflüssige Befehle der Art "md \Ahead\NeroDB" oder "rd \Ahead\NeroDB". 1287 Sekunden gespart sind 21 Minuten Verarbeitungszeit weniger!)

Im Script in der aktuellen Version unterdrücke ich ja die Fehlermeldungen der "movelist.bat" noch nicht.
So kommen in dem Bereich noch viele Meldungen:
Zugriff verweigert
Ich vermute durch Zeilen wie
move "x:\ordner\subordner\" "y:\ordner\subordner\"
wo kein Dateiname drin steht. Klar, mit " 2>nul " könnte ich diese auch unterdrücken.
Nachdem ich das neue Script erfolgreich auf kleinere Ordnerstrukturen angewendet hatte, schickte ich es über einen Ordner mit 4 GB Inhalt.
Aufgrund der vielen "Zugriff verweigert" Meldungen sind nicht alle Ausgaben mehr im DOS-Fenster sichtbar.
Um den Zeitaufwand zu sehen, verwendete ich am Anfang des Scriptes noch
set Startzeit=%time%
Zusätzliche, neue "echo-Zeilen" "erzählen" wo das Script arbeitet.
Das Ende dieser Ausgabe sieht so aus:
...
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Zugriff verweigert
Verschieben beendet. 
Loesche Quellordner...
entferne Arbeitsdateien...
fertig...
Startzeit: 17:28:51,20
 Endzeit: 18:54:37,20
Arbeitszeit: 18:54:37,23:-17:28:51,20
Also hat das Script rund Eineinhalb Stunden gearbeitet für diese rund 4 GB.

Das Ergebnis dieser Aktion: im Windows-Explorer auf "Eigenschaften des Ordners" geklickt:
(Rest)Größe: 163 kb (167.701 bytes)
Größe auf Datenträger: 4,5 MB (4.718.492 bytes)
Inhalt: 144 Dateien (333 Ordner)
Eigentlich sollte dieser Ordner jetzt "leer" sein!!!
Es sind 16 Haupt-Ordner übrig geblieben, teilweise mit wenigen auch leeren?!?! Unterordnern!
Allerdings hatten diese eigentlich leeren Ordner ein blödes "Nicht verschiebbar-flag" für die Defragmentierung.
Ich hatte diese Ordner-Struktur zuvor mit
xcopy Quelle Ziel /T
angelegt, bevor ich mein MoveTo.bat startete. Dabei wurden leider auch die "Protection-Flags" mit kopiert, die ich eigentlich los werden wollte.
Bescheuerterweise haben etwa tausend Ordner auf meiner Programme Partition ein "Nicht verschiebbar bei defragmentierungs-Flag", obwohl es keine Systemdateien sind. Diese liegen breit vertreut auf der Platte und verhindern jede Defragmentierung, weil tausende nicht nutzbare Lücken bleiben. Teilweise sind das Ordner wie "\Eigene Dateien\gespeicherte_html_Seite-Dateien\ads_frame\", teilweise Ordner wie "\Programme\Corel\Corel Paint Shop Pro Photo X2\Languages\EN\PCUUI\", die eigentlich leer sind!!!
Es gibt aber auch Dateien, die sich nicht verschieben ließen:
\Programme\Corel\Corel Paint Shop Pro Photo X2\Languages\ES\Secuencias de comandos-Restringidas\Foto\Guías – Proporción dorada.PspScript

Allein im Corel-Ordner sind etwa 34,3 kb Fremdsprachen-Müll in 24 Dateien übrig geblieben, die etwa 760 kb auf Daztenträger belegen. (Vorher kopiert mit AlwaysSync)
OK. die kann ich getrost löschen in der Quelle... Ich brauche kein Spanisch,Italienisch,Französisch,Portugisisch... = Datenmüll, der die Festplatten verstopft.
Insgesamt sind noch übrig in \Programme\ noch 163 kb in 144 Dateien, die 4,5 MB auf Datenträger belegen! (FAT32)
Aber auch Ordner wie "O:\Programme_D\Programme\CyberLink\PowerDVD\Images" ließen sich nicht mit rd löschen, obwohl sie leer sind! (Angelegt mit xcopy /T, nicht mit script-Befehl "md O:\Ordnerstruktur" vor dem ersten Verschieben)
In
O:\Programme_D\Programme\Diamond Cut Productions\Magic Audio\1_Audioaufzeichnung-Dateien
blieb "Click%2BPopp.gif" oder "dramaturgischer%20Bogen.gif" übrig als nicht verschiebbar.... =Datenmüll!? Nö screenshots.
MyHeritage hinterlies ettliche Dateien mit "%63" im Namen....

Bei mir ist in den Ordneroptionen ausgeschalten "versteckte und Systemdateien ausblenden" und eingeschaltet "Alle Dateien und Erweiterungen anzeigen"!
Na gut. jetzt kann ich im Windows-Explorer alle übrig gebliebenen Hauptorder mit ALT+D+I in den Eigenschaften sehen ob sie 0 byte und 0 Dateien sind und gleich löschen. Wo nochwas drin ist muß ich reigehen und schauen, ob ich es behalten will.
Ich hatte meine 32 GB große, nicht mehr defragmentierbare Programme-Partition auf einen externen USB-Datenträger verschoben, und schiebe die Dateien nun mit Hilfe der Scripte zurück. Die Windows Kopieren-Verschieben-Funktion trug diese "nicht verschiebbar Flags" immer mit! Nun ist der externe Datenträger nicht mehr richtig defragmentierbar, bis ich die leeren Restordner lösche.
Ich bekam diese beschissenen "nicht verschiebbar"-Flags erst weg, als ich die nun leere Partition D:\ formatierte und mit den Scripts den Inhalt zurück schob. (gearbeitet von einer UBCD4WIN)
Andererseits kann ich dieses Script in modifizierter form (copy statt move) nun auch für die sortierte Befüllung von SD-Karten für digitale Bilderrahmen oder MP3-Player verwenden! face-wink
Member: bastla
bastla Oct 03, 2010 at 19:22:43 (UTC)
Goto Top
Hallo Roschka!
Reicht es, wenn ich diese Zeilen einfach mit deinem Vorschlag ersetze??? Oder wo baue ich diese Zeile(n) ein?
Ersteres.
Na gut. jetzt kann ich im Windows-Explorer alle übrig gebliebenen Hauptorder mit ALT+D+I in den Eigenschaften sehen ob sie 0 byte und 0 Dateien sind und gleich löschen.
Sollte eigentlich der Batch im oben verlinkten "Nachbar"-Thread leisten ...
- für mich wäre die "2>nul"-Variante ausreichend.
Die unterdrückt zwar die Ferhlermeldungen, verkürzt aber nicht die Zeit der Verarbeitung...
Der Aufruf von "findstr" für jede einzelne Datei dürfte der Performance allerdings mehr schaden.
Zu den verbleibenden "Spezial"-Problem auf Deinem System (ein Verschieben etwa einer Datei "ein %20Bild.jpg" aus einem Ordner "!Mein%20Ordner" hatte bei meinem Test geklappt) kann ich wohl nix mehr beitragen ...

Grüße
bastla
Member: Roschka
Roschka Oct 03, 2010 at 21:05:58 (UTC)
Goto Top
Hallo bastla,
sie 0 byte und 0 Dateien sind und gleich löschen.
Sollte eigentlich der Batch im oben verlinkten "Nachbar"-Thread leisten ...
Habe ich mir angesehen, aber leider, wie immer am Anfang beim lesen deiner Scripte, erst mal "Bahnhof verstanden". face-wink
Daher ist mir auch nicht klar, wie ich das bei mir einbauen könnte, oder ob man die beiden Schnipsel dort unveränert in einer Datei verwenden könnte...
Aber wegen des %Parent%, werde ich das mal separat ausprobieren...
----
>> - für mich wäre die "2>nul"-Variante ausreichend.
> Die unterdrückt zwar die Ferhlermeldungen, verkürzt aber nicht die Zeit der Verarbeitung...
Der Aufruf von "findstr" für jede einzelne Datei dürfte der Performance allerdings mehr schaden.
Oha! Wie könnte man das in den "sort"-string für MakeDir und RemoveDir einbauen? Brächte das was?
Die scheinbar längste Zeit braucht der Teil :ProcessFile, während der keine echo-Ausgabe (mehr) erfolgt.
Also die FOR-Schleife mit ('dir /s /b /on "%Basis%\*.%Typ%"')

Die Zeile :verarbeiten
echo sortiere Makedirs.bat ... %time%
konnte ich gar nicht lesen, weil schon die Meldungen "Zugriff verweigert " von
call MoveList.bat
durch das Fenster scrollten. Die Zeile muß ich auch mit "2>nul" ergänzen.
Da hätte ich wohl noch
set Zwischenzeit=%time%
einbauen und am Ende mit Ausgeben müssen.
btw. Kann man eigentlich in BATCH mit Zeit rechnen? Startzeit-Endzeit=Verarbeitungszeit? oder so?
Bei kleineren Ordnern ist noch noch relativ egal, ob das 2 oder 3 Miniten dauert. Bei größeren Ordnern wird es aber schon wichtig, ob es 2 oder 3 Stunden dauert. und was man in der Zeit sieht.
Mittels echo in der FOR-Schleife jede Zeile im Fenster auszugeben, verlangsamt die Abarbeitung erheblich.
Schon das "Drüberlegen" eines anderen Fensters über das DOS-Fenster, so daß nur noch 1-2 Zeilen des DOS-Fensters sichtbar sind, beschleunigt die Abarbeitung erheblich!

In dem Zusammenhang finde ich folgende Beiträge interessant, die sich mit Fortschrittsanzeigen beschäftigen:
Fortschrittsanzeige beim Kopieren
DCOM FEHLER 10009 - von Computer die Offline sind
Echo ohne Zeilenumbruch und ähnliche Spielereien
Ich habe aber noch nicht alles gelesen oder ausprobiert. face-wink

----
Zu den verbleibenden "Spezial"-Problem auf Deinem System (ein Verschieben etwa einer Datei "ein %20Bild.jpg"
aus einem Ordner "!Mein%20Ordner" hatte bei meinem Test geklappt) kann ich wohl nix mehr beitragen ...
Schade, aber nicht so schlimm. Ich werde sowas nicht jeden Tag machen müssen. Eher selten. Deshalb schreibe ich mir auch die Hilfen gegen meine Vergeßlichkeit da rein. Da kann ich die paar Restdateien von Hand bearbeiten.

Liebe Grüße
Roschka.
Member: Roschka
Roschka Oct 03, 2010 at 23:25:58 (UTC)
Goto Top
So nun habe ich mal eine Zeitanzeige eingebaut um zu sehen was wie lange dauert.
Verschoben wurde der Ordner VideoTools von einer Platte zur anderen mit rund 273 MB Inhalt, (die angeblich auf Datenträger 540 MB belegen, laut Ordnereigenschaften)
10.635 Dateien in 601 Ordnern.

F:\>d:\umlagern3.bat
Startzeit:                  0:16:44,15
erzeuge Dateilisten und Arbeits-Scripte...
Zwischenzeit:               0:22:17,79
sortiere Makedirs.bat ...   0:22:17,82
sortiere MoveList...        0:22:18,00
sortiere RemoveQuelle...    0:22:18,25
lege Zielordner an...       0:22:18,43
verschiebe Dateien...       0:22:21,21
loesche Quellordner...      0:24:38,04
entferne Arbeitsdateien...  0:24:43,81
fertig...
   Startzeit:               0:16:44,15
Zwischenzeit:               0:22:17,79
     Endzeit:               0:24:43,92
Wie man sieht dauerte das Erzeugen der Dateilisten deutlich am längsten, etwa5,5 Minuten.
Das Sortieren dauerte nur Bruchteile von Sekunden...
Das Anlegen der Ordner kaum 3 Sekunden
Das eigentliche Verschieben der Dateien nur reichlich 2,1 Minuten
Das Löschen der alten Ordner mit über 5 Sekunden deutlich länger als das Anlegen der neuen.
Insgesamt rund 8 Minuten.
Da die erzeugten Arbeitsdateien mit sort bearbeitet werden, kann man vielleicht Zeit Sparen, wenn man in der FOR-Schleife (oben ist es noch Zeile 8) bei ('dir /s /b /on "%Basis%\*.%Typ%"') die dir-Option /O:N weglassen, weil sie nicht viel bringt, aber Zeit kostet.
Member: Roschka
Roschka Oct 04, 2010 at 13:37:54 (UTC)
Goto Top
Ich habe das mal ausprobiert die Zeile
:ProcessFile
...
echo md "%Pfad%" >>MakeDirs.txt
mit
zu ersetzen und bekomme:
Startzeit: 12:23:14,67
erzeuge Dateilisten und Arbeits-Scripte...
FINDSTR: MakeDirs.txt kann nicht geöffnet werden.
FINDSTR: rdQuelle.txt kann nicht geöffnet werden.
Zwischenzeit: 12:23:16,15
Da MakeDirs.txt noch nicht angelegt ist, kann findstr es auch nicht öffnen!
Vermutlich müßte ich das vor "sort" arbeiten lassen?
Probiert: und geht auch nicht. makeDirs.bat hat noch alle Mehrfachzeilen und rmQuell.bat ist leer. Dafür gibt es jetzt im Ziel einen Ordner namens "Quell". ?!?
Also lass ich das lieber weg.

Wie man in oben erwähnten Artikeln lesen kann, ist eine Fortschrittsanzeige, die anders funktioniert, als jede Zeile der FOR-Schleife, die die Arbeitsdateien anlegt in das DOS-Fenster zu echo'en, zeitaufwendig oder unpraktikabel. Mann mußte ja erst mal die zu bearbeitenden Dateien zählen, was zusätzlich Zeit kostet.
Auch das echo'en von "bearbeite Zeile... xyz" frist durch das scrollen der Zeilen Zeit.
Also ist es besser, man wartet bis nach "echo erzeuge Dateilisten und Arbeits-Scripte..."
die Meldung "echo Zwischenzeit: %time%" kommt, und sieht erst mal nicht was passiert.
die dir-Option /O:N wegzulassen bringt einen kleinen Zeitvorteil, weil "dir" sofort die Liste ausgibt.
Beim jetzigen Scriptlauf auf einen 5GB großen Ordner mit 92300 Dateien warte ich schon über eine dreiviertel Stunde auf die nächste Meldung. Die For-Schleife läuft noch...

Die Anzahl der Dateien habe ich mit folgendem codeschnipsel ermittelt:
...
:: --------Anzahl der zu kopierenden Dateien ermittelm------------
:: --------von hier an anpassen ----(Biber)-----------------------
Set "sourcefiles=%Basis%" & set "targetdir=D:\temp\"   
Set "xcopyOpts= /s /e /y /h"   
:: --------bis hier her anpassen 
Set "tmplist=%temp%\x2copy.lst   
rem echo Quelle: %sourcefiles% Ziel: %targetdir%
xcopy %xcopyOpts% /L "%sourcefiles%" "%targetdir%" >%tmplist%   
for /f %%i in ('findstr "Datei(en)" %tmplist%') do Set /a Anzahl=%%i   
set AnzahlZeit=%time%
echo es sind    %Anzahl% Dateien zu verarbeiten. 
del %tmplist% 
:: ---------Ende Anzahl der Dateien ermitteln---------------------
Nun wäre es nett so etwa alle 1000 Zeilen eine Meldung zu bekommen wie
1000 Zeilen von $Anzahl% verarbeitet
2000 Zeilen von $Anzahl% verarbeitet
3000 Zeilen von $Anzahl% verarbeitet
4000 Zeilen von $Anzahl% verarbeitet
Aber nicht öfter.

Der Versuch propy.cmd statt move.exe in der Movelist.bat einzusetzen scheiterte, weil propy nach der ersten Zeile in MoveList.bat diese beendete. Ansonsten ist prpoy bei sehr großen Einzeldateien ganz witzig anzusehen.

Übrigends scheint es eine Obergrenze zu geben, bis zu der die Arbeitsdateien geschrieben werden.
Die waren je rund 32 MB groß und enthielten nur noch den 2. Teil der sortierten Listen.
Ich lies das Script umlagern3.bat auf nen Ordner mit 9 GB los. Die ersten Ordner von 3D bis DjvuLib, mit den größten Dateienmassen, blieben unverschoben liegen.

So etwas später
MoveList.txt ist 97110 Zeilen Lang, 17.447 KB groß
MakeDirs.bat ist auch 97110 Zeilen lang und 7.483 KB groß und enthielt alleine 396 Zeilen von "md D:\Wurzelordner"
die rdQuelle.bat ist mit 8627 KB sogar größer, hat aber ebensoviele Zeilen.
Das Erstellen dieser Listen dauerte 1:15:20 Stunden, die Zielordner anzulegen ganze 2 Minuten. Das verschieben der Dateien dauerte 33 Minuten und lies 9,51 MB in 495 Dateien und 424 Ordnern im Quellverzeichnis übrig. ?!?
Meist Dateien der Art: Denim%20jacket%20front%20thmbnl.jpg oder 1x1 pixel gifs mit unaussprechlichen Namen (die kann man vergessen)
Hier würde ich gern noch einen Arbeitsschritt einbauen, den ich in meinem alten Script manuell im Editor machte:
suche nach Vorkommen von "%20" oder ähnlichen in Namen und ersetze es "%" durch "*"
Dann klappt das verschieben nämlich.
Member: bastla
bastla Oct 04, 2010 at 14:26:25 (UTC)
Goto Top
Hallo Roschka!
Da MakeDirs.txt noch nicht angelegt ist, kann findstr es auch nicht öffnen!
type nul>MakeDirs.txt
gleich am Anfang der gesamten Verarbeitung (also zumindest vor der "for"-Schleife) sollte dieses Problem lösen ...

Grüße
bastla
Member: Roschka
Roschka Oct 04, 2010 at 15:50:57 (UTC)
Goto Top
Hallo bastla,
OK habe ich eingebaut, es klappt aber trotzdem nicht. In der Ausgabe erscheind fortlaufend "
FINDSTR: Suchzeichenfolge zu lang.
FINDSTR: Suchzeichenfolge zu lang.
FINDSTR: Suchzeichenfolge zu lang.
FINDSTR: Suchzeichenfolge zu lang.

In den restlichen 791 Zeilen der movelist.bat mit den noch nicht verschobenen Dateien taucht 698 mal das "%" im Dateinamen auf! Die habe ich gerade mit Notepad++ ersetzt, und movelist.bat manuell.gestartet.

Ich habe vorher diesen Schnipsel mir verschiedenen Pfaden direkt in der konsole versucht, ohne Erfolg.
D:\>setlocal enableDelayedExpansion & for %i in ("e:\schnipsel\*%20*.*") do @set  "neu=%~nxi" & echo ren "%i" "!neu:%20=_!"  
zumindest scheint das nicht recursiv zu gehen.
Egal.

Ich werde erst mal wieder "Call notepad MoveList.bat" aufrufen müssen, "manuell" % ersetzen, speichern, schließen und weiter im script.
Member: bastla
bastla Oct 04, 2010 at 16:08:38 (UTC)
Goto Top
Hallo Roschka!
D:\>setlocal enableDelayedExpansion & for %i in ("e:\schnipsel\*%20*.*") do @set  "neu=%~nxi" & echo ren "%i" "!neu:%20=_!"  
dürfte weder rekursiv (dazu wäre "for /r" oder "for /f" mit "dir /s /b" zu verwenden) noch überhaupt funktionieren, da "delayedExpansion" in der selben Zeile steht und damit noch nicht wirksam wird - mach einen Batch draus und versuch' es damit ...

Grüße
bastla
Member: Roschka
Roschka Oct 04, 2010 at 19:06:19 (UTC)
Goto Top
Hallo bastla,
egal. Ich hatte das aus einem anderen Beitrag hier im Forum. Ich habe nach brauchbaren Beiträgen gesucht, ehe ich irgendwas frage...
Ich habe nun inzwischen fast alles wieder mit der umbewegen.bat zurückgeschoben, manches, was nicht per script ging von Hand.
Grade läuft MyDefrag und arbeitet die Liste der ehemals "nicht verschiebbaren Dateien" ab. MyDefrag läuft mit dem Script Analyse Only.myd. Dann lasse ich "optimize daily" drüber laufen. Die tausenden gesperrten Fetzen scheinen nun weg zu sein. Ich hatte alle mit "xcopy /T" angelegten Ordnerstrukturen wieder gelöscht und mit unserem "umbewegen.bat" wieder neu anlegen lassen.
Übrigens blieben die ganzen thumbs.db liegen, weil sie "versteckt" markiert sind und dadurch werden die Ordner nicht entfernt. Verwende ich bei FOR ('dir /s /b /**ah* "%Basis%\*.%Typ%"'), werden wiederum nur diese verschoben. Mit /a:ahrs-d funktioniert auch nicht wirklich. Komischerweise wurden auch manche Ordner nicht als solche erkannt und in die Makedirs.bat geschrieben, folglich klappte dann move nicht, weil Ordner fehlte. Keine Ahnung was die betroffenen Ordner für komische Flags haben!?.
Member: Nightowl71
Nightowl71 Jul 25, 2015 at 19:45:41 (UTC)
Goto Top
oh der thread ist wirklich schon alt, vll kann mir trotzdem geholfen werden (?)

ich habe ein ähnliches problem...

möchte das mir ein script meine dateien in unterordner verschiebt....

bild1.jpg nach unterordner B
urlaub1.jpg nach unterordner U
usw... jeweils der 1 buchstabe für sortierung beachtet wird.

unterordner (wenn vorhanden) sollen dabei unberührt bleiben, weil ich nur dateien verschieben möchte....

vielen dank im voraus face-smile
Member: bastla
bastla Jul 26, 2015, updated at Aug 02, 2015 at 21:18:00 (UTC)
Goto Top
Hallo Nightowl71!

Schematisch etwa so:
@echo off & setlocal
set "Ordner=D:\Dein Ordner"  
for %%i in ("%Ordner%\*.*") do set "Name=%%~ni" & call :ProcessFile "%%i"  
goto :eof

:ProcessFile
md "%Ordner%\%Name:~,1%" 2>nul  
echo move %1 "%Ordner%\%Name:~,1%"  
goto :eof
Das echo in Zeile 8 sorgt während der Testphase dafür, dass die move-Anweisungen nur angezeigt, aber nicht ausgeführt werden - die Zielordner werden aber schon mal erstellt ...

Falls nur Dateien eines bestimmten Typs (in Deinem Beispiel .jpg) berücksichtigt werden sollen, kannst Du natürlich die Zeile 3 entsprechend anpassen.

Grüße
bastla
Member: Nightowl71
Nightowl71 Aug 02, 2015 at 21:00:07 (UTC)
Goto Top
hi bastla,

vielen vielen dank.... dein script macht genau, was es soll!!!!

wie das mit ordnern geht, steht glaube im vorfeld. ansonsten melde ich mich mal wieder face-smile

lg.
Member: Nightowl71
Nightowl71 Aug 02, 2015 at 21:18:36 (UTC)
Goto Top
hmmm, das verschieben von ordnern (a-z) scheint schwieriger zu sein, oder gibt es da eine endgültige lösung?
Member: bastla
bastla Aug 02, 2015 at 21:19:17 (UTC)
Goto Top
Hallo Nightowl71!
wie das mit ordnern geht, steht glaube im vorfeld.
Was meinst Du damit?

Grüße
bastla
Member: Nightowl71
Nightowl71 Aug 02, 2015 at 21:22:48 (UTC)
Goto Top
der thread heisst doch "Unterordner in A-Z Ordnerstruktur einsortieren per (Windows) Batch Datei", das meinte ich damit face-smile
Member: bastla
bastla Aug 02, 2015 updated at 21:34:33 (UTC)
Goto Top
Hallo Nightowl71!

Wenn Du Ordner in Unterordner anhand des ersten Zeichens einsortieren wolltest, dann würde ich das heute (stark gekürzt und ungetestet) etwa so versuchen:
@echo off & setlocal
set "Ordner=D:\Dein Ordner"  
for /d %%i in ("%Ordner%\*.*") do set "Name=%%~nxi" & call :ProcessFolder "%%~i"  
goto :eof

:ProcessFolder
if /i %1=="%Ordner%\%Name:~,1%" goto :eof  
md "%Ordner%\%Name:~,1%" 2>nul  
echo move %1 "%Ordner%\%Name:~,1%\"  
goto :eof
Grüße
bastla
Member: Nightowl71
Nightowl71 Aug 02, 2015 at 21:38:57 (UTC)
Goto Top
vielen dank!!!
ich teste das morgen abend mal.... und meld mich.....

ganz liebe grüsse
Member: bastla
bastla Aug 02, 2015 at 21:47:15 (UTC)
Goto Top
Hallo Nightowl71!

Aber bitte vorsichtig sein und wirklich nur Testdaten verwenden!

Grüße
bastla
Member: Nightowl71
Nightowl71 Aug 03, 2015 at 17:16:23 (UTC)
Goto Top
problem.... unter xp ging es unter win7 nicht face-sad

@echo off & setlocal
set "Ordner=H:\1"
for /d %%i in ("%Ordner%\*.*") do set "Name=%%~nxi" & call :ProcessFolder "%%~i"
goto :eof

:ProcessFolder
if /i %1=="%Ordner%\%Name:~,1%" goto :eof
md "%Ordner%\%Name:~,1%" 2>nul
move %1 "%Ordner%\%Name:~,1%\"
goto :eof

habe es als admin gestartet....
gibt es zwischen win7 und xp sonst noch unterschiede?

lg
Member: Biber
Biber Aug 03, 2015 updated at 19:23:03 (UTC)
Goto Top
Moin Nightowl_71,

Kennt denn der User admin ein Laufwerk H: oder ist das evtl. ein Laufwerksbuchstabe, den nur der "normale" user kennt?

Grüße
Biber
Member: Nightowl71
Nightowl71 Aug 03, 2015 at 18:07:10 (UTC)
Goto Top
habe paar daten auf ein anderes lw kop und ohne adminrechte gestartet....nichts face-sad
Hotly discussed
AlexWishaHow to set up and configure a Linux GRE tunnelAlexWisha - 3 CommentsjstrickerWIREGUARD VPN ON UDM PRO BEHIND FRITZBOX - HANDSHAKE DID NOT COMPLETEjstricker - 3 CommentsgleixnerdCheck of ZFW Firewallgleixnerd - 2 CommentsDaniEnd of Support dates for Office 2016, 2019 Apps und Productivity ServersDani - 1 Comment