Dateien sortieren in Ordner BAT

Master-Chief

Cadet 1st Year
Registriert
Aug. 2020
Beiträge
10
Hallo liebe IT Profis,
ich benötige dringend euer Fachwissen.
Wir müssen viele Dateien händisch vom Desktop auf ein externes Laufwerk in die endsprechenden Ordner sortieren.
Es sollte so funktionieren:

-Verbindung per Cisco automatisch herstellen (wenn möglich)

-Externes Laufwerk verbinden

-Daten synconisieren und sortieren mit Desktop- auf Externes Laufwerk in verschiedene Ordner

-Die Dateien werden als z.B :40233_64625_211.xml /40565_64625_212.xml auf Desktop erstellt.

Nun möchte ich das die Dateien automatisch in den richtigen Ordner einsortiert werden.

Also *_211.xml in den vorhandenen Ordner 211 und die *_212.xml in den Ordner 212.

Ist der Ordner nicht vorhanden, sollte er erstellt werden. Wichtig zum sortieren ist nur die Zahl am ende der Datei (211,212 usw).

Ich habe schon eine Bat aus dem Forum angepasst, die auch einigermaßen funktioniert (keine Sortierung, u.sw)

Diese Bat würde ich gerne anpassen ,so das wir alle die bat nutzen können.

Ich würde mich über eure Hilfe und Unterstützung sehr freuen.


Code:
NET USE h:\\de.***group.net\data\D31/persistent :no

CLS

@Echo OFF

COLOR 1F

REM ****************************************************************************

REM ** SCRIPT : FolderSync

REM ** BESCHREIBUNG: F�� die Synchronisation zweier Verzeichnisse durch (Inkrementell, Master/Slave!)

REM ** AUTOR : **

REM ** VERSION : 24.07.2020

REM **

REM ** HINWEISE : - Ben��t ROBOCOPY (ab Windows Vista vorinstalliert)

REM ** - F��mlaute in ECHO: 佄 ����ĽΠֽ٠ܽڍ

RE
CHCP 1252

REM KONFIGURATION ----------------------

REM Quell- und Zielverzeichnis angeben. WICHTIG:

REM Verzeichnisse die Leerzeichen enthalten m��n mit Anf��ngszeichen umschlossen werden

REM Kein abschlieࠥnder Backslash \, auࠥr wenn komplettes Laufwerk syncronisiert werden soll

SET quelle=C:\Users\%username%\Desktop\ADDAS\Testdateien

SET ziel=H:\Test\ADDAS\211

REM ------------------------------------

CHCP 850

CLS



ECHO.

ECHO ++++++++++++++++++++++++++++++

ECHO ++++ Run ADDAS SyncME Now +++

ECHO ++++++++++++++++++++++++++++++

ECHO.



SET timestamp=%date:~-4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2%



ECHO.

ECHO VERZEICHNISSE CHECKEN...

IF NOT EXIST %quelle% GOTO ERRSOURCE

IF NOT EXIST %ziel% GOTO ERRDEST



ECHO.

ECHO SYNCHRONISIERUNG STARTEN...

ECHO.

ROBOCOPY %quelle% %ziel% /COPY:DAT /MIR /R:3 /W:20

IF %ERRORLEVEL% GEQ 8 GOTO ERRCOPY

GOTO END



REM FEHLERBEHANDLUNG

:ERRCOPY

ECHO.

ECHO FEHLER: Mindestens eine Datei konnte nicht kopiert/geloecht werden!

ECHO %timestamp% FEHLER: Mindestens eine Datei konnte nicht kopiert/geloescht werden! >> "%~n0.log"

GOTO ERREND

:ERRSOURCE

ECHO.

ECHO FEHLER: Cisco oder Externes Laufwerk nicht verbunden!

ECHO %timestamp% FEHLER: Cisco oder Externes Laufwerk nicht verbunden! (%quelle%) >> "%~n0.log"

GOTO ERREND

:ERRDEST

ECHO.

ECHO FEHLER: Zielverzeichnis nicht vorhanden!

ECHO %timestamp% FEHLER: Zielverzeichnis nicht vorhanden! (%ziel%) >> "%~n0.log"

GOTO ERREND



REM SHIT HAPPENS

:ERREND

COLOR 4F

ECHO.

ECHO ADDAS SyncME MIT FEHLERN ABGESCHLOSSEN

ECHO.

ECHO Dieses Fenster schliesst sich in 20 Sekunden.

ECHO.

ping -n 20 localhost >nul

EXIT



REM HAPPY END

:END

COLOR 2F

ECHO.

ECHO ADDAS SyncME ERFOLGREICH ABGESCHLOSSEN

ECHO.

ECHO Dieses Fenster schliesst sich in 20 Sekunden.

ECHO.

ping -n 20 localhost >nul

EXIT
 
Zuletzt bearbeitet:
Es gibt hier im Forum die Möglichkeit Code richtig einzufügen: Einfach in der Formatierleiste auf die drei Punkte klicken und im Anschluss auf Code. Ich und die vielen Leute hier im Forum danken.

EDIT: Wunderbar :)
 
Zuletzt bearbeitet:
Eventuell hilft dir das?
https://stackoverflow.com/questions/47674822/extract-substring-from-string-using-batch

Idee:

Offtopic:
Grundsätzlich würde ich aber versuchen, lieber ein PowerShell-Script als eine Batch-Datei dafür zu schreiben. Die Möglichkeiten und die Lesbarkeit der Scripte sind deutlich größer (naja, wenn man es richtig macht).
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: kartoffelpü
Hallo tollertyp,

vielen Dank für die Links,jedoch überforderst du mich sehr. Ich verstehe nicht was ich eintragen muß, um die
*_211.xml/*_210_xml in die vorhandenen Ordner 210,211.u.s.w einzusortieren und zu spiegeln.
 
Hier eine kompakte Variante, die du gerne integrieren kannst. Ich weiß nicht, warum ich mit dem setlocal arbeiten muss, aber damit geht es:

Code:
@echo off

REM ... Hier dein Code ...
SET timestamp=%date:~-4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2%
SET quelle=D:\cmd\xmls
SET ziel=D:\cmd\target
REM ... Hier dein Code ...

REM Hier geht es los....
REM ==================================================
SET LOGFILE=script_%timestamp%.log
echo Started Sync > %LOGFILE%
setlocal EnableDelayedExpansion
set SYNC_ERRORS=0
for /r %quelle% %%a in (*.xml) do (
    Set FILE=%%~nxa
    Set FILEWITHOUTEXT=%%~na

    Set SPLITABLE_NAME=!FILEWITHOUTEXT:_= !
    for %%t in (!SPLITABLE_NAME!) do set LASTTOKEN=%%t

    rem Verzeichnis anlegen, falls es noch nicht exisitert
    if not exist "%ziel%\!LASTTOKEN!\" (
        mkdir "%ziel%\!LASTTOKEN!"
    )

    rem move %%a %ziel%\!LASTTOKEN!\!FILE!
    copy /Y %%a %ziel%\!LASTTOKEN!\!FILE! > nul
    if errorlevel 1 (
        rem Misserfolg loggen
        echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
        echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!"
        set /a SYNC_ERRORS=!SYNC_ERRORS!+1
    ) else (
        rem Erfolg loggen
        echo Copied file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
    )
)
if !SYNC_ERRORS! gtr 0 (
    echo !SYNC_ERRORS! errors occured >> %LOGFILE%
    echo !SYNC_ERRORS! errors occured
    GOTO ERRCOPY
) else (
    echo No error occured >> %LOGFILE%
)

endlocal
REM ==================================================
REM Hier endet es....

REM ... Hier dein Code ...
:ERRCOPY
REM ... Hier dein Code ...

Bin mir nicht sicher, ob du verschieben oder kopieren willst, wenn Verschieben, dann die entsprechende Zeile mit dem move verwenden (also das REM entfernen) und die mit copy löschen.

Das ganze schreibt auch eine Log-Datei, in der alle erfolgreich kopierten und nicht-kopierten Dateien aufgelistet sind.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: mae1cum77
Hallo tollertyp,
erstmal danke für deine Hilfe.Ich habe dein Script getestet leider passiert nichts.
Den Pfad habe ich so angepasst
Code:
SET quelle=D:\Test\Edas\xmls
SET ziel=D:\Test\Edas\211\511
 
Kleiner Tip: statt 'REM' lieber '::' verwenden. REM wird zwar nicht ausgeführt, wird aber trotzdem vom Parser gelesen, dies kann bei vielen Vorkommnissen den Code verlangsamen. Die 2 Doppelpunkte werden als defektes Label interpretiert und übergangen ;).
 
  • Gefällt mir
Reaktionen: areiland
Hallo tollertyp,

es soll eine Kopie erstellt werden.Wenn ich das Script ausführe bleiben die Logs leer,nichts passiert.
Code:
> REM ... Hier dein Code ...
> SET timestamp=%date:~-4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2%
> SET quelle=D:\TEST\EDAS\xmls
> SET ziel=D:\TEST\TEST\target
> REM ... Hier dein Code ...

> REM Hier geht es los....
> REM ==================================================
> SET LOGFILE=script_%timestamp%.log
> echo Started Sync > %LOGFILE%
> setlocal EnableDelayedExpansion
> set SYNC_ERRORS=0
> for /r %quelle% %%a in (*.xml) do (
>    Set FILE=%%~nxa
>    Set FILEWITHOUTEXT=%%~na

>     Set SPLITABLE_NAME=!FILEWITHOUTEXT:_= !
>     for %%t in (!SPLITABLE_NAME!) do set LASTTOKEN=%%t

>     rem Verzeichnis anlegen, falls es noch nicht exisitert
>     if not exist "%ziel%\!LASTTOKEN!\" (
>         mkdir "%ziel%\!LASTTOKEN!"
>     )
>
>     copy /Y %%a %ziel%\!LASTTOKEN!\!FILE! > nul
>     if errorlevel 1 (
>         rem Misserfolg loggen
>         echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
>         echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!"
>         set /a SYNC_ERRORS=!SYNC_ERRORS!+1
>     ) else (
>         rem Erfolg loggen
>         echo Copied file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
>     )
> )
> if !SYNC_ERRORS! gtr 0 (
>     echo !SYNC_ERRORS! errors occured >> %LOGFILE%
>     echo !SYNC_ERRORS! errors occured
>     GOTO ERRCOPY
> ) else (
>     echo No error occured >> %LOGFILE%
> )

> endlocal
> REM ==================================================
> REM Hier endet es....

> REM ... Hier dein Code ...
> :ERRCOPY
> REM ... Hier dein Code ...
 
Das Script sucht nicht rekursiv nach Dateien, vermutlich liegt es daran?
Ergänzung ()

@mae1cum77: Deinen Kommentar zu lesen hat mich vermutlich mehr Zeit gekostet als ich jemals durch REM -> :: einsparwen werde.
 
  • Gefällt mir
Reaktionen: mae1cum77
@tollertyp manchmal lesen ja auch andere mit :). Fällt mir nur immer ein, wenn ich kommentierten Batch-Code sehe (bin selber auch ein Fan guter Kommentierung). REM ist einfach 'veraltet' und kontraproduktiv bei längeren Scripten. Letzendlich muß es jeder selbst entscheiden.

EDIT: Gibt natürlich Ausnahmen, wie z.B. innerhalb von for-loops, wo '::' einen Fehler erzeugt.
 
hallo tollertyp,
eine Log-Datei wird angelegt, diese ist aber ohne Inhalt.
Es wird keine kopie von der 55555_211.xml in dem Ordner 211 erstellt.
Ordner werden auch nicht angelegt.
 
Ohne Inhalt heißt, dass nicht mal "Started Sync" drin steht?

Und mach evtl mal nach der Zeile
Code:
for /r %quelle% %%a in (*.xml) do (
noch ein
Code:
    echo aktuelle Datei: %%a
rein. Dann siehst du, welche Dateien vom Script überhaupt gefunden werden.
 
Hallo Tollertyp,
das Script macht was aber ich sehe nicht was. Es werden zwei Dateien erstellt, eine Rem und eine Set.
In beiden Dateien steht nichts drinn
 
Kannst du mal einen Screenshot posten von dem Inhalt der Batch-Datei? oO
Weil ich habe das Gefühl, dass bei dir jede Zeile mit einem > beginnt.
 
Danke,für deine hilfe. Ich habe die > entfernt. Jetzt wird eine Log erstellt aber sonst passiert nichts.
LOg.PNG


Code:
REM ... Hier dein Code ...
 SET timestamp=%date:~-4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2%
 SET quelle=D:\TEST\EDAS\xmls
 SET ziel=D:\TEST\TEST\target
 REM ... Hier dein Code ...

 REM Hier geht es los....
 REM ==================================================
 SET LOGFILE=script_%timestamp%.log
 echo Started Sync > %LOGFILE%
 setlocal EnableDelayedExpansion
 set SYNC_ERRORS=0
 for /r %quelle% %%a in (*.xml) do (
  echo aktuelle Datei: %%a
    Set FILE=%%~nxa
    Set FILEWITHOUTEXT=%%~na

    Set SPLITABLE_NAME=!FILEWITHOUTEXT:_= !
     for %%t in (!SPLITABLE_NAME!) do set LASTTOKEN=%%t

    rem Verzeichnis anlegen, falls es noch nicht exisitert
     if not exist "%ziel%\!LASTTOKEN!\" (
         mkdir "%ziel%\!LASTTOKEN!"
    )

     copy /Y %%a %ziel%\!LASTTOKEN!\!FILE! > nul
    if errorlevel 1 (
         rem Misserfolg loggen
        echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
        echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!"
         set /a SYNC_ERRORS=!SYNC_ERRORS!+1
     ) else (
        rem Erfolg loggen
        echo Copied file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
     )
 )
 if !SYNC_ERRORS! gtr 0 (
    echo !SYNC_ERRORS! errors occured >> %LOGFILE%
     echo !SYNC_ERRORS! errors occured
     GOTO ERRCOPY
 ) else (
     echo No error occured >> %LOGFILE%
 )

endlocal
 REM ==================================================
 REM Hier endet es....

 REM ... Hier dein Code ...
 :ERRCOPY
 REM ... Hier dein Code ...
 
und woher kommen die Zeichen 730.log in die Logdatei? Mein Code schreibt das nicht...

Offensichtlich findet er bei dir keine Dateien. Warum, kann ich dir nicht sagen. Hast du das gesamte Script gepostet, das du ausgeführt hast?
 
wenn ich das Script von dir ausführe, schreibt er diese Log Datei (Screenshot). Ja das ist das komplette Script wie ich es als bat abgespeichert habe.
 
Sorry, dann kann ich nicht helfen.

Dieses Script bei mir gerade:
Code:
REM ... Hier dein Code ...
SET timestamp=%date:~-4%%date:~3,2%%date:~0,2%-%time:~0,2%%time:~3,2%
SET quelle=D:\Projekte\xmltest\source
SET ziel=D:\Projekte\xmltest\target
REM ... Hier dein Code ...

REM Hier geht es los....
REM ==================================================
SET LOGFILE=script_%timestamp%.log
echo Started Sync > %LOGFILE%
setlocal EnableDelayedExpansion
set SYNC_ERRORS=0
for /r %quelle% %%a in (*.xml) do (
  echo aktuelle Datei: %%a
    Set FILE=%%~nxa
    Set FILEWITHOUTEXT=%%~na

    Set SPLITABLE_NAME=!FILEWITHOUTEXT:_= !
     for %%t in (!SPLITABLE_NAME!) do set LASTTOKEN=%%t

    rem Verzeichnis anlegen, falls es noch nicht exisitert
     if not exist "%ziel%\!LASTTOKEN!\" (
         mkdir "%ziel%\!LASTTOKEN!"
    )

     copy /Y %%a %ziel%\!LASTTOKEN!\!FILE! > nul
    if errorlevel 1 (
         rem Misserfolg loggen
        echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
        echo Error copying file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!"
         set /a SYNC_ERRORS=!SYNC_ERRORS!+1
     ) else (
        rem Erfolg loggen
        echo Copied file "%%a" to "%ziel%\!LASTTOKEN!\!FILE!" >> %LOGFILE%
     )
)
if !SYNC_ERRORS! gtr 0 (
    echo !SYNC_ERRORS! errors occured >> %LOGFILE%
     echo !SYNC_ERRORS! errors occured
     GOTO ERRCOPY
) else (
     echo No error occured >> %LOGFILE%
)

endlocal
REM ==================================================
REM Hier endet es....

REM ... Hier dein Code ...
:ERRCOPY
REM ... Hier dein Code ...
hat das gemacht:
Code:
Started Sync
Copied file "D:\Projekte\xmltest\source\Z_HYBRIS_ORDER-400023.xml" to "D:\Projekte\xmltest\target\ORDER-400023\Z_HYBRIS_ORDER-400023.xml"
Copied file "D:\Projekte\xmltest\source\Z_HYBRIS_ORDER-400036.xml" to "D:\Projekte\xmltest\target\ORDER-400036\Z_HYBRIS_ORDER-400036.xml"
Copied file "D:\Projekte\xmltest\source\Z_HYBRIS_ORDER-400039.xml" to "D:\Projekte\xmltest\target\ORDER-400039\Z_HYBRIS_ORDER-400039.xml"
Copied file "D:\Projekte\xmltest\source\Z_HYBRIS_ORDER-400048.xml" to "D:\Projekte\xmltest\target\ORDER-400048\Z_HYBRIS_ORDER-400048.xml"
Copied file "D:\Projekte\xmltest\source\Z_HYBRIS_ORDER-400099.xml" to "D:\Projekte\xmltest\target\ORDER-400099\Z_HYBRIS_ORDER-400099.xml"
No error occured

Ich möchte helfen, aber das ist nicht helfen, das ist ja schon umsetzen. Ein wenig eigenes Know-How und auch eine Form der Neugierde (selbst mal etwas am Script arbeiten) fehlt mir einfach auf deiner Seite.

Ich würde ja sagen, dass man damit anfangen sollte zu prüfen, warum es bei dir keine Dateien findet. Aber das sollte an deinem PC passieren.
 
Zurück
Oben