I'm trying to create commands in a batch file where, if a certain nVidia file exists, it will encode a video using the graphics card - but if that nVidia file isn't there, it skips to another label to use another command.
This doesn't skip to the :SOFTWARE_ENCODE label if nvcuda.dll does not exist at the location:
if exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :NVIDIA_ENCODE if not exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" goto :SOFTWARE_ENCODE If nvcuda.dll does exist then the above works and it skips to the :NVIDIA_ENCODE label.
I Googled around and saw someone solve it by using else with parentheses but that also doesn't work:
if exist "%SYSTEMDRIVE%\Windows\System32\nvcuda.dll" (goto NVIDIA_ENCODE) else goto SOFTWARE_ENCODE The same result happens, it seems to just skip the rest of the batch file if nvcuda.dll does not exist.
I know both nVidia encode and software encode work to encode the video because I have commented out the if exist and if not exist parts, testing each (ffmpeg) encode command individually.
(I'm renaming nvcuda.dll to ".bak" when testing the software encode).
I remember this happening in the past and have no idea why it ignores goto if used with if not exist.
Any solution is greatly appreciated.
EDIT: Here's the whole batch file...
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 If I run this on its own with an MP4 in the folder then it does work:
:: ------------------------------------------------------------------------------ :: 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 I have tried using pause but to no avail.