"if not exist" with "goto" isn't working (just skips) and "else" variant also not working (Windows batch file)

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.

18

Reset to default

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like