繁体   English   中英

IF Input filename exists in Output folder, skip BUT ALSO SKIP in FOR 语句

[英]IF Input filename exists in Output folder, skip BUT ALSO SKIP in FOR Statement

这是我拥有的长 ffmpeg 脚本的摘录:

  • 在当前目录中创建视频文件的文本文件
  • 使用 FOR 语句搜索文本文件
  • 输出到子目录

我要添加的是,如果文件已经存在,不仅不通过脚本的 rest“处理”go,而且不处理已经存在的文件。 (换句话说:如果文件的副本已存在于 output 目录中,则跳过处理该文件,同时也跳过处理已识别的重复文件本身。)

dir *.mkv *.mp4 /A-D-H /B /S |findstr /R %Exclude-Final% /v /i>%TempFilePath%
Echo:   These are the folders being Excluded:           "!Exclude-AlltheseFolders!"
SET "FINALCOMMAND="
::******** DON'T EDIT-----Keeping Original Audio**************END END*************** 
    SETlocal EnableExtensions DisableDelayedExpansion
        SET "FilesFound=0" & SET "FilesEncoded=0" & SET "output="
        for /F "delims=" %%I in (%TempFilePath%) do (
            ::ECHO ==!TIME!================Next File: %%I ========================
            SET "output=%drive%%%~pI%%~nxI" & SET "filename=%%~nxI" & SET /A FilesFound+=1
                SETlocal EnableExtensions EnableDelayedExpansion
                IF exist "%drive%%%~pIoutput\%%~nxI" (SET "Convert_Audio1=N") ELSE IF !output2! == 1 (SET "Convert_Audio1=N") ELSE SET "Convert_Audio1=Y"

    
rem    ===============================
rem    FFProbe.exe evaluation of %%I files
rem    ===============================
rem    below still under the FOR statement above: for /F "delims=" %%I in (%TempFilePath%) do (
rem    ------------------------------------------------------------

rem     -----------------------------
IF !ConvertCodecs! == 1 (
    SET /A count=5
    IF /I "!output!" == "%%I" (
        SET "output=%~dp0output\!filename!"
rem     ECHO This is OUTPUT-DIR "%~dp0output\"
        MKDIR "%~dp0output\"
    ) ELSE (
        MKDIR "%drive%%%~pI"
    )

ENDLOCAL
......
ENDLOCAL
ENDLOCAL
ENDLOCAL

```

我希望在通过 FFProbe.exe 处理以加快速度之前,在此处进行所有过滤。 我假设在第一个 IF 语句中我可以做一些事情,但是当有多个文件,甚至只有 2 + 1 个子文件夹时,它不能结转正确的变量,即这将跳过文件 1,处理文件 2,然后尝试处理 file3

编辑:这是完整代码。 您需要输入您想要的目标驱动器(即 C: 或 D: 等...)。 它将寻找具有 eac3、flac、dts、pcm、aac 或 ac3 的 mkv 和 mp4 以转换为 aac。 (将视频音频从一种格式批量转换为另一种格式)

@ECHO OFF
SETlocal

SET drive="~dp0"
SET string=%CD%  

SETlocal EnableExtensions EnableDelayedExpansion
SET "drive=G:"
SET ^"Exclude-AlltheseFolders=#snapshot^"
SET "Convert_Audio1=Y"
SET "Convert_TO=aac"
SET "Codec1=eac3"
SET "Codec2=flac"
SET "Codec3=dts" &SET "Codec4=pcm_s24le" &SET "Codec5=aac" &SET "Codec6=ac3"
SET "KeepExtraAudio_NoOrig=Y"
SET "KeepOrigAudio=N"
SET "OverWriteFiles=N"
SET "ExtractTime=Y"
SET "time_to_start_from=00:00:10" &SET "duration_to_capture=00:00:15"
SET "TempFilePath=C:\Windows\Temp\ffmpeg-CountingScript-AllFilesInCurrentDirlist%DT%--%HH%.%MM%.%SS%.txt"

IF !ExtractTime! == Y ( SET "FFmpgextractTime= -ss !time_to_start_from! -t !duration_to_capture!")
ECHO THIS IS JMK1
IF !OverWriteFiles! == Y (SET "OverWrite=-y ") ELSE (SET "OverWrite=-n ")
IF !Convert_Audio1! == Y (
    IF !Convert_TO! == aac ( set "Convert_TO=libfdk_aac" )
    SET "FFmpgConvertStream1=-c:a:0 !Convert_TO! -b:a:0 640k -disposition:a:0 default"
    IF !KeepExtraAudio_NoOrig! == Y (
        SET "FFmpgXtraStream=-c:a copy"
    )
    IF !KeepOrigAudio! == Y (
        SET "KeepOrigAudio_ffMpg=-map 0:a:0? -c:a:0 copy"
        SET "KeepExtraAudio_NoOrig=Y"
    )
) ELSE (
    SET "ConvertCodecs=1" 
    SET "KeepOrigAudio_ffMpg=-c:a:0 copy"
    SET "KeepExtraAudio_NoOrig=Y"
)
SET "delm1=^\^>" /c:"^\^<"
SET ^"Exclude-Final=/c:"\^<!Exclude-AlltheseFolders!\^>"^"
SET ^"Exclude-Final=!Exclude-Final:,=%delm1%!^"

dir *.mkv *.mp4 /A-D-H /B /S |findstr /R %Exclude-Final% /v /i>%TempFilePath%
Echo:   These are the folders being Excluded:           "!Exclude-AlltheseFolders!"
SET "FINALCOMMAND="

SETlocal EnableExtensions DisableDelayedExpansion
SET "ProgramFolder=C:\Program Files\FFmpeg-v2020\bin"
SET "ProbeOptions=-v quiet -select_streams a:0 -show_entries "stream^^=codec_name" -of json"
SET "FilesFound=0" & SET "FilesEncoded=0" & SET "output="
for /F "delims=" %%I in (%TempFilePath%) do (
    SET "output=%drive%%%~pI%%~nxI" & SET folder=%drive%%%~pI & SET "filename=%%~nxI" & SET /A FilesFound+=1
    SETlocal EnableExtensions EnableDelayedExpansion
    IF exist "%drive%%%~pIoutput\%%~nxI" (SET "Convert_Audio1=N") ELSE IF !output2! == 1 (SET "Convert_Audio1=N") ELSE SET "Convert_Audio1=Y"
    IF "!Convert_Audio1!" == "Y" (
        SET "AudioCodec=" & SET "ConvertCodecs="
        for /F "eol={ tokens=1,2 delims=,:[ ]{} " %%B in ('""%ProgramFolder%\ffprobe.exe" %ProbeOptions% "%%I""') do (
            IF "%%~B" == "codec_name" (
                IF not defined AudioCodec (
                    SET "AudioCodec=%%~C"
                )
                IF "%%~C" == "%Codec1%" (SET "ConvertCodecs=1"
            ) else IF "%%~C" == "%Codec2%" (SET "ConvertCodecs=1" & ECHO Codec is: %%~C
            ) else IF "%%~C" == "%Codec3%" (SET "ConvertCodecs=1" & ECHO Codec is: %%~C
            ) else IF "%%~C" == "%Codec4%" (SET "ConvertCodecs=1" & ECHO Codec is: %%~C
            ) else IF "%%~C" == "%Codec5%" (SET "ConvertCodecs=1" & ECHO Codec is: %%~C
            ) else IF "%%~C" == "%Codec6%" (SET "ConvertCodecs=1" & ECHO Codec is: %%~C
            )
        )
    )
)

IF !ConvertCodecs! == 1 (
    ECHO [91m==!TIME!================[0m!Codec1! [94min[0m- %%I [91m=========[0m
)
IF "%~dp0output\!filename!" == "%%I" (set "ConvertCodecs=0")

IF !ConvertCodecs! == 1 (
    SET /A count=5
    IF /I "!output!" == "%%I" (
        SET "output=%~dp0output\!filename!"
        SET /A count+=1
        MKDIR "%~dp0output\"
    ) ELSE (
        MKDIR "%drive%%%~pI"
    )
        SET "FINALCOMMAND=ffmpeg !OverWrite!-hide_banner%FFmpgextractTime% -loglevel quiet -hwaccel auto -stats -i "%%I" -map 0:v -map_metadata 0 -movflags use_metadata_tags -map 0:a? -map 0:s:0? -c:s:0 copy -c:v copy %FFmpgXtraStream% %FFmpgConvertStream1% %KeepOrigAudio_ffMpg% "!output!" "
        ECHO this is the command1: !FINALCOMMAND!
        !FINALCOMMAND!
        ECHO [91m=====[0mCOMPLETE[91m===============[0m .
        IF not %FilesEncoded% == 0 ECHO     This one was a failure. Count Encoded so far: "%FilesEncoded%"
        IF not errorlevel 1 SET /A FilesEncoded+=1
        powershell "$target = gi '!output!'; $source = gi '%%I'; 'CreationTime', 'LastWriteTime', 'LastAccessTime' | foreach { $target.$_ = $source.$_ }"    
        for /F "delims=" %%p in ("!ConvertCodecs!") do (
            ECHO THIS IS P: %%p
            ENDLOCAL
            SET /A FilesEncoded=%%p+FilesEncoded
        )

    ) ELSE ( ECHO ##NOT PROCESSING##: !TIME! - %%I  ## & ECHO [91m=====--[0mFILE ALREADY EXISTS! [91m======================[0m Next File [91m===========================[0m )
    )
)

IF %FilesFound% == 1 ( SET "PluralS=" ) else SET "PluralS=s"
ECHO [91m***************************************************************************************[0m
ECHO Re-encoded %FilesEncoded% of %FilesFound% video file%PluralS%.
ECHO [91m***************************************************************************************[0m
endlocal
endlocal
endlocal
exit /b

我想我找到了答案(我已经内置了)。

在我设计的设置部分,在完整代码的顶部,在第二个 SetLocal 下, SET ^"Exclude-AlltheseFolders=#snapshot^"变量,我调整为SET ^"Exclude-AlltheseFolders=#snapshot,output^"

这随后用于设置 Exclude-Final 变量:

SET ^"Exclude-Final=/c:"\^<!Exclude-AlltheseFolders!\^>"^"
SET ^"Exclude-Final=!Exclude-Final:,=%delm1%!^"

然后在这里使用:

dir *.mkv *.mp4 /A-D-H /B /S |findstr /R %Exclude-Final% /v /i>%TempFilePath%
Echo:   These are the folders being Excluded:           "!Exclude-AlltheseFolders!"

所以现在作为一个总结,我现在排除了任何文件夹/文件“输出*文件名*”,如果正在处理的文件夹中存在文件,我将其设置为可能的 output,这是代码的下一个,它检查是否文件存在于当前目录中,然后创建输出*文件名*。

IF !ConvertCodecs! == 1 (
    SET /A count=5
    IF /I "!output!" == "%%I" (
        SET "output=%~dp0output\!filename!"
        SET /A count+=1
        MKDIR "%~dp0output\"
        ) ELSE (
        MKDIR "%drive%%%~pI"
        )

带有注释的完整设置代码摘录:

SETlocal EnableExtensions EnableDelayedExpansion
            :: @echo on
            ::#######0-OVERRIDE Root Directory but keep LOGGING the SAME #############
                SET "drive=G:"
            ::#######1-Exclude Specific Sub-Directories? #############
            SET ^"Exclude-AlltheseFolders=#snapshot,output^"
            :: @rem SET ^"Exclude-AlltheseFolders=#snapshot,Archive,Archive02.01,Archive2021.01.22,Video,Video2,aVideo,^!.Blu-Ray^ Final^"
            ::#######2-Convert Audio Track? #############
            SET "Convert_Audio1=Y"
rem Rev V2.6.8.5 ADD Convert 1st group to AC3 (channel5.1 + above?), then convert 2nd group to aac (2-channel for commentary??)
            SET "Convert_TO=aac"
            :: rem ac3 or aac
            ::#######3-Codecs Desired to Convert #############
                SET "Codec1=eac3"
                SET "Codec2=flac"
                SET "Codec3=dts" &SET "Codec4=pcm_s24le" &SET "Codec5=aac" &SET "Codec6=ac3"
::              rem pcm_s24le , null , vorbis
            ::#######4-Keep orig Audio Track? #############
            SET "KeepExtraAudio_NoOrig=Y"
            SET "KeepOrigAudio=N"
            SET "OverWriteFiles=N"
            ::#######4-Keep orig Audio Track? #############
            :: MODIFY
            ::  Extract Time AND what to Extract (as a sample test)
            SET "ExtractTime=Y"
                    SET "time_to_start_from=00:00:10" &SET "duration_to_capture=00:00:15"
            rem SET "time_to_start_from=00:00:10" &SET "duration_to_capture=03:00:00"
            ::
            ::
            ::
::#######END OF SETTINGS###############################################
::*********************************************************************
SET "TempFilePath=C:\Windows\Temp\ffmpeg-CountingScript-AllFilesInCurrentDirlist%DT%--%HH%.%MM%.%SS%.txt"
::#######END OF SETTINGS################################################################################################################################################################################################################
::**************************************************************************************************************************************************************************************************************************************
::#######END OF SETTINGS################################################################################################################################################################################################################
::******** DON'T EDIT-----Keeping Original Audio ***************************************************************************************************************************************************************************************

IF !ExtractTime! == Y ( SET "FFmpgextractTime= -ss !time_to_start_from! -t !duration_to_capture!")
ECHO THIS IS JMK1
IF !OverWriteFiles! == Y (SET "OverWrite=-y ") ELSE (SET "OverWrite=-n ")
IF !Convert_Audio1! == Y (
    IF !Convert_TO! == aac ( set "Convert_TO=libfdk_aac" )
    SET "FFmpgConvertStream1=-c:a:0 !Convert_TO! -b:a:0 640k -disposition:a:0 default"
    IF !KeepExtraAudio_NoOrig! == Y (
        SET "FFmpgXtraStream=-c:a copy"
        )
    IF !KeepOrigAudio! == Y (
        SET "KeepOrigAudio_ffMpg=-map 0:a:0? -c:a:0 copy"
        SET "KeepExtraAudio_NoOrig=Y"
        )
    ) ELSE (
    SET "ConvertCodecs=1" 
        SET "KeepOrigAudio_ffMpg=-c:a:0 copy"
        SET "KeepExtraAudio_NoOrig=Y"
    )
SET "delm1=^\^>" /c:"^\^<"
SET ^"Exclude-Final=/c:"\^<!Exclude-AlltheseFolders!\^>"^"
SET ^"Exclude-Final=!Exclude-Final:,=%delm1%!^"
:: ECHO This is the date and time:  %DT%--%HH%.%SS%
dir *.mkv *.mp4 /A-D-H /B /S |findstr /R %Exclude-Final% /v /i>%TempFilePath%
Echo:   These are the folders being Excluded:           "!Exclude-AlltheseFolders!"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM