booster07
Goto Top

Dateien in Abhängigkeit des Dateinamens auf eine bestimmte Zeichenzahl kürzen und verschieben

Hallo zusammen,

ich habe zwei Probleme, bei denen ich auf Eure kompotente Hilfe hoffe:

Problem 1:

Ich habe sehr viele Dateien mit dem Windows-Explorer umbenannt. Diese tragen jetzt alle eine automatisch generierte Nummerierung im Dateinamen, die offenbar im Windows-Explorer beim Umbenennen mehrerer Dateien offenbar nicht vermeidbar ist (oder liege ich falsch?).

Diese Nummerierung möchte ich gerne entfernen.

Die Dateien sind in verschiedenen Unterordnern des Ordners U:\Test abgelegt. Es sollen nur diejenigen Dateinamen gekürzt werden, die die Zeichenfolge "Blume_" im Dateinamen enthalten.

vorher:
Blume_01 (1)
Blume_02 (1)
...
Blume_15 (1)

nachher:
Blume_01
Blume_02
...
Blume_15


Problem 2:

In einem zweiten Schritt möchte ich die Dateien in einen bestimmten Unterordner verschieben. Die Ordnerstruktur sieht wie folgt aus:
U:\Test\Karl\schwarz
U:\Test\Karl\weiß
U:\Test\Fritz\schwarz
U:\Test\Fritz\weiß
U:\Test\Max\schwarz
U:\Test\Max\weiß
U:\Test\Paul\schwarz
U:\Test\Paul\weiß
...
Die Dateien liegen teilweise direkt in den Ordnern Karl,Fritz,Max,Paul etc. und teilweise in den Unterordnern "schwarz" und "weiß".
Ich möchte alle Dateien, die die Zeichenfolge "Blume_" im Dateinamen enthalten in den Ordner "schwarz" des jeweiligen Pfads verschieben.


Ich hoffe Ihr könnt mir weiterhelfen.

Vielen Dank schonmal.


Gruß Markus

Content-ID: 319295

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

Ausgedruckt am: 08.11.2024 um 07:11 Uhr

Friemler
Friemler 27.10.2016 um 17:59:41 Uhr
Goto Top
Hallo Markus,

teste mal folgendes:
@echo off & setlocal

set "RootDir=U:\Test"  
set "FileNamePattern=Blume_*"  
set "CopyToDir=schwarz"  


::Dateien umbenennen
for /r "%RootDir%" %%a in ("%FileNamePattern%") do (  
  for /f "delims=(" %%b in ("%%a") do (  
    ren "%%a" "%%~nb%%~xa" 1>NUL  
  )
)


::Dateien verschieben
for /d %%a in ("%RootDir%\*.*") do (  
  move "%%a\%FileNamePattern%" "%%a\%CopyToDir%" 1>NUL 2>NUL  

  for /d %%b in ("%%a\*.*") do (  
    if /i "%%~nb" neq "%CopyToDir%" (  
      move "%%b\%FileNamePattern%" "%%a\%CopyToDir%" 1>NUL 2>NUL  
    )
  )
)

Grüße
Friemler
Booster07
Booster07 28.10.2016 um 09:57:04 Uhr
Goto Top
Super! Funktioniert!

Vielen vielen Dank!!!

Ist es jetzt noch möglich die Datei so zu erweitern, dass Excel-Dateien (.xlsx und .xlsm) mit den Namen Blume_01, Blume_02, etc. in "schwarz" verschoben werden und alle Dateien der Typen .csv, .svd und .sv2 (die auch den Namen "Blume_..." tragen können aber nicht müssen) in den Ordner "weiß" verschoben werden.

Sorry für die spontane Änderung. Wäre echt super, wenn das auch noch klappt.


Viele Grüße
Booster07
Booster07 28.10.2016 um 10:41:09 Uhr
Goto Top
Dazu ist mir noch aufgefallen, dass die Datensortierung nicht mehr funktioniert sobald ich eine weitere Ebene (z.B. Ordner "FARBE") in der Ordnerstruktur einfüge.

Datensortierung funktioniert:
U:\Test\Karl\schwarz
U:\Test\Karl\weiß
U:\Test\Fritz\schwarz
U:\Test\Fritz\weiß
U:\Test\Max\schwarz
U:\Test\Max\weiß
U:\Test\Paul\schwarz
U:\Test\Paul\weiß

Datensortierung funktioniert nicht mehr:
U:\Test\Karl\FARBE\schwarz
U:\Test\Karl\FARBE\weiß
U:\Test\Fritz\FARBE\schwarz
U:\Test\Fritz\FARBE\weiß
U:\Test\Max\FARBE\schwarz
U:\Test\Max\FARBE\weiß
U:\Test\Paul\FARBE\schwarz
U:\Test\Paul\FARBE\weiß

Kann mir jemand sagen, wie sich die Batch-Datei aufgrund der zusätzlichen Ebene ändern würde.


Viele Grüße
Friemler
Friemler 28.10.2016 aktualisiert um 14:10:26 Uhr
Goto Top
Hallo Markus,

bevor wir hier weitermachen:

1. Wie viele Verzeichnisebenen sollen es den werden? Bleibt es fix bei drei Ebenen (unterhalb der Startebene U:\Test) oder können es auch zwei ODER drei sein oder noch mehr?

Abhängig von der Antwort auf diese Frage ergeben sich u.U. noch weitere Fragen:

2. Auf welchen Verzeichnisebenen können die zu verschiebenden Dateien liegen?

3. Gibt es die Verzeichnisse schwarz und weiß immer nur auf der vorletzten Verzeichnisebene oder auch darüber (gibt es also nur Paul\FARBE\schwarz und Paul\FARBE\weiß oder auch weiterhin Paul\schwarz und Paul\weiß)?

Abhängig von der Antwort auf Frage 3:

4. Wie wird das Zielverzeichnis bestimmt?


Grüße
Friemler
Booster07
Booster07 28.10.2016 um 14:52:39 Uhr
Goto Top
Hallo Friemler,

danke für Deine Hilfe!

zu 1. Es sind immer drei weitere Ebenen unter dem Ordner Test, in dem die Batch-Datei liegt (z.B. U:\Test\Karl\FARBE\schwarz), vorhanden.

zu 2. Die Dateien können sowohl in der zweiten Ebene (also im Ordner "FARBE"), als auch in der dritten Ebene (also in den Ordnern "schwarz" oder "weiß") abgelegt sein.

zu 3. Die Verzeichnisse "schwarz" und "weiß" gibt es nur auf der vorletzten Verzeichnisebene. Sie sind also immer im Ordner "FARBE" enthalten.

Frage 4 hat sich damit erübrigt oder?


Viele Grüße
Friemler
Lösung Friemler 28.10.2016 aktualisiert um 15:58:25 Uhr
Goto Top
Hallo Markus,

zunächst mal das geänderte Script:
@echo off & setlocal

set "RootDir=U:\Test"  
set "FileNamePattern=Blume_*"  

set "FileTypes1=.xlsx .xlsm"  
set "FileTypes1CopyToDir=schwarz"  

set "FileTypes2=.csv .svd .sv2"  
set "FileTypes2CopyToDir=weiß"  


::Dateien umbenennen
for /r "%RootDir%" %%a in ("%FileNamePattern%") do (  
  for /f "delims=(" %%b in ("%%a") do (  
    ren "%%a" "%%~nb%%~xa" 1>NUL  
  )
)


::Dateien verschieben
for /d %%a in ("%RootDir%\*.*") do (  
  for /d %%b in ("%%a\*.*") do (  
    call :MoveFilesInDir "%%b" "%FileNamePattern%" "%FileTypes1%" "%FileTypes1CopyToDir%"  
    call :MoveFilesInDir "%%b" "%FileNamePattern%" "%FileTypes2%" "%FileTypes2CopyToDir%"  

    for /d %%c in ("%%b\*.*") do (  
      call :MoveFilesInSubDir "%%c" "%FileNamePattern%" "%FileTypes1%" "%FileTypes1CopyToDir%"  
      call :MoveFilesInSubDir "%%c" "%FileNamePattern%" "%FileTypes2%" "%FileTypes2CopyToDir%"  
    )
  )
)

exit /b 0



:MoveFilesInDir
  for %%z in ("%~1\%~2") do (  
    echo %%z|findstr /iel "%~3" 1>NUL 2>NUL && (   
      move "%%z" "%~1\%~4" 1>NUL 2>NUL  
    )
  )
exit /b 0


:MoveFilesInSubDir
  if /i "%~nx1" neq "%~4" (  
    for %%z in ("%~1\%~2") do (  
      echo %%z|findstr /iel "%~3" 1>NUL 2>NUL && (   
        move "%%z" "%~dp1%~4" 1>NUL 2>NUL  
      )
    )
  )
exit /b 0

In den Zeilen 6 und 7 bzw. 9 und 10 werden Gruppen von Dateierweiterungen und die zugehörigen Zielverzeichnisse definiert. Falls Du weitere Gruppen und Zielverzeichnisse benötigst musst Du sie hier ergänzen (z.B. FileTypes3 und FileTypes3CopyToDir).

Außerdem musst Du dann auch weiter unten Aufrufe der Unterprogramme MoveFilesInDir (Zeile 24 und 25) bzw. MoveFilesInSubDir (Zeile 28 und 29) ergänzen. Für jede Gruppe von Dateierweiterungen einen Aufruf, in den Du die passenden Variablen einbauen musst.

Grüße
Friemler
Booster07
Booster07 28.10.2016 um 16:23:20 Uhr
Goto Top
Hallo Friemler,

unglaublich, das funktioniert einwandfrei.

Vielen vielen Dank für deine uneigennützige Hilfe!!!


Viele Grüße

Markus
Booster07
Booster07 02.11.2016 um 16:22:47 Uhr
Goto Top
Hallo Friemler,

die Datei hilft mir wirklich sehr weiter. Dank des logischen Aufbaus der Datei ist es mir auch mit meinen minimalen Kenntnissen gelungen, die Datei durch kleine Änderungen flexibel einzusetzen. Jetzt habe ich aber folgendes Problem.

Ich habe damals gesagt, dass die Dateien entweder im Ordner "FARBE" (zweite Ebene) oder in den Ordnern "schwarz" und "weiß" (dritte Ebene) abgelegt sind. Jetzt hat sich allerdings ein neues Problem ergeben, bei denen Dateien ausschließlich in der ersten Ebene, also direkt in den Ordnern "Karl", "Fritz", "Max" etc. abgelegt sind.

Wie müsste sich also die Datei ändern, damit Dateien aus der ersten Ebene verschoben werden können?

Die Dateien sind jetzt wirklich nur in der ersten Ebene vorhanden. Für die aktuelle Problemstellung wäre es also auch möglich Ebene 1, 2 und 3 zu berücksichtigen. Für zukünftige Problemstellungen könnte es aber unter Umständen hilfreich sein, wenn ich weiß, wie ich eine Eingrenzung auf eine bestimmte Ebene vornehme.

Ich wäre Dir sehr dankbar, wenn Du mir ein weiteres Mal helfen könntest.


Grüße

Markus
Friemler
Lösung Friemler 03.11.2016 um 04:13:25 Uhr
Goto Top
Hallo Markus,

wenn Du NUR Dateien aus der "Karl-Fritz-Max-Paul"-Ebene verabeiten willst, musst Du

  • die FOR-Schleife in Zeile 23 beseitigen (Zeile 23 und 31 löschen),
  • die FOR-Schleife in Zeile 27 mit Inhalt beseitigen (Zeile 27 bis 29 löschen) und
  • in Zeile 24 und 25 "%%b" durch "%%a" austauschen (die Laufvariable der gelöschten Schleife ersetzen).

Das Unterprogramm MoveFilesInSubDir kannst Du dann auch komplett entsorgen.



Wie funktioniert's?

Die äußere FOR-Schleife in Zeile 22 liefert alle Verzeichnisse unterhalb des Startverzeichnisses RootDir. Das ist die "Karl-Fritz-Max-Paul"-Ebene.

Die (zu löschende) FOR-Schleife in Zeile 23 liefert alle Verzeichnisse unterhalb der "Karl-Fritz-Max-Paul"-Ebene, also die "FARBE"-Ebene, deshalb muss diese Schleife weg.

Das Unterprogramm MoveFilesInDir wird mit dem Pfad der aktuellen Ebene aufgerufen (in der bisherigen Version des Scripts z.B. mit U:\Test\Fritz\FARBE, nach der Änderung mit U:\Test\Fritz).

Die FOR-Schleife in Zeile 39 ermittelt alle Dateien in diesem Verzeichnis, die auf die Dateimaske passen. Da diese nur für den Dateinamen gilt, filtere ich in Zeile 40 mit FINDSTR alle Dateien heraus, auf die die Liste der Dateinamenserweiterungen passt.

Passende Dateien werden in Zeile 41 verschoben. Dafür nutze ich die bedingte Befehlsverkettung mit dem &&-Operator (führe den nächsten Befehl nur aus, wenn der vorhergehende erfolgreich war, in dem Fall wenn FINDSTR eine passende Datei gefunden hat).

Das (zu löschende) Unterprogramm MoveFilesInSubDir steigt durch die FOR-Schleife in Zeile 49 nochmals eine Verzeichnisebene nach unten und verarbeitet die Dateien auf der ""schwarz-weiß"-Ebene nach dem gleichen Verfahren wie das andere Unterprogramm. Hier muss nur zusätzlich noch beachtet werden, dass Quell- und Zielverzeichnis ungleich sind, das erledigt Zeile 48.



Für zukünftige Anpassungen durch Dich:

Zusätzliche Verzeichnisebenen kannst Du durch das Einfügen weiterer FOR-Schleifen wie in Zeile 23 abdecken, weniger Ebenen durch das Entfernen dieser Schleifen. Dabei musst Du nur darauf achten, dass beim Aufruf des Unterprogramms MoveFilesInDir die korrekte FOR-Laufvariable übergeben wird.

Wenn Du mit den Buchstaben a-z für die Namen der FOR-Laufvariablen nicht auskommst face-wink , kannst Du dann noch A-Z verwenden, Groß-/Kleinschreibung wird bei den Variablennamen unterschieden.

Wenn Du magst, kannst Du Dir auch mein Tutorial zur FOR-Schleife durchlesen, könnte bei eigenen Änderungen hilfreich sein. Tipp: Lies nicht alles sondern nur was Du für Deine Aufgabe wirklich brauchst, sonst wird es zu viel.


Grüße
Friemler
Booster07
Booster07 03.11.2016 um 15:01:21 Uhr
Goto Top
Hallo Friemler,

Danke für Deine Hilfe und die ausführlichen Erläuterungen! Das hilft mir sehr weiter.

Wenn ich das Script wie beschrieben ändere, dann werden die zu verschiebenden Dateien in der "Karl-Fritz-Max-Paul"-Ebene zwar gefunden aber nicht in die entsprechenden Unterordner "schwarz" und "weiss" verschoben. In der "Karl-Fritz-Max-Paul"-Ebene werden anstattdessen zwei Dateien mit den Namen "schwarz" und "weiss" erzeugt , die die zu verschiebenden Dateien enthalten / verschlucken / ...
Ich vermute, dass die Ordner in dieser Ebene durch das neue Script nicht gefunden werden können. Ist das möglich?

Für meinen Anwendungsfall ist es aber kein Problem. Ich habe die Dateien mit dem neuen/veränderten Script zunächst in den Ordner "FARBE" verschoben (dieser Ordner wird nämlich gefunden). Anschließend habe ich durch Dein altes Script vom 28.10. die Dateien vom Ordner "FARBE" in die Unterordner "schwarz" und "weiss" verteilt.


Viele Grüße

Markus
Friemler
Friemler 03.11.2016 um 16:18:12 Uhr
Goto Top
Hallo Markus,

na ja, war doch ein wenig spät gestern und ich hatte keine Lust mehr, das was ich in meinem Posting verzapft hatte, auch zu testen. Aber Du konntest Dir ja selbst helfen, freut mich. Am meisten lernt man sowieso daraus, die Fehler von anderen zu verbessern, so geht es mir zumindest.

Grüße
Friemler