Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: EasyVdr

EasyVdr (Level 1) - Jetzt verbinden

22.09.2008, aktualisiert 18.10.2012, 14439 Aufrufe, 50 Kommentare, 1 Danke

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!!!
50 Antworten
Mitglied: bastla
22.09.2008 um 20:39 Uhr
Hallo EasyVdr und willkommen im Forum!

Das könnte etwa so gehen:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Alle Meine Fotos" 
03.
set "Ziel=D:\Fotos alphabetisch" 
04.
for /d %%i in ("%Quelle%\*.*") do call :ProcessDir "%%i" 
05.
goto :eof 
06.
 
07.
:ProcessDir 
08.
set "Verz=%~nx1" 
09.
echo Bearbeite: %Verz% 
10.
set "B=%Verz:~,1%" 
11.
if not exist "%Ziel%\%B%\" goto :eof 
12.
set /a Index=1 
13.
:Check 
14.
if not exist "%Ziel%\%B%\%Verz%" goto :MoveIt 
15.
set Index+=1 
16.
set "Verz=%~nx1-%Index%" 
17.
goto :Check 
18.
 
19.
:MoveIt 
20.
move %1 "%Ziel%\%B%\%Verz%">nul 
21.
goto :eof
Wenn Du zuerst nur testen willst, ersetze die Zeile 20 durch:
01.
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
Bitte warten ..
Mitglied: EasyVdr
22.09.2008 um 22:13 Uhr
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!!
Bitte warten ..
Mitglied: EasyVdr
22.09.2008 um 23:08 Uhr
Ich hab gerade festgestellt dass move nur bei gleichen Partitionen funktioniert - ich habe deswegen die :MoveIt etwas angepasst:

01.
  
02.
 
03.
:MoveIt 
04.
xcopy %1 "%Ziel%\%B%\%Verz%" /s /i /c /h /e /r /k /d /y 
05.
del %1 /Q 
06.
rmdir %1 
07.
goto :eof 
08.
 
So funktionierts auch über Partitionen/Laufwerke hinweg. Vielleicht sogar auch auf Netzlaufwerke, aber das kann ich erst am Wochenende testen
Bitte warten ..
Mitglied: bastla
22.09.2008 um 23:22 Uhr
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
01.
rd /s /q %1
kannst Du den Ordner samt Unterordnern und Dateien eliminieren (was die "del"-Zeile einspart).

Grüße
bastla
Bitte warten ..
Mitglied: Roschka
17.06.2010, aktualisiert 18.10.2012
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 http://www.administrator.de/forum/batch-zum-dateien-bewegen-139698.html 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 machen?)
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?
Bitte warten ..
Mitglied: bastla
18.06.2010 um 08:47 Uhr
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:
01.
@echo off & setlocal 
02.
set "Typ=jpg" 
03.
set "Basis=D:\Alle Meine Fotos\Urlaub1998" 
04.
set "Ziel=H:\Fotos alphabetisch\ganz anders" 
05.
 
06.
for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do call :ProcessFile "%%i" 
07.
pause 
08.
goto :eof 
09.
 
10.
:ProcessFile 
11.
set "Pfad=%Ziel%%~dp1" 
12.
call set "Pfad=%%Pfad:%Basis%=%%" 
13.
echo md "%Pfad%" 2>nul 
14.
echo move %1 "%Pfad%" 
15.
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
Bitte warten ..
Mitglied: Roschka
19.06.2010 um 02:09 Uhr
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:
01.
@echo off & setlocal 
02.
> set "Typ=jpg" 
03.
> set "Basis=D:\Alle Meine Fotos\Urlaub1998" 
04.
> set "Ziel=H:\Fotos alphabetisch\ganz anders" 
05.
>  
06.
> for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do call :ProcessFile "%%i" 
07.
> pause 
08.
> goto :eof 
09.
>  
10.
> :ProcessFile 
11.
> set "Pfad=%Ziel%%~dp1" 
12.
> call set "Pfad=%%Pfad:%Basis%=%%" 
13.
> echo md "%Pfad%" 2>nul 
14.
> echo move %1 "%Pfad%" 
15.
> goto :eof 
16.
> 
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
Bitte warten ..
Mitglied: bastla
19.06.2010 um 02:36 Uhr
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:
01.
@echo off & setlocal 
02.
set "Dateien=%~nx1" 
03.
set "Basis=%~dp1" 
04.
set "Ziel=%~2" 
05.
 
06.
for /f "delims=" %%i in ('dir /s /b /on /a-d "%Basis%%Dateien%"') do call :ProcessFile "%%i" 
07.
goto :eof 
08.
 
09.
:ProcessFile 
10.
set "Pfad=%Ziel%\%~dp1" 
11.
call set "Pfad=%%Pfad:%Basis%=%%" 
12.
xcopy /L /yhrkf %1 "%Pfad%*"|findstr /v /c:"1 Datei(en) kopiert" 
13.
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 ...
Bitte warten ..
Mitglied: Roschka
19.06.2010 um 11:51 Uhr
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 "
01.
"-und-"
" verwenden.

Ich habe dein copyetwas.cmd ausprobiert, aber leider tut es immer noch nicht was ich erreichen will. Ich denke man muß bei
01.
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):
01.
F:\Bilder\AdamUndEva\.picasa.ini -> M:\Bilder\.picasa.ini 
02.
0 Datei(en) kopiert 
03.
F:\Bilder\AdamUndEva\16137_fastentuch-01_Adam+Eva.jpg -> M:\Bilder\16137_fastentuch-01_Adam+Eva.jpg 
04.
F:\Bilder\AdamUndEva\2816_Paar.jpg -> M:\Bilder\2816_Paar.jpg 
05.
F:\Bilder\AdamUndEva\Adam-and-Eve-Posters.jpg -> M:\Bilder\Adam-and-Eve-Posters.jpg 
06.
F:\Bilder\AdamUndEva\Adam-and-Eve-Posters2.jpg -> M:\Bilder\Adam-and-Eve-Posters2.jpg 
07.
F:\Bilder\AdamUndEva\Eve_tempted.jpg -> M:\Bilder\Eve_tempted.jpg 
08.
F:\Bilder\AdamUndEva\pano.jpg -> M:\Bilder\pano.jpg 
09.
F:\Bilder\AdamUndEva\pano.txt -> M:\Bilder\pano.txt 
10.
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:
01.
(Ausgabe in DOS-Box) 
02.
F:\Bilder\Alboin\4bc-Dateien\Born2.gif -> M:\Bilder\4bc-Dateien\Born2.gif 
03.
F:\Bilder\Alboin\4bc-Dateien\centBarREV.gif -> M:\Bilder\4bc-Dateien\centBarREV.gi 
04.
F:\Bilder\Alboin\4bc-Dateien\NavA.gif -> M:\Bilder\4bc-Dateien\NavA.gif 
05.
F:\Bilder\Alboin\4bc-Dateien\NavC.gif -> M:\Bilder\4bc-Dateien\NavC.gif 
06.
F:\Bilder\Alboin\4bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\4bc-Dateien\S 
07.
F:\Bilder\Alboin\4bc-Dateien\ScavNav.gif -> M:\Bilder\4bc-Dateien\ScavNav.gif 
08.
F:\Bilder\Alboin\4bc-Dateien\TSTitle.gif -> M:\Bilder\4bc-Dateien\TSTitle.gif 
09.
F:\Bilder\Alboin\3bc-Dateien\Blkbkg.gif -> M:\Bilder\3bc-Dateien\Blkbkg.gif 
10.
F:\Bilder\Alboin\3bc-Dateien\Born2.gif -> M:\Bilder\3bc-Dateien\Born2.gif 
11.
F:\Bilder\Alboin\3bc-Dateien\centBarREV.gif -> M:\Bilder\3bc-Dateien\centBarREV.gi 
12.
F:\Bilder\Alboin\3bc-Dateien\NavA.gif -> M:\Bilder\3bc-Dateien\NavA.gif 
13.
F:\Bilder\Alboin\3bc-Dateien\NavC.gif -> M:\Bilder\3bc-Dateien\NavC.gif 
14.
F:\Bilder\Alboin\3bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\3bc-Dateien\S 
15.
F:\Bilder\Alboin\3bc-Dateien\ScavNav.gif -> M:\Bilder\3bc-Dateien\ScavNav.gif 
16.
F:\Bilder\Alboin\3bc-Dateien\TSTitle.gif -> M:\Bilder\3bc-Dateien\TSTitle.gif 
17.
F:\Bilder\Alboin\2bc-Dateien\Blkbkg.gif -> M:\Bilder\2bc-Dateien\Blkbkg.gif 
18.
F:\Bilder\Alboin\2bc-Dateien\Born2.gif -> M:\Bilder\2bc-Dateien\Born2.gif 
19.
F:\Bilder\Alboin\2bc-Dateien\centBarREV.gif -> M:\Bilder\2bc-Dateien\centBarREV.gi 
20.
F:\Bilder\Alboin\2bc-Dateien\NavA.gif -> M:\Bilder\2bc-Dateien\NavA.gif 
21.
F:\Bilder\Alboin\2bc-Dateien\NavC.gif -> M:\Bilder\2bc-Dateien\NavC.gif 
22.
F:\Bilder\Alboin\2bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\2bc-Dateien\S 
23.
F:\Bilder\Alboin\2bc-Dateien\ScavNav.gif -> M:\Bilder\2bc-Dateien\ScavNav.gif 
24.
F:\Bilder\Alboin\2bc-Dateien\TSTitle.gif -> M:\Bilder\2bc-Dateien\TSTitle.gif 
25.
F:\Bilder\Alboin\1bc-Dateien\Blkbkg.gif -> M:\Bilder\1bc-Dateien\Blkbkg.gif 
26.
F:\Bilder\Alboin\1bc-Dateien\Born2.gif -> M:\Bilder\1bc-Dateien\Born2.gif 
27.
F:\Bilder\Alboin\1bc-Dateien\CaesarBtn.gif -> M:\Bilder\1bc-Dateien\CaesarBtn.gif 
28.
F:\Bilder\Alboin\1bc-Dateien\centBarREV.gif -> M:\Bilder\1bc-Dateien\centBarREV.gi 
29.
F:\Bilder\Alboin\1bc-Dateien\NavA.gif -> M:\Bilder\1bc-Dateien\NavA.gif 
30.
F:\Bilder\Alboin\1bc-Dateien\NavC.gif -> M:\Bilder\1bc-Dateien\NavC.gif 
31.
F:\Bilder\Alboin\1bc-Dateien\ScavengerSPECTRUMHead.jpeg -> M:\Bilder\1bc-Dateien\S 
32.
F:\Bilder\Alboin\1bc-Dateien\ScavNav.gif -> M:\Bilder\1bc-Dateien\ScavNav.gif 
33.
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
01.
@ECHO OFF 
02.
:anfang 
03.
IF "%1"=="/?" GOTO help 
04.
IF "%1"=="" GOTO fehler 
05.
IF "%2"=="" GOTO fehler2 
06.
echo Die aktuelle Datei heißt %0%. 
07.
REM Dieser Befehl erzeugt eine Pfad:Datei-Liste ohne Zusatzinfos und aber sortiert, jedoch mit vollem Pfad. 
08.
dir /N /b /O:N /X %1 > Dateiliste.txt 
09.
REM den Parameter /S von DIR mußte ich wieder entfernen, weil alles nur in eine flache Zielstruktur kopiert wird. 
10.
set TEXT_T="Dateiliste.txt" 
11.
for /f "eol= tokens=* delims= usebackq" %%i in (%TEXT_T%) do ( 
12.
echo move "%%i" %2 >>movelist.bat 
13.
14.
REM die folgende zeile kann auskommentiert werden 
15.
call notepad Dateiliste.txt 
16.
call notepad movelist.bat 
17.
GOTO ende 
18.
REM (ewentuell weitere Befehle) 
19.
:help 
20.
echo move2.bat $VER:0.4  17.05.2010 
21.
echo Nutzen: Dateien und Ordner in sortierter Form verschieben. 
22.
echo. 
23.
echo SYNTAX: move2.bat [Quelle:] [Ziel:] 
24.
echo. 
25.
GOTO ende 
26.
:fehler 
27.
echo "1. Parameter fehlt!" 
28.
:fehler2 
29.
echo "2. Parameter fehlt!" 
30.
:ende 
31.
rem del Dateiliste.txt 
32.
echo fertig. 
33.
REM --- :EOF
Grüße Ronald
Bitte warten ..
Mitglied: bastla
19.06.2010 um 12:02 Uhr
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 ...
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
Bitte warten ..
Mitglied: Roschka
19.06.2010 um 15:00 Uhr
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:
01.
echo "willst du die Quelldateien löschen, gib "y" ein, sonst "n" 
02.
if Eingabe="y" do (del /f /a %1) 
03.
else if Eingabe="n" do (go to :EOF) ; (oder einer anderen Sprungmarke) 
04.
if Eingabe="" do ("Frage wiederholen") 
05.
REM und abfragen des letzten Zeichens der Quellangabe 
06.
if lastchar %%Quelle="\" then do call Syntaxhinweis 
07.
:Syntaxhinweis 
08.
echo "wenn das letzte Zeichen von Quelle ein "\" ist, geht dieser Ordner verloren. Quellpfad bitte ohne "\" eingeben. 
09.
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
Bitte warten ..
Mitglied: bastla
19.06.2010 um 15:17 Uhr
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:
01.
@echo off & setlocal 
02.
set "Dateien=%~nx1" 
03.
set "Basis=%~dp1" 
04.
set "Ziel=%~2" 
05.
 
06.
set "Verschieben=" 
07.
:Loop 
08.
set "Eingabe=" 
09.
set /p Eingabe=Willst du die Quelldateien loeschen, gib "y" ein:  
10.
if not defined Eingabe goto :Loop 
11.
if /i "%Eingabe:~,1%"=="y" set "Verschieben=True" 
12.
echo\ 
13.
if defined Verschieben ( 
14.
    echo Die Quelldaten werden verschoben = geloescht! 
15.
) else ( 
16.
    echo Die Quelldaten werden kopiert, nicht verschoben! 
17.
18.
echo\ 
19.
pause 
20.
for /f "delims=" %%i in ('dir /s /b /on /a-d "%Basis%%Dateien%"') do call :ProcessFile "%%i" 
21.
goto :eof 
22.
 
23.
:ProcessFile 
24.
set "Pfad=%Ziel%\%~dp1" 
25.
call set "Pfad=%%Pfad:%Basis%=%%" 
26.
xcopy /L /yhrkf %1 "%Pfad%*"|findstr /v /c:"1 Datei(en) kopiert" && if defined Verschieben echo del /f /a %1 
27.
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
Bitte warten ..
Mitglied: Roschka
19.06.2010 um 21:17 Uhr
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:
01.
move %1 "%Ziel%\%Verz1%\%Verz2%" 
02.
oder je nach Pfadlänge auch  
03.
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
01.
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
Bitte warten ..
Mitglied: bastla
19.06.2010 um 21:49 Uhr
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
Bitte warten ..
Mitglied: Roschka
22.06.2010 um 02:18 Uhr
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
01.
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
Bitte warten ..
Mitglied: bastla
22.06.2010 um 07:16 Uhr
Hallo Roschka!
Du hast den Sinn der Zeile 08. meines Schnipsels
01.
 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
Bitte warten ..
Mitglied: Biber
22.06.2010 um 10:08 Uhr
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.

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]
Bitte warten ..
Mitglied: Roschka
24.06.2010 um 14:53 Uhr
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
Bitte warten ..
Mitglied: Biber
24.06.2010 um 16:09 Uhr
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
Bitte warten ..
Mitglied: Roschka
01.10.2010 um 13:45 Uhr
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:
01.
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)
01.
E:\>call :ProcessFile "e:\Dokumente und Einstellungen\All Users\Anwendungsdaten\ 
02.
Adobe\Photoshop Elements\8.0\Photo Creations\frames\Gold Frame Round 2.metadata. 
03.
xml" 
04.
 
05.
E:\>set "Pfad="O:\Programme_D\Dokumente und Einstellungen"e:\Dokumente und Einst 
06.
ellungen\All Users\Anwendungsdaten\Adobe\Photoshop Elements\8.0\Photo Creations\ 
07.
frames\" 
08.
 
09.
E:\>call set "Pfad=%Pfad:"e:\Dokumente und Einstellungen"=%" 
10.
 
11.
E:\>md ""O:\Programme_D\Dokumente und Einstellungen"e:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Adobe\Photoshop Elements\8.0\Photo Creations\frames\" 
12.
Ein Unterverzeichnis oder eine Datei mit dem Namen "O:\Programme_D\Dokumente" existiert bereits. 
13.
Folgender Fehler trat auf: O:\Programme_D\Dokumente. 
14.
Ein Unterverzeichnis oder eine Datei mit dem Namen "und" existiert bereits. 
15.
Folgender Fehler trat auf: und. 
16.
**Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.** 
17.
^CFolgender Fehler trat auf: Einstellungene:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Adobe\Photoshop Elements\8.0\Photo Creations\frames\. 
18.
Batchvorgang abbrechen (J/N)? j 
19.
 
20.
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.)

Mein 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:
01.
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:
01.
... 
02.
REM ist nur ein Schnipsel ... 
03.
set TEXT_T="Dateiliste2.txt" 
04.
for /f "eol= tokens=* delims= usebackq" %%i in (%TEXT_T%) do ( 
05.
		set str=%Ziel%%%~pi  
06.
		set str=!str:~0,-1!  
07.
echo if not exists "%Ziel%%%~pi/nul" md "!str!" >>movelistDoks.bat 
08.
echo move "%%i" "%Ziel%%%~pi" >>movelistDoks.bat 
09.
...
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?
Bitte warten ..
Mitglied: bastla
01.10.2010 um 17:56 Uhr
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 ...
Bitte warten ..
Mitglied: Roschka
01.10.2010 um 20:11 Uhr
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:
01.
@echo off & setlocal 
02.
... 
03.
set "Quelle=%1" 
04.
set "Ziel=%1" 
05.
...
(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.
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.
01.
! Mein Ordner soll oben stehen 
02.
!! or nö meiner soll noch weiter oben sein 
03.
!!! Ätsch und meiner ist jetzt ganz obenj! 
04.
Sofort lesen!!!.txt 
05.
ein%20Bild.jpg 
06.
(oder noch blöder) 
07.
img@!325  (Dateinamen einer alten Webcam)
Auch sowas sorg für einzelne verstümmelte Ausgabezeilen, wenn man die Pfade mit Variablen bearbeiten will.
01.
	set str=%Ziel%%%~pi   
02.
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.

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.
Bitte warten ..
Mitglied: bastla
01.10.2010 um 20:31 Uhr
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.
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 ... )?

Schließlich genügt doch
set "Quelle=%~1"
Grüße
bastla
Bitte warten ..
Mitglied: Roschka
01.10.2010 um 21:02 Uhr
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.
Bitte warten ..
Mitglied: bastla
01.10.2010 um 21:09 Uhr
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 - 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:
01.
@echo off & setlocal 
02.
set "Typ=jpg" 
03.
set "Basis=%~1" 
04.
set "Ziel=%~2" 
05.
 
06.
for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do set "Pfad=%Ziel%%%~dpi" & set "Datei=%%i" & call :ProcessFile 
07.
pause 
08.
goto :eof 
09.
 
10.
:ProcessFile 
11.
call set "Pfad=%%Pfad:%Basis%=%%" 
12.
echo md "%Pfad%" 2>nul 
13.
echo move "%Datei%" "%Pfad%" 
14.
goto :eof
Bitte warten ..
Mitglied: Roschka
02.10.2010 um 14:45 Uhr
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.
Bitte warten ..
Mitglied: bastla
02.10.2010 um 16:14 Uhr
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 ...
Bitte warten ..
Mitglied: Roschka
03.10.2010 um 15:32 Uhr
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.

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.
01.
REM umlagern.bat 
02.
@echo off & setlocal 
03.
REM made by bastla from administrator.de 02.10.2010 
04.
set "Typ=*" 
05.
set "Basis=%~1" 
06.
set "Ziel=%~2" 
07.
 
08.
for /f "delims=" %%i in ('dir /s /b /on "%Basis%\*.%Typ%"') do set "Pfad=%Ziel%%%~dpi" & set "Datei=%%i" & set "Quell=%%~dpi" & call :ProcessFile 
09.
pause 
10.
goto :verarbeiten 
11.
 
12.
:ProcessFile 
13.
call set "Pfad=%%Pfad:%Basis%=%%" 
14.
call set "QPfad=%%Datei:%%~dpi" 
15.
echo md "%Pfad%" >>MakeDirs.txt 
16.
echo move "%Datei%" "%Pfad%" >>MoveList.txt 
17.
echo rd "%Quell%" >>rdQuelle.txt 
18.
goto :eof 
19.
 
20.
:verarbeiten 
21.
sort MakeDirs.txt /O MakeDirs.bat 
22.
sort MoveList.txt /O MoveList.bat 
23.
sort /R rdQuelle.txt /O rdQuelle.bat 
24.
call MakeDirs.bat 
25.
call MoveList.bat 
26.
call rdQuelle.bat 
27.
rm makedirs.* 
28.
rm movelist.* 
29.
rm rdquelle.* 
30.
goto :eof
(Nimm mir bitte nicht übel, daß ich reingeschrieben habe, wer der Urheber der Grundlage des scriptes ist! )

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.

Aber 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):
01.
 (MakeDirs.bat) 
02.
md "x:\test\PFY\"  
03.
md "x:\test\PFY\XtraDocF\"  
04.
md "x:\test\PFY\XtraDocF\"  
05.
md "x:\test\PFY\XtraDocF\"  
06.
md "x:\test\PFY\XtraDocF\"  
07.
md "x:\test\PFY\XtraDocF\Images\"  
08.
md "x:\test\PFY\XtraDocF\Images\"  
09.
md "x:\test\PFY\XtraDocF\Images\"  
10.
md "x:\test\PFY\XtraDocF\Images\"  
11.
md "x:\test\PFY\XtraDocF\Images\"  
12.
md "x:\test\PFY\XtraDocF\Images\"  
13.
md "x:\test\PFY\XtraDocF\Images\"  
14.
md "x:\test\PFY\XtraDocF\Images\" 
natürlich könnte ich auch Zeilen wie
01.
if not exist "x:\test\PFY\XtraDocF\Images\"  md "x:\test\PFY\XtraDocF\Images\" 
erzeugen... doch auch die hätten oft viele Wiederholungen.
oder
01.
 (rdQuelle.bat) 
02.
rd "F:\PFY\XtraDocF\Images\"  
03.
rd "F:\PFY\XtraDocF\Images\"  
04.
rd "F:\PFY\XtraDocF\Images\"  
05.
rd "F:\PFY\XtraDocF\Images\"  
06.
rd "F:\PFY\XtraDocF\Images\"  
07.
rd "F:\PFY\XtraDocF\Images\"  
08.
rd "F:\PFY\XtraDocF\Images\"  
09.
rd "F:\PFY\XtraDocF\Images\"  
10.
rd "F:\PFY\XtraDocF\"  
11.
rd "F:\PFY\XtraDocF\"  
12.
rd "F:\PFY\XtraDocF\"  
13.
rd "F:\PFY\XtraDocF\"  
14.
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:
01.
echo if not exist "%Pfad%" md "%Pfad%" >>MakeDirs.txt 
02.
... 
03.
echo  if exist "%Quelle%" rd "%Quell%" >>rdQuelle.txt
Ich wüßte nur noch gerne, wie ich die überflüssigen Mehrfachzeilen weg bekomme.
Bitte warten ..
Mitglied: bastla
03.10.2010, aktualisiert 18.10.2012
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
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! )
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" ...
Bitte warten ..
Mitglied: Roschka
03.10.2010 um 21:06 Uhr

Hallo 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. 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..

Gratulation! "Dein" Script funktioniert mit meinen Modifikationen jetzt besser als mein altes!

Also herzlichen Dank für DEINE Hilfe!


(Ja du hast Recht "rm" mußte "del" heißen... 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:
findstr /i /c:"%Pfad:\=\\%" MakeDirs.txt>nul||echo md "%Pfad%">>MakeDirs.txt
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
findstr /i /c:"%Quell:\=\\%" rdQuelle.txt>nul||echo md "%Quell">>rdQuelle.txt
???

Reicht 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:
01.
... 
02.
Zugriff verweigert 
03.
Zugriff verweigert 
04.
Zugriff verweigert 
05.
Zugriff verweigert 
06.
Zugriff verweigert 
07.
Zugriff verweigert 
08.
Zugriff verweigert 
09.
Zugriff verweigert 
10.
Zugriff verweigert 
11.
Zugriff verweigert 
12.
Zugriff verweigert 
13.
Verschieben beendet.  
14.
Loesche Quellordner... 
15.
entferne Arbeitsdateien... 
16.
fertig... 
17.
Startzeit: 17:28:51,20 
18.
 Endzeit: 18:54:37,20 
19.
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!
Bitte warten ..
Mitglied: bastla
03.10.2010 um 21:22 Uhr
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
Bitte warten ..
Mitglied: Roschka
03.10.2010 um 23:05 Uhr
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".
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.

----
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.
Bitte warten ..
Mitglied: Roschka
04.10.2010 um 01:25 Uhr
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.

01.
F:\>d:\umlagern3.bat 
02.
Startzeit:                  0:16:44,15 
03.
erzeuge Dateilisten und Arbeits-Scripte... 
04.
Zwischenzeit:               0:22:17,79 
05.
sortiere Makedirs.bat ...   0:22:17,82 
06.
sortiere MoveList...        0:22:18,00 
07.
sortiere RemoveQuelle...    0:22:18,25 
08.
lege Zielordner an...       0:22:18,43 
09.
verschiebe Dateien...       0:22:21,21 
10.
loesche Quellordner...      0:24:38,04 
11.
entferne Arbeitsdateien...  0:24:43,81 
12.
fertig... 
13.
   Startzeit:               0:16:44,15 
14.
Zwischenzeit:               0:22:17,79 
15.
     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.
Bitte warten ..
Mitglied: Roschka
04.10.2010 um 15:37 Uhr
Ich habe das mal ausprobiert die Zeile
:ProcessFile
...
echo md "%Pfad%" >>MakeDirs.txt
mit
findstr /i /c:"%Pfad:\=\\%" MakeDirs.txt>nul||echo md "%Pfad%">>MakeDirs.txt
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:
01.
... 
02.
:: --------Anzahl der zu kopierenden Dateien ermittelm------------ 
03.
:: --------von hier an anpassen ----(Biber)----------------------- 
04.
Set "sourcefiles=%Basis%" & set "targetdir=D:\temp\"  
05.
Set "xcopyOpts= /s /e /y /h"  
06.
:: --------bis hier her anpassen  
07.
Set "tmplist=%temp%\x2copy.lst  
08.
rem echo Quelle: %sourcefiles% Ziel: %targetdir% 
09.
xcopy %xcopyOpts% /L "%sourcefiles%" "%targetdir%" >%tmplist%  
10.
for /f %%i in ('findstr "Datei(en)" %tmplist%') do Set /a Anzahl=%%i  
11.
set AnzahlZeit=%time% 
12.
echo es sind    %Anzahl% Dateien zu verarbeiten.  
13.
del %tmplist%  
14.
:: ---------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.
Bitte warten ..
Mitglied: bastla
04.10.2010 um 16:26 Uhr
Hallo Roschka!
Da MakeDirs.txt noch nicht angelegt ist, kann findstr es auch nicht öffnen!
01.
type nul>MakeDirs.txt
gleich am Anfang der gesamten Verarbeitung (also zumindest vor der "for"-Schleife) sollte dieses Problem lösen ...

Grüße
bastla
Bitte warten ..
Mitglied: Roschka
04.10.2010 um 17:50 Uhr
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.
01.
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.
Bitte warten ..
Mitglied: bastla
04.10.2010 um 18:08 Uhr
Hallo Roschka!
01.
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
Bitte warten ..
Mitglied: Roschka
04.10.2010 um 21:06 Uhr
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!?.
Bitte warten ..
Mitglied: Nightowl71
25.07.2015 um 21:45 Uhr
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
Bitte warten ..
Mitglied: bastla
27.07.2015, aktualisiert 02.08.2015
Hallo Nightowl71!

Schematisch etwa so:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Dein Ordner" 
03.
for %%i in ("%Ordner%\*.*") do set "Name=%%~ni" & call :ProcessFile "%%i" 
04.
goto :eof 
05.
 
06.
:ProcessFile 
07.
md "%Ordner%\%Name:~,1%" 2>nul 
08.
echo move %1 "%Ordner%\%Name:~,1%" 
09.
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
Bitte warten ..
Mitglied: Nightowl71
02.08.2015 um 23:00 Uhr
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

lg.
Bitte warten ..
Mitglied: Nightowl71
02.08.2015 um 23:18 Uhr
hmmm, das verschieben von ordnern (a-z) scheint schwieriger zu sein, oder gibt es da eine endgültige lösung?
Bitte warten ..
Mitglied: bastla
02.08.2015 um 23:19 Uhr
Hallo Nightowl71!
wie das mit ordnern geht, steht glaube im vorfeld.
Was meinst Du damit?

Grüße
bastla
Bitte warten ..
Mitglied: Nightowl71
02.08.2015 um 23:22 Uhr
der thread heisst doch "Unterordner in A-Z Ordnerstruktur einsortieren per (Windows) Batch Datei", das meinte ich damit
Bitte warten ..
Mitglied: bastla
02.08.2015, aktualisiert um 23:34 Uhr
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:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Dein Ordner" 
03.
for /d %%i in ("%Ordner%\*.*") do set "Name=%%~nxi" & call :ProcessFolder "%%~i" 
04.
goto :eof 
05.
 
06.
:ProcessFolder 
07.
if /i %1=="%Ordner%\%Name:~,1%" goto :eof 
08.
md "%Ordner%\%Name:~,1%" 2>nul 
09.
echo move %1 "%Ordner%\%Name:~,1%\" 
10.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Nightowl71
02.08.2015 um 23:38 Uhr
vielen dank!!!
ich teste das morgen abend mal.... und meld mich.....

ganz liebe grüsse
Bitte warten ..
Mitglied: bastla
02.08.2015 um 23:47 Uhr
Hallo Nightowl71!

Aber bitte vorsichtig sein und wirklich nur Testdaten verwenden!

Grüße
bastla
Bitte warten ..
Mitglied: Nightowl71
03.08.2015 um 19:16 Uhr
problem.... unter xp ging es unter win7 nicht

@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
Bitte warten ..
Mitglied: Biber
03.08.2015, aktualisiert um 21:23 Uhr
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
Bitte warten ..
Mitglied: Nightowl71
03.08.2015 um 20:07 Uhr
habe paar daten auf ein anderes lw kop und ohne adminrechte gestartet....nichts
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...