Batch-Script meldet "")" kann syntaktisch an dieser Stelle nicht verarbeitet werden."

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
711
hallo,

ich habe mir ein Batch Script schreiben lassen um u.a. aus Videos das Metadatenfeld "Create Date" auszulesen und dieses dann nach der Komprimierung als Datum für alles zu setzen. (Problem ist dass beim Komprimieren die Felder immer geleert werden und wenn das Änderungsdatum nicht das Aufnahmedatum ist wird es in der Zeitachse der Galerie falsch angezeigt). Änderungsdatum, Aufnahmedatum, etc., auch die richtige Zeitzone muss bei einigen hinterlegt werden. Doch auch ChatGPT kann den Fehler im Script nicht beheben. Ich gebe alle Abfragen ein und nach der Eingabe für CRF kommt einfach:

Code:
")" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Weiß jemand was das Problem ist ?

Bash:
@echo off
setlocal enabledelayedexpansion

:: Benutzerabfrage: Zeitzone
set /p TIMEZONE=Welche Zeitzone soll gesetzt werden? (Standard: +02:00)
if "%TIMEZONE%"=="" set TIMEZONE=+02:00

:: Benutzerabfrage: Start-Sekunden schneiden
set /p CUT_START=Wie viele Sekunden vom ANFANG sollen entfernt werden?
if "%CUT_START%"=="" set CUT_START=0

:: Benutzerabfrage: End-Sekunden schneiden
set /p CUT_END=Wie viele Sekunden vom ENDE sollen entfernt werden?
if "%CUT_END%"=="" set CUT_END=0

:: Benutzerabfrage: CRF-Wert
echo CRF-Wert
set /p CRF_WERT=Welcher CRF-Wert soll verwendet werden?

:: Zahlenprüfung
for /f "delims=0123456789" %%A in ("%CUT_START%") do (
    echo Ungueltige Eingabe bei Startzeit & pause & exit /b
)
for /f "delims=0123456789" %%A in ("%CUT_END%") do (
    echo Ungueltige Eingabe bei Endzeit & pause & exit /b
)
if not "%CRF_WERT%"=="" (
    for /f "delims=0123456789" %%A in ("%CRF_WERT%") do (
        echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
    )
)

:: Schleife über MP4s
for %%F in (*.mp4) do (
    echo ------------------------------------------
    echo Bearbeite: %%F

    :: CreateDate auslesen
    for /f "usebackq tokens=* delims=" %%T in (`exiftool -s3 -QuickTime:CreateDate "%%F"`) do (
        set "METADATE=%%T"
    )

    :: Prüfen ob vorhanden
    if "!METADATE!"=="" (
        echo ? Kein CreateDate gefunden – Datei wird uebersprungen.
        goto :continue
    )

    :: Format konvertieren für PowerShell und späteres Umformatieren
    for /f "usebackq delims=" %%X in (`powershell -NoLogo -NoProfile -Command "[datetime]::ParseExact('!METADATE!', 'yyyy:MM:dd HH:mm:ss', $null).ToString('yyyy-MM-ddTHH:mm:ss')"`) do (
        set "TIMESTAMP=%%X"
    )
    for /f "usebackq delims=" %%X in (`powershell -NoLogo -NoProfile -Command "[datetime]::ParseExact('!TIMESTAMP!', 'yyyy-MM-ddTHH:mm:ss', $null).ToString('yyyy:MM:dd HH:mm:ss')"`) do (
        set "EXIFDATE=%%X"
    )

    :: Dauer ermitteln
    for /f "usebackq delims=" %%D in (`ffprobe -v error -select_streams v:0 -show_entries format^=duration -of default^=nokey^=1:noprint_wrappers^=1 "%%F"`) do (
        set "DURATION=%%D"
    )
    for /f "tokens=1 delims=." %%T in ("!DURATION!") do set /a INTDURATION=%%T

    set /a CUTS_TOTAL=!CUT_START!+!CUT_END!
    set /a VIDEO_PLUS_3=!INTDURATION!+3

    if !VIDEO_PLUS_3! GTR !CUTS_TOTAL! (
        set /a REMAINING=!INTDURATION!-!CUTS_TOTAL!
        if !REMAINING! GEQ 1 (
            if "%CRF_WERT%"=="" (
                set "OUTFILE=%%~nF_cut.mp4"
                ffmpeg -y -i "%%F" -ss !CUT_START! -t !REMAINING! -c copy "!OUTFILE!"
            ) else (
                set "OUTFILE=%%~nF_crf!CRF_WERT!.mp4"
                ffmpeg -y -ss !CUT_START! -i "%%F" -t !REMAINING! -c:v libx265 -crf !CRF_WERT! -preset slow -movflags +faststart "!OUTFILE!"
            )

            :: Exiftool anwenden
            set "EXIFTOOL_PATH=%~dp0exiftool.exe"
            "%EXIFTOOL_PATH%" ^
                -Keys:DateTimeOriginal="!EXIFDATE!" ^
                -QuickTime:CreateDate="!EXIFDATE!" ^
                -QuickTime:ModifyDate="!EXIFDATE!" ^
                -TrackCreateDate="!EXIFDATE!" ^
                -TrackModifyDate="!EXIFDATE!" ^
                -MediaCreateDate="!EXIFDATE!" ^
                -MediaModifyDate="!EXIFDATE!" ^
                -FileCreateDate="!EXIFDATE!" ^
                -FileModifyDate="!EXIFDATE!" ^
                -OffsetTimeOriginal="%TIMEZONE%" ^
                -overwrite_original "!OUTFILE!" >nul

            :: NTFS Zeitstempel anwenden
            powershell -NoLogo -NoProfile -Command ^
                "(Get-Item '!OUTFILE!').CreationTimeUtc = [datetime]::ParseExact('!TIMESTAMP!', 'yyyy-MM-ddTHH:mm:ss', $null);" ^
                "(Get-Item '!OUTFILE!').LastWriteTimeUtc = [datetime]::ParseExact('!TIMESTAMP!', 'yyyy-MM-ddTHH:mm:ss', $null)"

            echo ? Fertig: !OUTFILE! - !REMAINING!s uebrig
        ) else (
            echo ? uebersprungen: %%F - nur !REMAINING!s wuerden uebrig bleiben
        )
    ) else (
        echo ? uebersprungen: %%F - !VIDEO_PLUS_3! nicht > !CUTS_TOTAL!
    )

    :continue
)

echo.
echo Alle passenden Videos wurden verarbeitet.
pause
 
_Shorty schrieb:
Wie führst du die denn aus? Bei

kann das schonmal passieren. Versuch mal
Windows :D

Hast mal klammern gezählt ob die passen?

Ich würde mal die Klammern bei Zeitzone am Anfang entfernen
 
tldr:
gib das problem mal chatgpt. oder einer anderen ki

Ergebnisse:

"
Zusammenfassung: To-do-Liste zur Fehlerbehebung

Nutze call set "VAR=%%X" innerhalb von for-Blöcken, um Probleme mit verzögerter Variablenerweiterung zu vermeiden.

Vermeide goto innerhalb von for-Blöcken – verwende stattdessen Flags.

Achte auf korrektes Escaping von Sonderzeichen in echo, insbesondere Klammern.

Falls du mehrere for-Blöcke verschachtelst, prüfe, ob du nicht mit if !VAR!=="" auf eine noch nicht gesetzte Variable zugreifst.

"

aus meiner Sicht sollte man "goto" immer vermeiden. mein Gefühl sagt mir es ist das Goto - wenn es springt sind die Klammern kaputt.

Co Pilot mit gpt 4.1:
"
...


Problem:
Wenn %CRF_WERT% leer ist, wird die Schleife nicht ausgeführt – das ist korrekt. Aber wenn %CRF_WERT% nur aus Zahlen besteht, gibt es keine Zeichen zum Trennen, und die Schleife wird übersprungen. Ist aber ein ungültiges Zeichen drin, läuft die Schleife und gibt die Fehlermeldung aus.
Das eigentliche Problem ist aber, dass Batch mit Klammern in verschachtelten Blöcken und Variablenersetzung manchmal durcheinanderkommt, vor allem, wenn Variablen leer sind oder Sonderzeichen enthalten.

Lösung:
1. Die Zahlenprüfung kann einfacher und robuster gestaltet werden.
2. Die Prüfung auf leere Eingabe und die Schleife sollten nicht verschachtelt werden.
3. Die Prüfung auf Zahlen kann mit findstr erfolgen.

Hier ein robusterer Ansatz für die CRF-Prüfung:

````batch
:: CRF-Wert abfragen
set /p CRF_WERT=Welcher CRF-Wert soll verwendet werden?

:: Prüfen, ob CRF_WERT leer oder eine Zahl ist
if not "%CRF_WERT%"=="" (
echo %CRF_WERT% | findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 (
echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
)
)
````

Ersetze den bisherigen Block zur CRF-Prüfung durch diesen.
Das sollte den Fehler beheben.

Zusätzlicher Tipp:
Achte darauf, dass du in Batch-Skripten mit setlocal enabledelayedexpansion arbeitest und Variablen innerhalb von Schleifen mit !VAR! statt %VAR% ansprichst, was du aber schon richtig machst.

Wenn du weitere Fehler bekommst, poste bitte die genaue Zeile, in der der Fehler auftritt, und ggf. den Wert, den du eingegeben hast.


"
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Pfandfinder
dermoritz schrieb:
gib das problem mal chatgpt. oder einer anderen ki

Ergebnisse:

"
Zusammenfassung: To-do-Liste zur Fehlerbehebung

Nutze call set "VAR=%%X" innerhalb von for-Blöcken, um Probleme mit verzögerter Variablenerweiterung zu vermeiden.

Vermeide goto innerhalb von for-Blöcken – verwende stattdessen Flags.

Achte auf korrektes Escaping von Sonderzeichen in echo, insbesondere Klammern.

Falls du mehrere for-Blöcke verschachtelst, prüfe, ob du nicht mit if !VAR!=="" auf eine noch nicht gesetzte Variable zugreifst.

"

aus meiner Sicht sollte man "goto" immer vermeiden. mein Gefühl sagt mir es ist das Goto - wenn es springt sind die Klammern kaputt.

Co Pilot mit gpt 4.1:
"
...


Problem:
Wenn %CRF_WERT% leer ist, wird die Schleife nicht ausgeführt – das ist korrekt. Aber wenn %CRF_WERT% nur aus Zahlen besteht, gibt es keine Zeichen zum Trennen, und die Schleife wird übersprungen. Ist aber ein ungültiges Zeichen drin, läuft die Schleife und gibt die Fehlermeldung aus.
Das eigentliche Problem ist aber, dass Batch mit Klammern in verschachtelten Blöcken und Variablenersetzung manchmal durcheinanderkommt, vor allem, wenn Variablen leer sind oder Sonderzeichen enthalten.

Lösung:
1. Die Zahlenprüfung kann einfacher und robuster gestaltet werden.
2. Die Prüfung auf leere Eingabe und die Schleife sollten nicht verschachtelt werden.
3. Die Prüfung auf Zahlen kann mit findstr erfolgen.

Hier ein robusterer Ansatz für die CRF-Prüfung:

````batch
:: CRF-Wert abfragen
set /p CRF_WERT=Welcher CRF-Wert soll verwendet werden?

:: Prüfen, ob CRF_WERT leer oder eine Zahl ist
if not "%CRF_WERT%"=="" (
echo %CRF_WERT% | findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 (
echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
)
)
````

Ersetze den bisherigen Block zur CRF-Prüfung durch diesen.
Das sollte den Fehler beheben.

Zusätzlicher Tipp:
Achte darauf, dass du in Batch-Skripten mit setlocal enabledelayedexpansion arbeitest und Variablen innerhalb von Schleifen mit !VAR! statt %VAR% ansprichst, was du aber schon richtig machst.

Wenn du weitere Fehler bekommst, poste bitte die genaue Zeile, in der der Fehler auftritt, und ggf. den Wert, den du eingegeben hast.


"
Perfekt, hat geklappt!
 
Auch wenn das Problem gelöst ist, und ich dir dahingehend eh nicht wirklich helfen hätte können,
es gibt auch andere Methoden diese Daten auszulesen.

z.B.
Mit Advanced Renamer könnte man das Datum auslesen, in den Namen einpflegen und nach der Komprimierung wieder aus dem Namen extrahieren und neu setzen.

Das geht recht bequem und du kannst auch gleich riesiege Stapel verarbeiten...
 
Pfandfinder schrieb:
:: Zahlenprüfung
for /f "delims=0123456789" %%A in ("%CUT_START%") do (
echo Ungueltige Eingabe bei Startzeit & pause & exit /b
)
for /f "delims=0123456789" %%A in ("%CUT_END%") do (
echo Ungueltige Eingabe bei Endzeit & pause & exit /b
)
if not "%CRF_WERT%"=="" (
for /f "delims=0123456789" %%A in ("%CRF_WERT%") do (
echo Ungueltige Eingabe bei CRF-Wert & pause & exit /b
)
)

Ist ja gelöst, aber

hier ist die untere ) Klammer zu viel, es gibt hier keine ( dazu.
Zumindest nicht das ich eine sehe
 
Zurück
Oben