Batch Script debugging (if schleife) (brauche dringenst Unterstützung!)

BeniCydia

Newbie
Registriert
Okt. 2018
Beiträge
2
Also:
Ich hab mich in den lezten Tagen viel mit HLS und FFmpeg beschäftigt. Nach unzähligen einzel Versuchen habe ich angefangen einautomatisiertes Batch-Script zu schreiben. Dieses ist leider inzwischen sehr komplex geworden, aber ich habe immer zwischendurch Versuche gemacht und somit weiß ich In welchem bereich der Fehler liegen muss. Hier das Script:

Relevanter Teil:
Sucht mit Strg+F die Stelle entering if 1

denn das ist das letzte was noch ausgegeben wird danach kommt nur noch Syntaxfehler.

Alles ab :converting funktioniert (den Teil hatte ich schon vorher und der funktioniert)

Das start Kommando in der CMD war: start.bat input.mp4 240 http://(hier meine url die ich aber als Fehlerquelle ausgeschlossen habe)

Es muss also an den if Schleifen liegen doch ich erkenne da keinen Fehler und blöderweise habe ich von vorherigen Versionen keine Sicherung angefertigt.

Code:
@echo off
:start
    set width=0
    set height=0
    set nw=0
    set nh=0
    set input="%cd%\%1"
    set oth=%2
    set url=%3
    set quality=%oth%p
    echo[
    echo ====================
    echo == Video Quality: %
    
    

:input
    
    if exist "%input%" (
        echo ===FILE=EXISTS====
        echo ==Input==PATH=====
        echo %input%
        echo ==================
        goto preparation
    ) else (
    echo Input File doesnt exist.
    goto error
    )


:preparation
    echo ====PREPARATION====
    mkdir %quality%
    mkdir tmp
    attrib +h ./tmp
    echo ==Capturing==Origninal==
    echo =======Resolution=======
    ffprobe -v error -select_streams v:0 -show_entries stream=width -of csv=s=x:p=0 %input% >./tmp/width.temp
    ffprobe -v error -select_streams v:0 -show_entries stream=height -of csv=s=x:p=0 %input% >./tmp/height.temp
    echo ===Saving=Resolution====
    SET /p height=<./tmp/height.temp
    SET /p width=<./tmp/width.temp
    echo The origanal width is %width%
    echo The original height is %height%

    ::Calculating Aspectfactor
        call calc.exe %height%/%width% >./tmp/aspect.temp
        SET /p ar=<./tmp/aspect.temp

    ::finding new height
        call calc.exe Round((%oth%/1080)*%height%) >./tmp/nh.temp
        SET /p nh=<./tmp/nh.temp
        call calc.exe %nh%/2 >./tmp/hnh.temp
        SET /p hnh=<./tmp/hnh.temp
        echo The new height is %nh%
    ::finding new width
        call calc.exe Round(%nh%/%ar%) >./tmp/nw.temp
        SET /p nw=<./tmp/nw.temp
        echo The new width is %nw%

    echo The Aspectratiofactor is %ar%
    echo The new Resolution is %nw%x%nh%


:searching
::searching for Final Resolution
    echo ===========================================
    echo           Searching Part
    echo ===========================================
    call calc.exe Round(%nh%/2)*2 >./tmp/tmp.txt
    set /p pnh=<./tmp/tmp.txt

    call calc.exe Round(%nw%/2)*2 >./tmp/tmpw.txt
    set /p pnw=<./tmp/tmpw.txt
    
    echo pnw ist %pnw%     pnh ist %pnh%
    echo nw ist %nw%       nh ist %nh%
    echo entering if 1

    if /i %pnh%==%nh% (
        echo PNH ist Gerade
        goto searching2
    ) else (
        echo PNH Ungerade
        call calc.exe %nh%+1 >./tmp/nh.temp
        ::type nh.temp
        
        
    )
    
:searching2
    echo entering if 2
    if /i %pnw%==%nw% (
        echo Pnw ist Gerade
        goto converting
    ) else (
        echo Ungerade
        call calc.exe %nw%+1 >./tmp/nw.temp
        ::type nh.temp
        
        
    )
echo if clauses passed
set /p nw=<./tmp/nw.temp
set /p nh=<./tmp/nh.temp
echo NH ist %nh%
echo NW ist %nw%
set counter=%counter%+1
goto searching


:converting
echo The origanal width %width% has been changed to %nw%
echo The original height %height% has been changed to %nh%

pause
:bitrate_settings

    if /i %oth% LSS 360 (
        echo 240p
        set bv=450k
        set maxrate=512k
        set bufsize=800k
        set ba=88k
        
    ) else if /i %oth% LSS 480 (
        echo 360p
        set bv=800k
        set maxrate=856k
        set bufsize=1200k
        set ba=96k
    
    ) else if /i %oth% LSS 720 (
        echo 480p
        set bv=1400k
        set maxrate=1498k
        set bufsize=2100k
        set ba=128k
    
    ) else if /i %oth% LSS 1080 (
        echo 720p
        set bv=2800k
        set maxrate=2996k
        set bufsize=4200k
        set ba=192k

    ) else if /i %oth% EQU 1080 (
        echo 1080p
        set bv=5000k
        set maxrate=5350k
        set bufsize=7500k
        set ba=256k
    ) else (
        pause
    )
    
:printout
    echo[
    echo =============================
    echo ==     FFmpeg Settings     ==
    echo ==                         ==
    echo == b:v           %bv%     ==
    echo == maxrate       %maxrate%     ==
    echo == bufsize       %bufsize%     ==
    echo == b:a           %ba%      ==
    echo ==                         ==
    echo == height        %nh%      ==
    echo == width         %nw%        ==
    echo ==                         ==
    echo =============================
timeout /t 2

pause

ffmpeg -i %input% -y -vf scale=w=%nw%:h=%nh% -c:a aac -ar 48000 -c:v h264 -profile:v main -crf 20 -sc_threshold 0 -g 48 -keyint_min 48 -b:v %bv% -maxrate %maxrate% -bufsize %bufsize% -b:a %ba% -hls_time 4 -hls_base_url %url% -hls_playlist_type vod %quality%/%quality%.m3u8

goto end

:error
    echo Some Error occured

:end
    echo Thanks for Choosing
 
Huch...

Der/Die/Das hat immer noch kein "https"? :D

BFF
 
Die Sprungmarken in Zeilen 86/99 sehen fehl am Platze aus.
 
BeniCydia schrieb:
denn das ist das letzte was noch ausgegeben wird danach kommt nur noch Syntaxfehler.
echo entering if 1
::type nh.temp
)
Du hast ein falsches Kommentarzeichen gesetzt.

Lösung kurz:
das "::" mit "REM " ersetzen ^^ (man beachte das Leerzeichen danach)
Also "REM type nh.temp"

Lösung lang:
Du hast innerhalb einer Schleife das "::" als Kommentaranweisung benutzt.
Das verursacht in Schleifen aber immer Fehler, weil es das ":" als Sprungmarke interpretiert wird.
Warum, das weiß nur MS.
Daher immer REM benutzen um Fehlern aus dem Weg zu gehen.

BeniCydia schrieb:
Dieses ist leider inzwischen sehr komplex geworden,
kein Wunder. Du hast manche Sachen extrem umständlich gemacht.
Um z.B. die Auflösung herauszubekommen, hätte ein solcher Einzeiler gereicht, anstatt deiner 10 Zeilen,
die alle Werte auf die HDD schreiben und wieder einlesen... Furchtbar umständlich.

Code:
FOR /F %%A IN ('ffprobe -v error -select_streams v:0 -show_entries stream^=width -of csv^=s^=x:p^=0 %input%') DO (SET "iVideoWidth=%%A")

Desweiteren solltest du mal eine saubere Namenskonvention für die Variablen angewöhnen.
Mit den seltsamen Bezeichnungen wirst du irgendwann nicht mehr durchsehen.
Dein Skript hat grad mal 180 Zeilen.
Manches meiner Skripte hat 10.000! Wenn da die Variablen nicht sitzen, ist man nur am Fehler suchen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: cruse und skorpion68

Ähnliche Themen

T
Antworten
12
Aufrufe
1.390
tabea60
T
Antworten
6
Aufrufe
1.266
Zurück
Oben