在windows中使用批处理从for循环中的文件读取
我正在尝试编写一个批处理程序,它将通过目录树进行搜索,找到无法播放的视频文件并将其删除。一切似乎都很好,我运行ffmpeg并将其输出发送到txt文件。当我从txt文件中读取时,它第一次运行良好。第一次读取之后的所有读取都不正确,似乎复制了上一次读取的结果在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 (
@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