Batch Script bricht ab wegen Pipe in for /f

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
761
hallo,

ich habe diesen Part eines Scripts um bei meinen Fotos der Action Cam mit exiftool das korrekte Aufnahmedatum zu setzen wenn es abweicht. Ich erhalte aber immer den Fehler:

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

Selbst die KI kann den Fehler nicht beheben, er bleibt, egal was sie ändert. Weiß jemand was das Problem ist ? Es ist wohl etwas in der for-Schleife.

Code:
for %%F in (DJI_*.jpg CAM_*.jpg) do (
    set "FNAME=%%~nF"
    set "DATECORRECTED=0"

    rem Datum aus Dateiname extrahieren: sucht 14-stellige Zahl (YYYYMMDDHHmmss)
    for /f "tokens=*" %%D in ('powershell -NoProfile -Command ^
        "if ('!FNAME!' -match '(\d{14})') { $m = $Matches[1]; $dt = [datetime]::ParseExact($m, 'yyyyMMddHHmmss', $null); $exif = $dt.ToString('yyyy:MM:dd HH:mm:ss'); $fs = $dt.ToString('yyyyMMddHHmmss'); $iso = $dt.ToString('yyyy-MM-ddTHH:mm:ss'); Write-Output \"$exif|$fs|$iso\" } else { Write-Output 'KEIN_DATUM' }"') do (
        set "PARSED=%%D"
    )

    if not "!PARSED!"=="KEIN_DATUM" (
        rem Teile zerlegen: EXIF-Datum | FileDate | ISO fuer Vergleich
        for /f "tokens=1,2,3 delims=|" %%A in ("!PARSED!") do (
            set "EXIF_DATE=%%A"
            set "FS_DATE=%%B"
            set "ISO_DATE=%%C"
        )

        rem Aktuelles EXIF-Aufnahmedatum lesen und Differenz pruefen
        for /f "tokens=*" %%T in ('powershell -NoProfile -Command ^
            "$raw = (& %EXIFTOOL% -s3 -DateTimeOriginal '%%F' 2^>$null); if ($raw -match '(\d{4}):(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})') { $exif = [datetime]::ParseExact($raw.Trim(), 'yyyy:MM:dd HH:mm:ss', $null); $fn = [datetime]::ParseExact('!ISO_DATE!', 'yyyy-MM-ddTHH:mm:ss', $null); $diff = [Math]::Abs(($exif - $fn).TotalSeconds); Write-Output $diff } else { Write-Output '999999' }"') do (
            set "DIFF_SEC=%%T"
        )

        rem Wenn Abweichung > 60 Sekunden: Datum aus Dateiname setzen
        for /f "tokens=*" %%C in ('powershell -NoProfile -Command "if (!DIFF_SEC! -gt 60) { 'JA' } else { 'NEIN' }"') do (
            set "DO_CORRECT=%%C"
        )

        if "!DO_CORRECT!"=="JA" (
            echo [DATUM KORRIGIERT] %%F: Abweichung !DIFF_SEC! Sek. ^> Setze !EXIF_DATE!
            %EXIFTOOL% -overwrite_original -P ^
                -EXIF:DateTimeOriginal="!EXIF_DATE!" ^
                -EXIF:CreateDate="!EXIF_DATE!" ^
                -EXIF:ModifyDate="!EXIF_DATE!" ^
                -EXIF:OffsetTimeOriginal=!TIMEZONE! ^
                -ImageDescription= ^
                -MakerNotes:all= ^
                "%%F"
            powershell -NoProfile -Command ^
                "$f = '%%F'; $dt = [datetime]::ParseExact('!ISO_DATE!', 'yyyy-MM-ddTHH:mm:ss', $null); (Get-Item $f).CreationTime = $dt; (Get-Item $f).LastWriteTime = $dt"
            set "DATECORRECTED=1"
        )
    )

    if "!DATECORRECTED!"=="0" (
        %EXIFTOOL% -overwrite_original -P ^
            -EXIF:OffsetTimeOriginal=!TIMEZONE! ^
            -ImageDescription= ^
            -MakerNotes:all= ^
            "%%F"
    )
)
 
  • Gefällt mir
Reaktionen: madmax2010 und oiisamiio
Da du partiell ja eh schon auf Powershell zurückgreifst, wieso nicht komplett auf PS umstellen? Sollte mit KI ja auch ziemlich problelos möglich sein.
 
Merlin352 schrieb:
dann bleibt ja nur 1 "|" Zeichen
Genaugenommen bleibt das "|" dann noch drei mal in dem Skript oben übrig. Und es besteht freileich keinerlei Notwendigkeit, das dort als Trennzeichen zu verwenden. Man könnte auch ein Komma nutzen, oder einen Forwardslash oder ein Fragezeichen, oder auch ein Ä.

Wenn die KI das nicht gelöst kriegt, dann ist sie für den Anwendungsfall schlecht.
Gleichzeitig gilt aber auch hier, dass es u.a. wegen solcher Zeichensetzungsthemen eine schlechte Idee ist, .bat-Dateien für sowas zu verwenden.
 
  • Gefällt mir
Reaktionen: schwimmcoder
Man liest Dokumente im Original, also in dem Fall in Englisch. Die Übersetzungen sind automatisiert.
 
Mal den Code in nen Editor mit Highlighting gegeben und reine Vermutung:
Bash:
\"$exif|$fs|$iso\"
ist Schuld, \" klappt nicht als Escape, desegen will bash dann pipen, was nicht klappt aus offensichtlichen Gründen. Jedenfalls ist dort das Highlightling nicht passend zum Rest.
 
Zurück
Oben