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

在windows中使用批处理从for循环中的文件读取,windows,batch-file,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 (

我正在尝试编写一个批处理程序,它将通过目录树进行搜索,找到无法播放的视频文件并将其删除。一切似乎都很好,我运行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

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

        ffmpeg.exe -v error -i "%%i" -f null - >output.txt 2>&1
        SET "ERROR="
        set /p error= < output.txt
ffmpeg.exe-v error-i“%%i”-f null->output.txt 2>&1
设置“错误=”
设置/p错误=
set/p
的问题在于,没有任何输入使变量保持不变,也没有将其设置为无


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

给你一点提示<代码>对于(*.avi*.mkv*.mp4)中的/R%%i(
添加
设置“错误=”
修复了该问题。文件有效时没有输入,这使得有效文件看起来无效。添加
echo%errorlevel%
时,它总是返回0。我一点也不奇怪。您需要了解
延迟扩展
-这就是代码中出现
%varname%
!varname!
的原因。之后
setlocal enabledelayedexpansion
%varname%在
代码块
时产生
varname`的值(括号中的行序列-最外层,
表示…%%i..
)已输入。
!varname!
提供当前的值。请改为尝试
echo!errorlevel!
。但不保证。如果改为添加
echo!errorlevel!
,会发生什么?(如在
if!error!==”(
行)…添加
echo!errorlevel!
会像预期的那样在失败时回显1。我一直在使用
%var%
,直到最近,当我发现延迟扩展时,在理解功能后,我将所有变量改为使用
!var!
。我忘记了这一点,并恢复了添加errorle时的旧习惯水平检查。所以…
如果错误级别1(做错误的事情)或其他(做好事)
变得简单。
        ffmpeg.exe -v error -i "%%i" -f null - >output.txt 2>&1
        SET "ERROR="
        set /p error= < output.txt