在Windows中使用批处理从for循环中的文件读取

时间:2018-03-16 13:44:10

标签: windows batch-file

我正在尝试编写一个批处理程序,它将搜索目录树并查找无法播放的视频文件并将其删除。一切似乎都运行正常,我运行ffmpeg并将其输出发送到txt文件。当我从txt文件中读取时,它第一次工作正常。第一个之后的所有读取都不正确,似乎复制了上一次读取的结果。

@echo off
setlocal enabledelayedexpansion 
set ext=.avi .mkv .mp4
for /R %%i in (*.*) do ( 
    for %%a in (%ext%) do (
        if "%%a" == "%%~xi" (
            echo found video file "%%i", scanning integrity...
            ffmpeg.exe -v error -i "%%i" -f null - >output.txt 2>&1
            set /p error= < output.txt
            if "!error!" == "" (
                echo +video is good
            ) else (
                echo -video is bad... deleting it
                echo "(delete here)"
            )

        )
    )
)
pause

通过所有已经指出的事情,我已经能够大大简化我的代码:

@echo off
setlocal enabledelayedexpansion 
for /R %%i in (*.avi *.mkv *.mp4) do ( 
    echo found video file "%%i", scanning integrity...
    ffmpeg.exe -v error -i "%%i" -f null -
    if "!errorlevel!" == "0" (
        echo +video is good
    ) else (
        echo -video is bad... deleting it
        echo "(delete here)"
    )
)
pause

1 个答案:

答案 0 :(得分:1)

由于重现问题并不容易,我建议

        ffmpeg.exe -v error -i "%%i" -f null - >output.txt 2>&1
        SET "ERROR="
        set /p error= < output.txt

set /p的问题是没有输入会使变量保持不变,它不会设置为 nothing 。< / p>

?你在errorlevel之后检查了ffmpeg的值吗?如果遵循规则,errorlevel成功时应为0,出错时应为非0。