Batch file 我需要脚本来处理所有dav文件

Batch file 我需要脚本来处理所有dav文件,batch-file,cmd,ffmpeg,file-conversion,windows-vista,Batch File,Cmd,Ffmpeg,File Conversion,Windows Vista,脚本应在递归模式下运行,查找DAV文件,并使用FFMPEG启动DAV到JPG的转换。该脚本正在工作,识别文件夹中的文件,并在存在DAV文件时启动转换,但忽略了一些DAV文件。 当我将这些DAV文件放回文件夹时,它会正确转换。 有什么不对劲吗? 我认为这可能是进程的速度,因为文件是在文件夹中生成的,所以脚本必须等待文件关闭并完成操作。我尝试使用PING将转换过程延迟15秒,但它仍然跳过一些文件 cd E:\VM01\1002 MD "E:\COLETA SNAPSHOT\SNAPSHOT 1002

脚本应在递归模式下运行,查找DAV文件,并使用FFMPEG启动DAV到JPG的转换。该脚本正在工作,识别文件夹中的文件,并在存在DAV文件时启动转换,但忽略了一些DAV文件。 当我将这些DAV文件放回文件夹时,它会正确转换。 有什么不对劲吗? 我认为这可能是进程的速度,因为文件是在文件夹中生成的,所以脚本必须等待文件关闭并完成操作。我尝试使用PING将转换过程延迟15秒,但它仍然跳过一些文件

cd E:\VM01\1002
MD "E:\COLETA SNAPSHOT\SNAPSHOT 1002"
MD  "E:\COLETA SNAPSHOT\PROCESSED 1002" 

:LOOP01  
PING 1.1.1.1 -n 10 -w 6000 >NUL     
For /R %%G in (*.Dav) do IF NOT EXIST "%%G" GOTO SKIP01

:LOOP02
PING 1.1.1.1 -n 10 -w 6000 >NUL    
For /R %%G in (*.Dav) do IF EXIST "%%G" GOTO SKIP02
REM ALL THIS WILL BE DONE IF THE DAV FILE EXISTS
:
:
:SKIP01
REM 6 SECONDS OF DELAY ...
PING 1.1.1.1 -n 10 -w 6000 >NUL
GOTO LOOP01
:
:
:SKIP02
REM START CONVERSION
PING 1.1.1.1  -n 10 -w 15000 >NUL
For /R %%G in (*.Dav) do IF EXIST "%%G" ffmpeg -i "%%G" -r 0.2 -bt 20M -s 480x300 "%%~nG"%%06d.jpg
for /r %%G in (*.Dav) do Move "%%G" "E:\COLETA SNAPSHOT\PROCESSED 1002"
Move "*.jpg" "E:\COLETA SNAPSHOT\SNAPSHOT 1002" 
PING 1.1.1.1  -n 10 -w 3000 >NUL
)
GOTO LOOP01

我已经重写了您的脚本,以我认为您发布的示例应该采用的方式工作,并且取决于您在或更新版本上运行它:

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
设置“DavTree=E:\VM01\1002”
设置“DavDone=E:\COLETA快照\PROCESSED 1002”
设置“JpgDone=E:\COLETA SNAPSHOT\SNAPSHOT 1002”
CD/D“%DavTree%”| |“%_uappdir_uu%timeout.exe”/T 3 1>NUL和GoTo:EOF
如果不存在“%DavDone%\”MD“%DavDone%”| | |“%\uuuu AppDir\uuuuu%timeout.exe”/T 3 1>NUL&GoTo:EOF
如果不存在“%JpgDone%\”MD“%JpgDone%”| |“%\uuuu AppDir\uuu%timeout.exe”/T 3 1>NUL&GoTo:EOF
:ProcessDavs
“%\uuuu AppDir\uuuuu%where.exe”/Q/R.*。达夫
如果错误级别1“%\uuuuu AppDir\uuuu%timeout.exe”/T 6 1>NUL和GoTo ProcessDavs
对于/F“Delims=“%%#In('Dir/B/S/A:-D-S-L/O:D/T:W*.Dav'),请执行以下操作:(
“%\uuuu AppDir\uuuuu%timeout.exe”/T 3 1>NUL
“F:\ull\PathTo\FFmpeg.exe“-i”%%#“-r 0.2-bt 20M-s 480x300”%%~n#%%06d.jpg”
如果不是错误级别1(移动/Y“%%#”“%DavDone%”1>NUL
移动/Y“%%~n#%%06d.jpg”“%JpgDone%”1>NUL))
转到进程DAVS

请注意,在第15行中,我使用了“F:\ull\PathTo\FFmpeg.exe”,请将其调整到正确的位置。如果位于
%PATH%
E:\VM01\1002
,您可以将其编辑为
FFmpeg.exe
,如果
%PATHEXT%
变量未被修改,您还可以删除
.exe
,我也不推荐这样做。我在评论中强调的问题并不构成此答案的一部分,但是,我已将命令安排为递归目录,以便它首先拾取最近写入的
.dav
文件。这可能会为仍在写入的任何文件在处理之前提供额外的完成时间。如果问题仍然存在,您还可以根据需要调整
6
second
timeout
在线
12
3
second
timeout
在线
14

标有
:SKIP02
的部分有不平衡的括号。我已经格式化了你的代码,以便更好地突出显示它!我假设
.Dav
文件是从一个或多个其他进程生成的。我看到的主要问题是,在执行检查时可能存在
.Dav
文件,但此时它可能不是完整格式/完整的文件。如果是这种情况,您的
FFmpeg
命令将无法正确转换不完整的文件。当文件未完成时,FFmpeg不会开始转换。所以我相信这不是问题所在。虽然文件不完整,但我看到ffmpeg没有转换,因为它看起来“权限被拒绝”,并且在100%完成时被释放。如果相同的文件(相同的名称)已尝试从文件名中删除特殊字符,但仍然无效,则“总是拒绝”。我插入了这个Ping,考虑延迟处理,因为在文件完成后关闭文件可能需要太长时间。但事实并非如此。为什么你在发布最初的问题后等了两天,在我的答案发布后又等了整整一天,现在才解释你的问题在于文件名?无论如何,这与我上面的帖子无关,我没有使用
ping
,而且我使用了我很乐意调试的代码,如果有问题的话。请你按照我在上面发布的内容来运行脚本,并以我脚注的第一句为准。如果它工作,但留下了相同的文件,请张贴这些文件名完整的所有实际字符,没有任何删除或修改。没有您的信息,我们无法调试。抱歉,花了这么长时间,我缺席了。我测试了这段代码,但仍然不起作用。我不得不更改一些目录。显示名称错误的文件或目录错误。我将在评论中发布我需要做的更改。