sully16
Goto Top

Batch Script zum Verschieben von Dateien mit bestimmten Namen erstellen - Anfang der Dateinamen mit Ordnernamen vergleichen (Leerzeichen, Sonderzeichen, unterschiedliche Dateinamenlänge)

Hallo,

ich benötige dringend eure Hife bei der Lösung eines Problems. Meine eigenen Versuche verliefen leider größtenteils erfolglos. Ich konnte zwar ein Scipt erstellen, aber es funktioniert nur, wenn die Dateinamen und der Name vom Zielordner 100% übereinstimmen und nicht wie gewünscht, wenn der Dateiname nur mit dem Ordnernamen beginnen.

Ich habe versucht eine Batchdatei (s.u.) zu erstellen, die Dateien aus einem Quellordner in verschiedene Zielordner auf unterschiedlichen Festplatten nach bestimmten Kriterien sortieren und verschieben soll. Am einfachsten kann man es mit den Filterregeln eines Mailprogamms vergleichen.

Alle Dateien eines Ordners sollen in die jeweils zur Datei gehörenden Ordner auf verschiedenen Festplatten verschoben werden. Die Dateinamen beginnen jeweils mit dem Namen des Zielordners und dann folgen völlig willkürliche alphanummerische Zeichen mit immer unterschiedlichen Längen. Die Namen der Zielordner enthalten Umlaute, Leerzeichen und Sonderzeichen und sie sind immer länger als 1 Zeichen.
In den Zielordnern können bereits Dateien mit dem gleichen Namen vorhanden sein. Wenn das der Fall ist, soll die Datei nicht in den eigentlichen Zielordner, sondern in den Ordner "Bearbeiten" im Rootverzeichnis des Quellordners veschoben werden, zur späteren manuellen Bearbeitung. Auf den Festplatten mit den Zielordnern sind Ordner, deren Name nur aus 1 Buchstaben besteht. Diese "Register"-Verzeichnisse dienen nur der Unterteilung der Ordner und sind keine Zielordner.

Nachdem meine eigenen Bemühungen und auch meine Suche im Internet und diesem Forum leider erfolglos waren, habe ich versucht, das Script in einzelne Aufgaben aufzubrechen.

1. Ein Script zur Ermittlung der Verzeichnisnamen
Ich habe ein Script erstellt, welches alle Namen der Unterordner (Zielordner) einer Festplatte in eine Logdatei schreibt.
Das Erstellen der Logdatei funktioniert, zumindest für 1 Festplatte. Leider enthält sie auch die "Register"-Ordern. Die krieg ich da nicht raus. Ich weiß nicht, wie. Hatte nach einem Befehl gesucht, der nur Ordnernamen mit mindestens 2 Zeichen Länge in die Logdatei schreibt. Im Internet steht, für die Ermittlung der Ordnernamenlänge wird ein eigenes, sehr aufwändiges Script dafür benötigt. Das war für mich zu kompliziert und den Aufwand nicht wert.

2. Vergleiche Dateinamen mit Ordnernamen aus Logdatei
Dann wollte ich mithilfe einer For-Schleife die Dateinamen mit den Name aus der Logdatei vergleichen. Zeile für Zeile. Bei Gleichheit soll die Datei in den Zielordner verschoben werden.
Ich habe es geschafft ein Script (s.u.) zu schreiben, welches die Ordnernamen aus der Logdatei mit den Dateinamen aus dem Quellordner vergleicht und bei Gleichheit die Dateien in die jeweiligen Zielordner mit gleichem Namen verschiebt. Soweit, so gut.

Mein eigentliches Problem ist jetzt, die Dateinamen sind nicht 100% identisch mit den Ordnernamen, sondern sie beginnen nur mit dem Ordnernamen!! Und genau dafür finde ich kein Script! Ich bekomme es einfach nicht hin!

Ich stelle das einmal zur besseren Verdeutlichung grafisch da.

Vorher:
c:\Test\Bearbeiten\
c:\Test\verzeichnis1
474 - Ü l452.txt
titel 1_543236.txt
titel#4 rh323.txt
titel7.txt

c:\Test\verzeichnis-xyz\
c:\Test\verzeichnis-xyz\0-1\
c:\Test\verzeichnis-xyz\474 - Ü\
c:\Test\verzeichnis-xyz\A\
c:\Test\verzeichnis-xyz\B\
c:\Test\verzeichnis-xyz\C\
...
c:\Test\verzeichnis-xyz\T\
c:\Test\verzeichnis-xyz\titel 1_54\
c:\Test\verzeichnis-xyz\titel#4 r\
c:\Test\verzeichnis-xyz\titel2\
c:\Test\verzeichnis-xyz\U\
...

Nach dem Sortieren:
c:\Bearbeiten\
titel7.txt
c:\Test\verzeichnis1\
c:\Test\verzeichnis-xyz\
c:\Test\verzeichnis-xyz\0-1\
c:\Test\verzeichnis-xyz\474 - Ü\
474 - Ü l452.txt
c:\Test\verzeichnis-xyz\A\
c:\Test\verzeichnis-xyz\B\
c:\Test\verzeichnis-xyz\C\
...
c:\Test\verzeichnis-xyz\T\
c:\Test\verzeichnis-xyz\titel 1_54\
titel 1_543236.txt
c:\Test\verzeichnis-xyz\titel#4 r\
titel#4 rh323.txt
c:\Test\verzeichnis-xyz\U\
...

Hier mein Script:
setlocal
chcp 1252

pushd "C:\Test\verzeichnis-xyz" || exit /b 1  
dir /AD /B > C:\Test\titel.log

:Start
copy "C:\Test\titel.log" "C:\Test\verzeichnis1"  
copy "C:\Test\titel.log" "C:\Test\verzeichnis-xyz"  

set "Quelle=C:\Test\verzeichnis1"  
set "Ziel=C:\Test\verzeichnis-xyz"  
set "Typ=.txt"  
set /p titel= <titel.log
set "Zielordner=%Ziel%\%titel%"  

pushd "%Quelle%"  

for /f "tokens=*" %%a in ('dir /b *%Typ%^|findstr "\%Typ%"') do if "%%~na"=="%titel%" move "%%a" "%Zielordner%"  


for %%a in ("C:\Test\titel.log") DO (  
	more /e +1 "%%a">"%%a.tmp"     
	del "%%a" && ren "%%a.tmp" "%%~na.log"   
)

set Datei=titel.log 
if exist "%Datei%" for %%A in (%Datei%) do if %%~zA GTR 0 goto Start,  Groesse: %%~zA  

pause
popd

Kann mir bitte einer von den erfahrenen Profis hier bei meinem Problem helfen?

Danke!

Gruß,
Sully16

Content-ID: 303364

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

Ausgedruckt am: 20.11.2024 um 06:11 Uhr

Friemler
Friemler 01.05.2016 aktualisiert um 20:24:00 Uhr
Goto Top
Hallo Sully16,

teste mal folgendes:
@echo off & setlocal

rem ****** Konfigurationsabschnitt ******
set "SrcFolder=C:\Test\verzeichnis1"  
set "DstFolder=C:\Test\verzeichnis-xyz"  
set "EditFolder=C:\Test\Bearbeiten"  
rem *************************************

rem Alle Verzeichnisse im Zielverzeichnis auflisten
for /d %%d in ("%DstFolder%\*.*") do (  
  rem Alle Dateien im Quellverzeichnis auflisten und ihre Namen durch
  rem einen Suchfilter laufen lassen, der alle Dateinamen liefert, die
  rem mit dem Namen des aktuellen Verzeichnisses beginnen
  for /f "delims=" %%f in ('dir /b /a:-d "%SrcFolder%" 2^>NUL ^| findstr /ibr /c:"%%~nxd.*"') do (  
    rem Aus dem Namen des aktuellen Verzeichnisses und dem Namen der aktuellen
    rem Quelldatei den vollständigen Zielpfad erzeugen und prüfen, ob die Datei
    rem bereits vorhanden ist
    if not exist "%%d\%%~nxf" (  
      rem Wenn nicht, wird sie in das Verzeichnis verschoben
      echo move "%SrcFolder%\%%~nxf" "%%d" > NUL  
    ) else (
      rem Wenn ja, wird sie in das Bearbeiten-Verzeichnis verschoben
      echo move "%SrcFolder%\%%~nxf" "%EditFolder%" > NUL  
    )
  )
)

rem Alle übrig gebliebenen Dateien ins Bearbeiten-Verzeichnis verschieben
echo move "%SrcFolder%\*.*" "%EditFolder%" > NUL  

Der Code gibt nur aus, was er tun würde. Um ihn "scharf zu schalten" musst Du die ECHO-Befehle in den Zeilen 20, 23, und 29 entfernen.

Ich bin anhand Deiner Beispieldaten davon ausgegangen, daß Dateien, für die kein Zielverzeichnis existiert, ebenfalls in das Bearbeiten-Verzeichnis verschoben werden sollen. Dafür dient Zeile 29.

Wenn die Zielverzeichnisse auf verschiedenen Festplatten liegen sollen, kannst Du Dir das Leben einfach machen, indem Du in C:\Test\verzeichnis-xyz einen NTFS-Symlink oder eine NTFS-Junction auf das Zielverzeichnis erstellst (siehe Konsolenbefehl MKLINK, Parameter /D oder /J, Administratorrechte erforderlich). Dann sind wir hier fertig. Sollte das nicht möglich sein, muss das Script noch erweitert werden, damit auch Zielverzeichnisse auf einer anderen Festplatte oder in einem anderen Verzeichnis als C:\Test\verzeichnis-xyz gefunden werden.

Gruß
Friemler
Sully16
Sully16 01.05.2016 um 23:00:56 Uhr
Goto Top
Hallo Friemler,

erst einmal vielen Dank für Deine Hilfe!
Ich habe Dein Script FRIEMLER.bat ins Verzeichnis C:\Test kopiert und ein paar Tests durchgeführt. Erst mit ECHO und dann ohne ECHO.
Solange ich Dein Script nur in der Testumgebung durchführe funktioniert alles tadellos!

Sobald ich aber Dein Script im eigentlichen Quellordner durchführe, macht es nicht mehr was es soll. Ich bin mir nicht sicher was es macht, da ich die verschobenen Dateien nicht wiederfinde. Im Ernst, sie sind verschwunden. Habe den Vorgang mehrmals wiederholt, jetzt landet zumindest der größte Teil im Ordner BEARBEITEN. Leider gehören sie dort nicht hinein, denn es gibt keine gleichlautenden Dateien in den Zielordnern. Und einige der Testdateien verschwinden immernoch ins Nirvana.
Ich habe daher versucht eine Logdatei vom Script zu erhalten, indem es seine Aktionen und vor allem den Verbleib der Dateien hineinschreiben soll. Leider war das nicht sehr erfolgreich. Da steht jetzt 4x "1 Datei kopiert" (genau dieser Text) und 1x "Dateiname mit der vollständigen Pfadangabe".

Hier das von mir angepasste Script.

@echo on & setlocal 

REM Ich wollte sehen, was passiert

DATE /T >> M:\Bearbeiten\friemler.log
TIME /T >> M:\Bearbeiten\friemler.log


rem ****** Konfigurationsabschnitt ****** 
set "SrcFolder=M:\_ Quelle _"   
set "DstFolder=H:\- TEST - 01-A-Dem\Ordner\Zielordner"   
set "EditFolder=M:\Bearbeiten"   

rem ************************************* 


rem Alle Verzeichnisse im Zielverzeichnis auflisten 
rem
  for /d %%d in ("%DstFolder%\*.*") do (   
rem
  rem Alle Dateien im Quellverzeichnis auflisten und ihre Namen durch 
  rem einen Suchfilter laufen lassen, der alle Dateinamen liefert, die 
  rem mit dem Namen des aktuellen Verzeichnisses beginnen 
rem
  for /f "delims=" %%f in ('dir /b /a:-d "%SrcFolder%" 2^>NUL ^| findstr /ibr /c:"%%~nxd.*"') do (   
rem
    rem Aus dem Namen des aktuellen Verzeichnisses und dem Namen der aktuellen 
    rem Quelldatei den vollständigen Zielpfad erzeugen und prüfen, 
    rem ob die Datei bereits vorhanden ist 
rem
    if not exist "%%d\%%~nxf" (  
rem
      rem Wenn nicht, wird sie in das Verzeichnis verschoben 
rem
      move "%SrcFolder%\%%~nxf" "%%d" > NUL >> M:\friemler.log  
    ) else ( 
rem
      rem Wenn ja, wird sie in das Bearbeiten-Verzeichnis verschoben 
rem
      move "%SrcFolder%\%%~nxf" "%EditFolder%" > NUL >> M:\friemler.log  
    ) 
  ) 
) 

rem
rem Alle übrig gebliebenen Dateien ins Bearbeiten-Verzeichnis verschieben 
rem
move "%SrcFolder%\*.*" "%EditFolder%" > NUL >> M:\friemler.log  
rem

pause

Ich finde den Fehler nicht. Teste jetzt seit 2,5 Stunden das von mir angepasste Script. Vielleicht siehst Du wo es hakt und warum.

Wie kann ich erreichen, dass das Script eine vernünftige Logdatei anlegt, damit ich rausfinden kann, was das Script auf meinem System anstellt und wo die verschwundenen Dateien gelandet sind? Das Erstellen der Logdatei ist zwingend notwenig, da es sich um über 300 Ordner alleine auf dieser Festplatte handelt.

Ich habe noch eine weiterer Frage. In Zeile 14 steht:
Zitat von @Friemler:
for /f "delims=" %%f in ('dir /b /a:-d "%SrcFolder%" 2^>NUL ^| findstr /ibr /c:"%%~nxd.*"') do (
Warum steht dort "c:"%%~nxd.*"? Es geht mir dabei im Besonderen um das "c:". Diese Passage verstehe ich nicht. Warum c:? Und wiedersprechen sich ~nd und ~xd nicht?

"Tutorial zur FOR-SchleifeTitel" (von Friemler)
Erweiterung von Laufvariablen
%~nI Erzeugt nur den Dateinamen von %I.
%~xI Erzeugt nur die Dateierweiterung von %I.

Oder verstehe ich hier etwas falsch?

Vielen Dank für Deine Geduld und Mühe!

Gruß,
Sully16
Friemler
Friemler 01.05.2016 aktualisiert um 23:51:54 Uhr
Goto Top
Hallo Sully16,


zuerstmal ganz grundsätzlich zum Debuggen von Bachscripts:

  1. Script aus einer Konsole starten, nicht per Doppelklick. Dann bleibt das Konsolenfenster offen und man sieht die Ausgaben des Scripts.
  2. Den Befehl ECHO OFF in Zeile 1 entfernen, damit man den Ablauf des Scripts im Konsolenfenster verfolgen kann.


Speziell zu Deinem Fall:

  1. Wenn Du Befehlsausgaben in eine Datei umleiten möchtest (z.B. in Zeile 35 und 40 bei den MOVE-Befehlen), musst Du natürlich evtl. in der entsprechenden Zeile enthaltene Ausgabeumleitungen zum NUL Device (> NUL) entfernen, sonst werden die Ausgaben verschluckt.
  2. Zum Durchführen von Debug-Sessions solltest Du die Eingabedaten (d.h. die Anzahl der Dateien) auf ein Minimum beschränken. Kopiere z.B. nur eine Auswahl von Dateien in Deine Quellverzeichnisse, von denen Du genau weißt, dass sie Probleme machen.


Zu Deinen Fragen:

  1. Der Parameter /c verhindert, dass FINDSTR bei Leerzeichen im Suchbegriff (dem Verzeichnisnamen) die Namensteile als separate Suchbegriffe interpretiert. Ohne /c würden die Dateien "474 - Ü l452.txt" und "titel 1_543236.txt" aus Deinen Testdaten im Bearbeiten-Verzeichnis landen.
  2. %%~nxd erzeugt den kompletten Dateinamen, incl. Erweiterung. Denn

Zitat von @Friemler aus dem Tutorial zur FOR-Schleife
Die o.g. Kürzel/Operatoren können auch kombiniert werden.


Verschwinden können Deine Dateien natürlich nicht, Du müllst Dir gerade irgendein Verzeichnis auf Deiner Platte zu. Schau Dir einfach mal die Ausgaben in der Konsole an, wenn das Script ohne ECHO OFF läuft.

Tipp: Wenn Deine Dateinamen einen Punkt als Namensbestandteile enthalten (z.B. Meine.Datei.txt), könnte das Probleme machen, da der FINDSTR-Befehl in Zeile 25 den Punkt zwischen Meine und Datei als Teil seines Regulären Ausdrucks (Suchbegriffs) interpretieren würde - der Punkt steht für ein beliebiges Zeichen. Du könntest in dem Fall versuchen, statt
findstr /ibr /c:"%%~nxd.*"

das zu schreiben:
findstr /ib /c:"%%~nxd"


Grüße
Friemler
Sully16
Sully16 02.05.2016 aktualisiert um 00:37:12 Uhr
Goto Top
Hallo Friemler,

die Batchdatei starte ich immer über "Öffnen" im Kontextmenü. Ist aber wohl vergleichbar mit einem Doppelklick. Danke für den Tipp, die Datei über die Konsole aufzurufen, damit sie sich nicht schließt, dass war mir nicht bekannt.

Ich habe zwischenzeitlich eine Möglichkeit gefunden die Ausgabe vom Script in eine Logdatei umzuleiten.
Eine Batchdatei mit folgendem Inhalt startet jetzt die eigentliche Batchdatei FRIEMLER.BAT.

M:\friemler.bat >> M:\Bearbeiten\friemler.log

Jetzt konnte ich auch endlich rausfinden, was nicht funktioniert und wieso. Außerdem weiß ich
jetzt, wo die vermissten Datei abgeblieben sind und warum. face-wink

Es sind genau die Probleme aufgetreten, die ich bereits in meiner Anfrage befürchtet hatte:

1. Sonderzeichen und Umlaute werden falsch gelesen und geschrieben.
2. Die "Register"-Ordner (A, B, C, ...) sorgen für Chaos.
3. Alle Dateien landen in den "Register"-Ordnern mit ihrem Anfangsbuchstaben anstatt in ihrem eigentlichen Zielordner.


Zu 1.

In der Logdatei steht:
$#­­- Tsd
Bro
C - ”ffentlich#

Der Name vom Ordner lautet aber:
$#; Tsd
Büro
C - Öffentlich#


Zu 2.
Im "Register"-Ordner "C" sind alle meine Testdateien gelandet. Ich hatte nur 5 Testdateien rausgsucht, mit Anfangsbuchstaben C.

Siehe z.B.:
H:\- TEST - 01-A-Dem\Ordner\Zielordner\C\
H:\- TEST - 01-A-Dem\Ordner\Zielordner\C\C - ”ffentlich#_8763_.txt"

Richtig wäre dieser Ordner:
H:\- TEST - 01-A-Dem\Ordner\Zielordner\C - ”ffentlich#\


Hier ein Ausschnitt aus der Logdatei:

C:\Windows\system32>(
rem 
 rem Aus dem Namen des aktuellen Verzeichnisses und dem Namen der aktuellen   
 rem Quelldatei den vollständigen Zielpfad erzeugen und prüfen,   
 rem ob die Datei bereits vorhanden ist   
 rem 
 if not exist "H:\- TEST - 01-A-Dem\Ordner\Zielordner\C\C - ”ffentlich#_8763_.txt" (  
rem 
 rem Wenn nicht, wird sie in das Verzeichnis verschoben   
 rem 
 move "M:\_ Quelle _\C - ”ffentlich#_8763_.txt" "H:\- TEST - 01-A-Dem\Ordner\Zielordner\C"   1>NUL   
)  else (
rem 
 rem Wenn ja, wird sie in das Bearbeiten-Verzeichnis verschoben   
 rem 
 move "M:\_ Quelle _\C - ”ffentlich#_8763_.txt" "M:\Bearbeiten"   1>NUL   
) 
) 

C:\Windows\system32>(
rem 
 rem Alle Dateien im Quellverzeichnis auflisten und ihre Namen durch   
 rem einen Suchfilter laufen lassen, der alle Dateinamen liefert, die   
 rem mit dem Namen des aktuellen Verzeichnisses beginnen   
 rem 
 for /F "delims=" %f in ('dir /b /a:-d "M:\_ Quelle _" 2>NUL | findstr /ibr /c:"C - ”ffentlich#.*"') do (  
rem 
 rem Aus dem Namen des aktuellen Verzeichnisses und dem Namen der aktuellen   
 rem Quelldatei den vollständigen Zielpfad erzeugen und prüfen,   
 rem ob die Datei bereits vorhanden ist   
 rem 
 if not exist "H:\- TEST - 01-A-Dem\Ordner\Zielordner\C - ”ffentlich#\%~nxf" (  
rem 
 rem Wenn nicht, wird sie in das Verzeichnis verschoben   
 rem 
 move "M:\_ Quelle _\%~nxf" "H:\- TEST - 01-A-Dem\Ordner\Zielordner\C - ”ffentlich#"   1>NUL   
)  else (
rem 
 rem Wenn ja, wird sie in das Bearbeiten-Verzeichnis verschoben   
 rem 
 move "M:\_ Quelle _\%~nxf" "M:\Bearbeiten"   1>NUL   
) 
) 
) 

Weißt Du auch eine Lösung für die drei oben genannten Probleme?

Wegen dem Punkt - es ist sehr wahrscheinlich, dass einige der Ordner einen Punkt im Namen haben. Welche Auswirkungen hat es, wenn ich den Punkt bei findstr wegnehme? Du hattest sicherlich einen Grund ihn dort hinzusetzen.

Vielen Dank!

Gruß,
Sully16
Friemler
Friemler 02.05.2016 um 02:54:22 Uhr
Goto Top
Hallo Sully16,

lass Dich nicht von dem verwirren, was in der Log-Datei steht. Die Windows Konsolenbefehle schreiben Ausgaben immer noch in der Zeichen-Codierung, die schon zu DOS-Zeiten benutzt wurde, die sog. Codepage 850 (deutsches Windows).

Wenn Du das Log mit Notepad öffnest, wird der Dateiinhalt so interpretiert, als wäre er mit der Standard-Windows Zeichen-Codierung geschrieben worden, der Codepage 1252 (deutsches Windows). Deshalb siehst Du statt der deutschen Umlauten irgendwelche andere Zeichen. Der Konsolenbefehl
type M:\Bearbeiten\friemler.log
zeigt den korrekten Inhalt der Datei an.

Schau Dir die Ausgabe des Scriptlaufs ohne ECHO OFF in der Konsole an. Das ist zwar viel Zeug, führt Dich aber eher auf die Spur des Fehlers als eine Log-Datei in der falschen Zeichen-Codierung.

Unabhängig davon habe ich jedoch Deine Aufgabenstellung nicht richtig verstanden. Die Verzeichnisebene mit diesen Register-Ordnern habe ich nicht berücksichtigt. Sind die denn wirklich notwendig? Für eine alphabetische Sortierung werden sie nicht benötigt, das macht der Windows Explorer sowieso oder auch ein
dir /o:gne
auf der Konsole.

Wenn diese Register-Verzeichnisebene nicht verzichtbar ist, werfe ich das Handtuch. Die Operationen zum Extrahieren des ersten Zeichens aus dem Dateinamen, um den richtigen Register-Ordner zu identifizieren, sind nicht "sonderzeichenfest".

Gruß
Friemler
Sully16
Sully16 02.05.2016, aktualisiert am 07.05.2016 um 00:19:51 Uhr
Goto Top
Hallo Friemler,

Tut mir leid, habe gerade gesehen, dass die "Register"-Ordner gar nicht in meiner Beispiel-Verzeichnissstruktur aufgeführt sind. Habe ich jetzt nachgeholt. Sie sind übrigens nur für mich erforderlich und für sonst nichts. Wenn ich die manuell zu verschiebenden Dateien bearbeite, sind sie eine große Hilfe, beim Durchscrollen von über 300 Verzeichnissen.

Ich hatte ECHO auf ON gestellt. Konnte mir aber den Scriptverlauf nicht komplett ansehen, da er mir die über 300 Vergleiche nicht anzeigt, sondern nur ein paar der letzten in der Reihe. Werde es nochmal mit Deinem TYPE Befehl versuchen, sobald ich in ca. 2-3 Tagen wieder Zuhause bin.

Deinem letzten Satz entnehme ich, dass ich mein Anliegen nicht gut genug erklärt habe. Die Ordner, die nur 1 Zeichen lang sind, nenne ich "Register"-Ordner. Abgeleitet von den A-Z-Register zum Abheften in normalen Papierordnern. Diese "Register"-Ordner in meiner Struktur sind leer und sollen auch leer bleiben. Es sind keine übergeordneten Ordner! Sie dienen mir lediglich als optische Orientierungshilfe! Damit ich schneller den Anfang vom gesuchten Buchstaben finde. Der 1. Buchstabe muss und soll daher gar nicht extrahiert werden, sondern der Name vom Zielodner muss mit dem Anfang von allen Dateinamen verglichen werden, aber nur über die Länge des Zielordners.

Wäre es vielleicht möglich 2 Txt- oder Loddateien zu erstellen? Eine mit den Ordnernamen, wie in meinem Beispielscript und die andere mit den Dateinamen. Bei der mit den Ordnernamen, werden dann alle Ordnernamen mit nur 1 Zeichen Länge entfernt. Oder es werden alle Ordernamen mit mehr als 2 Zeichen Länge in eine andere Datei geschrieben, die danach ohne die 1 Zeichen langen "Register"-Ordner ist. Jetzt müsste der Anfang der Dateinamen, über die Länge der Ordnernamen aus der 2. Logdatei mit der neu erstellten Datei mit der Ordnerliste, verglichen werden. Alle Übereinstimmung werden dann in ihre jeweiligen Zielordner verschoben.

Ich hoffe, ich habe es einigermaßen verständlich formuliert.
Wie ich oben bereits erwähnte, habe ich erst in 2-3 Tagen wieder Zugriff auf meinen Computer. Ich kann zwar Verständnissfragen beantworten, aber Tests erst dann wieder durchführten. Darauf habe ich keinen Einfluss und wurde heute Morgen von den Geschehnissen überrannt.
Danke!
Gruß,
Sully16
Friemler
Lösung Friemler 02.05.2016, aktualisiert am 09.05.2016 um 11:00:06 Uhr
Goto Top
Hallo Sully16,

ich vermute mal, ich habe das mit Deinen Registerordnern jetzt verstanden. Hier eine aktualisierte Version des Scripts, evtl. funktioniert es dann.

@echo off & setlocal

rem ****** Konfigurationsabschnitt ******
set "SrcFolder=C:\Test\verzeichnis1"  
set "DstFolder=C:\Test\verzeichnis-xyz"  
set "EditFolder=C:\Test\Bearbeiten"  
rem *************************************

rem Alle Verzeichnisse im Zielverzeichnis auflisten,
rem deren Name mindestens 2 Zeichen lang ist
for /f "delims=" %%d in ('dir /b /a:d "%DstFolder%" 2^>NUL ^| findstr /ibr /c:"...*"') do (  
  rem Alle Dateien im Quellverzeichnis auflisten und ihre Namen durch
  rem einen Suchfilter laufen lassen, der alle Dateinamen liefert, die
  rem mit dem Namen des aktuellen Verzeichnisses beginnen
  for /f "delims=" %%f in ('dir /b /a:-d "%SrcFolder%" 2^>NUL ^| findstr /ib /c:"%%d"') do (  
    rem Aus dem Namen des aktuellen Verzeichnisses und dem Namen der aktuellen
    rem Quelldatei den vollständigen Zielpfad erzeugen und prüfen, ob die Datei
    rem bereits vorhanden ist
    if not exist "%DstFolder%\%%d\%%f" (  
      rem Wenn nicht, wird sie in das Verzeichnis verschoben
      move "%SrcFolder%\%%f" "%DstFolder%\%%d" > NUL  
    ) else (
      rem Wenn ja, wird sie in das Bearbeiten-Verzeichnis verschoben
      move "%SrcFolder%\%%f" "%EditFolder%" > NUL  
    )
  )
)

rem Alle übrig gebliebenen Dateien ins Bearbeiten-Verzeichnis verschieben
move "%SrcFolder%\*.*" "%EditFolder%" > NUL  


Wenn Fragen zu Konsolenbefehlen auftauchen, kann man zunächst einmal die Hilfe des entsprechenden Befehls aufrufen, z.B.
findstr /?


Gruß
Friemler


[EDIT]
Bugfix 07.05. 2016: O.g. Änderung führte zu Fehlfunktionen.
[/EDIT]
Sully16
Sully16 07.05.2016 um 09:45:37 Uhr
Goto Top
Hallo Friemler,
meine Abwesenheit hat leider länger gedauert als erwartet, aber endlich habe ich wieder Zugriff auf meinen PC und konnte Dein neues Script ausprobieren. Als ich das Script nur auf dem Papier Schritt für Schritt durchgegangen bin und Deine Erläuterungen dazu gelesen haben, war ich mir sicher, jetzt wird alles funktionieren. Leider führt das Script zwei unerwartete Aktion durch. Ich versuche einmal, dies zu beschreiben.
Die Dateinamen werden scheinbar nacheinander mit den Ordnernamen verglichen. Aber wenn es die richtigen Zielordner findet, werden die Dateien nicht in den Zielordner, sondern ins Rootverzeichnis der Festplatte kopiert. Das ist aber noch nicht alles. Bei allen Dateien, dessen Dateiname am Anfang mit einem Verzeichnis übereinstimmen, wurde der Dateiname auf den Namen des Ordners gekürzt und die Dateiendung entfernt.

Aus den zu verschiebenden Dateien

474 - Ü l452.txt
titel 1_543236.txt
titel#4 rh323.txt

wird, nachdem das Script durchgelaufen ist, dies:

474 - Ü (Dateiname vor Scriptdurchlauf: 474 - Ü l452.txt)
titel 1 (Dateiname vor Scriptdurchlauf: titel 1_543236.txt
titel#4 (Dateiname vor Scriptdurchlaufs: titel#4 rh323.txt)

Irgendeine Idee, woran das merkwürdige Verhalten liegen kann?

Gruß,
Sully16
Friemler
Friemler 07.05.2016 um 14:53:35 Uhr
Goto Top
Hallo Sully16,

sorry, die von Dir genannten Fehler wurden durch die von mir vorgenommenen Änderungen für Version 2 des Scripts verursacht. Man sollte doch immer wieder testen...

Ich habe den Code im obigen Posting korrigiert.

Gruß
Friemler
Sully16
Sully16 09.05.2016 aktualisiert um 02:29:19 Uhr
Goto Top
Hallo Friemler,

das korrigierte Script funktioniert großartig! Toll! face-big-smile Tausend Dank!

Ich bin gerade dabei Dein Script meinem realen System entsprechend anzupassen und auf die anderen Festplatten zu erweitern. Mit Hilfe Deines Scripts und Deiner sehr ausführlichen Erläuterungen dazu, sollte das jetzt kein Problem mehr sein.

Danke!

Gruß,
Sully16
Telepski
Telepski 01.01.2019 um 19:21:59 Uhr
Goto Top
Ist schon eine ganze Weile her, und ich bin gerade über Google über diesen Eintrag gestolpert, da ich vor einem ähnlichen Problem stand.

Da DOS-Skript eine ordentliche Menge Fachwissen und Arbeit erfordert, möchte ich kurz eine Alternative erwähnen:

Der Total Commander (www.ghisler.com) ist eine Windows-Variante des alten Zwei-Fenster Norton Commander. Er beherrscht u.a. auch Massenumbennenung von Dateien unter Einbeziehung regulärer Ausdrücke. Wenig bekannt, aber funktioniert: Diese Umbenennung schließt auch das Verschieben in andere Verzeichnisse mit ein.

Als Beispiel bei mir: Es liegt eine Riesenliste von Dateien mit Namen in folgender Form vor:
'Kategorie - Titel.ext'
Ich möchte pro Kategorie einen Ordner, in diesen soll die Datei nur noch mit dem Namen 'Titel.ext' verschoben werden.
Geht tatsächlich mit dem TC in einem einzigen Umbenenn-Schritt:
Suchen nach (RegEx aktiviert):
(.*) \- (.*)\.ext
Ersetzen durch:
.\\$1\\$2.ext
(Wichtig: Doppelte Backslashes)

Das Ergebnis ist wie gewünscht eine Reihe von Ordnern der \Kategorie\Titel
Mehrere Titel derselben Kategorie landen tatsächlich im selben Ordner.

Wer auf 'Nummer Sicher' gehen möchte, kopiert erst alle ursprünglichen Dateien in einen Testordner. Im TC einfach mit [F5]. Und lässt die Umbenennung dort durchlaufen.

Ich hoffe, der eine oder andere kann mit dieser kurzen Lösung etwas anfangen. Ist kein 'pure DOS', ist klar. Wenn man einmal verstanden hat, wie's geht, funktioniert es dafür ohne großen Gehirnschmalz in zwei Minuten.