„if not exist“ mit „goto“ funktioniert nicht (überspringt einfach) und die Variante „else“ funktioniert auch nicht (Windows-Batchdatei).

„if not exist“ mit „goto“ funktioniert nicht (überspringt einfach) und die Variante „else“ funktioniert auch nicht (Windows-Batchdatei).

Ich versuche, Befehle in einer Batchdatei zu erstellen, die, wenn eine bestimmte nVidia-Datei vorhanden ist, ein Video mithilfe der Grafikkarte codieren. Wenn diese nVidia-Datei jedoch nicht vorhanden ist, wird zu einer anderen Bezeichnung gesprungen, um einen anderen Befehl zu verwenden.

Dies springt nicht zum :SOFTWARE_ENCODELabel, wenn nvcuda.dll am Speicherort nicht vorhanden ist:

if exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :NVIDIA_ENCODE
if not exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :SOFTWARE_ENCODE

Wenn nvcuda.dll vorhanden ist, funktioniert das oben genannte und es wird zum :NVIDIA_ENCODELabel gesprungen.

Ich habe ein bisschen gegoogelt und gesehen, dass jemand das Problem elsemit Klammern gelöst hat, aber das funktioniert auch nicht:

if exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" (goto NVIDIA_ENCODE) else goto SOFTWARE_ENCODE

Das Ergebnis ist dasselbe. Wenn nvcuda.dll nicht vorhanden ist, wird der Rest der Batchdatei scheinbar einfach übersprungen.

if existIch weiß, dass sowohl die nVidia-Kodierung als auch die Software-Kodierung zum Kodieren des Videos funktionieren, weil ich die Teile und auskommentiert und if not existjeden (ffmpeg-)Kodierungsbefehl einzeln getestet habe.

(Ich benenne nvcuda.dll beim Testen der Softwarekodierung in „.bak“ um.)

Ich kann mich erinnern, dass dies in der Vergangenheit passiert ist, und habe keine Ahnung, warum es gotodie Verwendung mit ignoriert if not exist.

Jede Lösung wird sehr geschätzt.

BEARBEITEN: Hier ist die gesamte Batchdatei ...

if not DEFINED IS_MINIMIZED set IS_MINIMIZED=1 && start "" /min "%~dpnx0" %* && exit

:: ------------------------------------------------------------------------------
:: This part swaps the first and last 4 characters around...
:: (This processes all files in sub-folders, but I want to make it only process files next to the batch file)...

setlocal enabledelayedexpansion
echo.
for /f "delims= eol=:" %%f in ('dir /b /a-d G???????*.* ????G???*.*') do (
set filename=%%~nf
set firstfour=!filename:~0,4!
set secondfour=!filename:~4,4!
echo %%f ^> !secondfour!!firstfour!!filename:~8!%%~xf
ren %%f !secondfour!!firstfour!!filename:~8!%%~xf
)

set /a Index=1


:: ------------------------------------------------------------------------------
:: This part renames the files 001, 002, 003 and so on.

for /r %%i in (*.mp4) do ( 
    rem if number is less than 10, append 9 to file name
    if !Index! lss 10 (
        rename "%%i" 00"!Index!.mp4"
    ) else (
        rename "%%i" "0!Index!.mp4"
    )
    
    set /a Index+=1
)


:: ------------------------------------------------------------------------------
:: Delete junk files...
del "*.LRV"
del "*.THM"


:: ------------------------------------------------------------------------------
rem    Create TEMP folder for files to be created in... 
if not exist "TEMP" md "TEMP" 


:: ------------------------------------------------------------------------------
:: Use nVidia to encode if that driver file is installed...
:: Not working, but will work if nvcuda.dll is there...
:: if exist %SYSTEMDRIVE%\Windows\System32\nvcuda.dll (goto NVIDIA_ENCODE) else goto SOFTWARE_ENCODE

:: Original lines also not working...
if exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :NVIDIA_ENCODE
if not exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :SOFTWARE_ENCODE


:: ------------------------------------------------------------------------------
:: Convert to 1080p...

:NVIDIA_ENCODE

rem    Convert video files...
FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO start /wait /min ffmpeg.exe -y -i "%%G" -vcodec hevc_nvenc -vf scale=1920:-2,fps=23.976 -b:v 4000k -acodec aac -b:a 192k -ar 44100 -ac 2 "TEMP\%%~nG.mp4" -hide_banner

goto :JOIN_FILES


:SOFTWARE_ENCODE

rem    Convert video files...
FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO start /wait /min ffmpeg.exe -y -i "%%G" -vcodec libx265 -vf scale=1920:-2,fps=23.976 -b:v 4000k -acodec aac -b:a 192k -ar 44100 -ac 2 "TEMP\%%~nG.mp4" -hide_banner

goto :JOIN_FILES


:: ------------------------------------------------------------------------------
:: Join the files into one video...
:JOIN_FILES
(for %%i in (TEMP\*.mp4) do @echo file '%%i') > mp4_file_list.txt
For %%a IN ("TEMP\*.mp4") DO Set "mp4file=%%~na"
start /wait /min ffmpeg.exe -y -f concat -safe 0 -i mp4_file_list.txt -c copy "%mp4file%_JOINED.mp4" -hide_banner
del mp4_file_list.txt


:: ------------------------------------------------------------------------------
:: Delete the TEMP folder...
rd /s /q "TEMP\"


:: ------------------------------------------------------------------------------
:: Rename the "*_JOINED.mp4" file with todays date and " - GoPro Video" at the end.
:: (The dating method follows the format: YYYY-MM-DD) [May not work on non-UK systems]
For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)
ren "*_JOINED.mp4" "%mydate% - GoPro Video.mp4"

:: Create a folder "Converted Video" and move the newly converted video file to it.
if not exist "Converted Video" md "Converted Video"
MOVE /Y "%mydate% - GoPro Video.mp4" "Converted Video"


:: ------------------------------------------------------------------------------
:: Rename any old files back to mp4 again that got moved/renamed at the start...
for /r %%x in (*.S6C8JHVH2E7L4BX9) do ren "%%x" *.mp4


:: ------------------------------------------------------------------------------
:: Open folder with finished video...
explorer "Converted Video"


:: ------------------------------------------------------------------------------
exit

Wenn ich dies alleine mit einer MP4-Datei im Ordner ausführe, funktioniert es:

:: ------------------------------------------------------------------------------
:: Use nVidia to encode if that driver file is installed...

if exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :NVIDIA_ENCODE
if not exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :SOFTWARE_ENCODE


:: ------------------------------------------------------------------------------
:: Convert to 1080p...

:NVIDIA_ENCODE
rem    Convert video files...
FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO start /wait /min ffmpeg.exe -y -i "%%G" -vcodec hevc_nvenc -vf scale=1920:-2,fps=23.976 -b:v 4000k -acodec aac -b:a 192k -ar 44100 -ac 2 "TEMP\%%~nG.mp4" -hide_banner
goto :JOIN_FILES


:SOFTWARE_ENCODE
rem    Convert video files...
FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO start /wait /min ffmpeg.exe -y -i "%%G" -vcodec libx265 -vf scale=1920:-2,fps=23.976 -b:v 4000k -acodec aac -b:a 192k -ar 44100 -ac 2 "TEMP\%%~nG.mp4" -hide_banner
goto :JOIN_FILES


:: ------------------------------------------------------------------------------
:JOIN_FILES

exit

Ich habe es versucht, pauseaber ohne Erfolg.

verwandte Informationen