“if not exist” 与“goto” 不起作用(只是跳过)并且“else”变体也不起作用(Windows 批处理文件)

“if not exist” 与“goto” 不起作用(只是跳过)并且“else”变体也不起作用(Windows 批处理文件)

我正在尝试在批处理文件中创建命令,如果存在某个 nVidia 文件,它将使用显卡对视频进行编码 - 但如果该 nVidia 文件不存在,它将跳转到另一个标签以使用另一个命令。

:SOFTWARE_ENCODE如果 nvcuda.dll 在该位置不存在,则不会跳到标签:

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

如果 nvcuda.dll 确实存在,则上述操作有效并且跳转到标签:NVIDIA_ENCODE

我在 Google 上搜索并看到有人使用else括号解决了这个问题但这也不起作用:

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

发生了相同的结果,如果 nvcuda.dll 不存在,它似乎只是跳过批处理文件的其余部分。

我知道 nVidia 编码和软件编码都可以对视频进行编码,因为我已经注释掉了if existif not exist部分,并单独测试了每个(ffmpeg)编码命令。

(测试软件编码时,我将 nvcuda.dll 重命名为“.bak”)。

我记得过去发生过这种情况,并且不知道为什么它会忽略goto与一起使用的情况if not exist

任何解决方案都将不胜感激。

编辑:这是整个批处理文件...

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

如果我单独运行这个程序并且文件夹中有一个 MP4,那么它确实可以工作:

:: ------------------------------------------------------------------------------
:: 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

我曾尝试使用pause,但无济于事。

相关内容