Zwei Batch-Dateien zusammenführen...

mischaef

Kassettenkind
Teammitglied
Registriert
Aug. 2012
Beiträge
6.146
Nabend zusammen,

ich habe ein kleines Problem: Ich habe hier zwei Batch-Dateien, die zwei verschiedene Aufgaben erledigen:

Die erste prüft verschiedene Dateien in einem Ordner auf Sonderzeichen und entfernt diese. Die zweite Batch fügt verschiedene Mediendateien zusammen. Ich möchte jetzt beide Programme in einer Batch vereinen - so dass zuerst die Ordner (samt Unterordner) auf Sonderzeichen geprüft und danach die Dateien zusammengefügt werden. Das funzt aber nicht ganz, es wird immer nur der erste Teil abgearbeitet, aber es wird nicht in den zweiten gegangen.

Ich denke mir aber, dass das so schwierig gar nicht sein kann.

Das sind die Einzelteile:
Code:
for /f "delims=" %%a in ('dir /a:-d /o:n /b /s') do call :next "%%a"
GOTO:EOF
:next
set "newname=%~nx1"

set "newname=%newname:!=%"
set "newname=%newname:'=%"

ren %1 "%newname%

Beim Zusammenfügen wird in dem jeweiligen Ordner erst die Dateien ermittelt, die Namen in eine Textdatei geschrieben, von dem Tool (ffmpeg) anhand dieser zusammengefügt und die Textdatei danach gelöscht.

Code:
chcp 65001
Setlocal EnableDelayedExpansion


@echo off
REM dir /a:d /b > "dir-list.txt"

for /F "delims=" %%i IN ('dir /a:d /b') DO (

  set ordner=%%i

    (for %%a in ("!ordner!/*.mp4") do @echo file '%%a') > "!ordner!/!ordner!.txt"

    "C:\Program Files\ffmpeg\ffmpeg.exe" -safe 0 -f concat -i "!ordner!/!ordner!.txt" "!ordner!/!ordner!.mp4"

    del "!ordner!\!ordner!.txt"

    del "!ordner!\*.mp4"

)

pause

Meine Idee war dann


Code:
chcp 65001

Setlocal EnableDelayedExpansion

@echo off

for /f "delims=" %%a in ('dir /a:-d /o:n /b /s') do call :next "%%a"

GOTO:merge

:next

    set "newname=%~nx1"

    set "newname=%newname:!=%"

    set "newname=%newname:'=%"

    ren %1 "%newname%

:merge

for /F "delims=" %%i IN ('dir /a:d /b') DO (

  set ordner=%%i

    (for %%a in ("!ordner!/*.mp4") do @echo file '%%a') > "!ordner!/!ordner!.txt"

    "C:\Program Files\ffmpeg\ffmpeg.exe" -safe 0 -f concat -i "!ordner!/!ordner!.txt" "!ordner!/!ordner!.mp4"

    del "!ordner!\!ordner!.txt"

    del "!ordner!\*.mp4"

)

pause

Das funktioniert leider nicht. Hätte jemand eine Idee, was ich ändern müsste?

Besten dank!

Michael
 
mischaef schrieb:
Hätte jemand eine Idee, was ich ändern müsste?
Vermute mal ja :). Du machst einen 'call' ohne diesen sauber zu terminieren, daher das :next mit einem
goto:eof oder exit /b abschließen.

Dann sollte das gehen. Das erzwingt den Sprung zurück für die nächste Iteration des Loops.

Ist auch im ersten Snippet schon unsauber.

ALSO:
Code:
:next

    set "newname=%~nx1"

    set "newname=%newname:!=%"

    set "newname=%newname:'=%"

    ren %1 "%newname%
    
    goto:eof

:merge
 
  • Gefällt mir
Reaktionen: mischaef, LukS, madmax2010 und eine weitere Person
Einfach eine neue BATCHALL.BAT erstellen, die nacheinander Batch1 und Batch2 aufruft.

BATCH1.BAT
BATCH2.BAT
 
  • Gefällt mir
Reaktionen: madmax2010
r0b0t schrieb:
Einfach eine neue BATCHALL.BAT erstellen
Gar nicht nötig, da fehlt nur der Rücksprung-Befehl für den 'call'. Das komplette :next könnte auch ganz an's Ende, ist völlig egal.
 
  • Gefällt mir
Reaktionen: mischaef
also vor dem Label ":merge" ein GOTO:EOF evtl mit Kommentar
rem Schleifenrücksprung
oder sowas...
 
  • Gefällt mir
Reaktionen: mischaef
So....

zumindest werden beide Teile hintereinander jetzt abgearbeitet. Das
Code:
@echo of
musste ich rausnehmen, da die Batch dann nicht mehr weiterlief.

Das Problem ist jetzt nur, dass keine Sonderzeichen mehr entfernt werden. Kann das was mit
Code:
chcp 65001
und
Code:
Setlocal EnableDelayedExpansio
zu tun haben? Die sind in der einzelnen Sonderzeichen-Batch nicht drinn...nur ohne die funzt das Mergen nicht.

Code:
chcp 65001
Setlocal EnableDelayedExpansion


rem @echo off

for /f "delims=" %%a in ('dir /a:-d /o:n /b /s') do call :next "%%a"
GOTO:merge
:next
    set "newname=%~nx1"

    set "newname=%newname:!=%"
    set "newname=%newname:'=%"

    ren %1 "%newname%

    goto:eof
 
:merge

for /F "delims=" %%i IN ('dir /a:d /b') DO (

  set ordner=%%i

    (for %%a in ("!ordner!/*.mp4") do @echo file '%%a') > "!ordner!/!ordner!.txt"

    "C:\Program Files\ffmpeg\ffmpeg.exe" -safe 0 -f concat -i "!ordner!/!ordner!.txt" "!ordner!/!ordner!.mp4"

    del "!ordner!\!ordner!.txt"

    rem del "!ordner!\*.mp4"

)

pause
 
Mit Powershell kenne ich mich gar nichts aus und könnte das dann auch nur schwer anpassen, wenn es sein müsste...

@mae1cum77
Stimmt, dann läuft es durch - aber es werden dennoch keine Sonderzeichen entfernt. Wenn ich das Scrippt aber solo laufen lasse, funzt es wie es soll - aber dann sind die genannten Anweisungen nicht drinn.

Würde denn die Möglichkeit bestehen, diese beiden in der unteren Klamme zu aktivieren und dann wieder abzuschalten? Oder geht das nur generell für eine gesamte Batch?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: s1ave77
Das betrifft den ersten Loop, oder? Dann muß das setlocal direkt vor den 2. Loop, also nach :merge.
 
  • Gefällt mir
Reaktionen: mischaef
Heureka....dann hatte ich im Nachtrag ja doch den richtigen Gedanken und auch etwas beigetragen...^^

Jetzt scheint es zu funzen...

Na dann bedanke ich mich wie immer ganz dolle für die Hilfe!

;-)
 
  • Gefällt mir
Reaktionen: Fabii02
War es das setlocal? :).

EDIT: Du kannst ein gesetztes Setlocal EnableDelayedExpansion jederzeit mit endlocal beenden, usw usf.
 
  • Gefällt mir
Reaktionen: mischaef
Ah, ok...wieder was gelernt...^^

Ja, ich hab die Anweisung jetzt hinter :merge gesetzt und es macht was es soll...^^
 
  • Gefällt mir
Reaktionen: s1ave77
mischaef schrieb:
Ah, ok...wieder was gelernt...^^
Gleich noch ein Tipp zu goto und call. Letzteres immer nur für 'Funktionen' nutzen, die sich wiederholen also mit Rücksprung zum Ursprung, für Sprünge in eine Richtung immer Ersteres. Sonst gibt es schnell unvorhergesehenes Verhalten.
 
  • Gefällt mir
Reaktionen: Raijin, BFF und mischaef
Zurück
Oben