Batch file For循环很慢,有没有办法在批处理文件中加速它?

Batch file For循环很慢,有没有办法在批处理文件中加速它?,batch-file,ffprobe,Batch File,Ffprobe,我用一个批处理文件生成html供个人使用,在我的一个部分中,我得到了文件夹中所有mp4文件的宽度和高度。这个“mp4库”可以将文件调出、重命名、添加或提取等…所以我不想在每次更新时手动输入宽度和高度 下面的代码可以工作,但速度非常慢…有没有办法使用批处理文件使其更快 for /f %%g in ('dir /B /S *.mp4') do ( set "g=%%g" set "g=!g:\=/!" for /f &quo

我用一个批处理文件生成html供个人使用,在我的一个部分中,我得到了文件夹中所有mp4文件的宽度和高度。这个“mp4库”可以将文件调出、重命名、添加或提取等…所以我不想在每次更新时手动输入宽度和高度

下面的代码可以工作,但速度非常慢…有没有办法使用批处理文件使其更快

for /f %%g in ('dir /B /S *.mp4') do (

    set "g=%%g"
    set "g=!g:\=/!"
    
    for /f "tokens=1 delims=x" %%a in ('ffprobe -v error -select_streams v:0 -show_entries stream^=width^,height -of csv^=s^=x:p^=0 %%g') do set sW=%%a
    for /f "tokens=2 delims=x" %%b in ('ffprobe -v error -select_streams v:0 -show_entries stream^=width^,height -of csv^=s^=x:p^=0 %%g') do set sH=%%b
    
    echo %TAB% %TAB% ^<span^>^ ^<a style="text-decoration:none" class="image" href="file:///!g!" target="_blank"^>^ ^<video width="!sW!" height="!sH!" poster="file:///S:/_Stuff/_Data/_o/6.gif" poster="file:///S:/_Stuff/_Data/_o/6.gif" preload="auto" muted autoplay loop^>^ ^<source src="file:///!g!" type="video/mp4"^>^ ^</video^>^ ^</a^>^ ^</span^>^ >> _01.html 2>nul  
)
for/f%%g in('dir/B/S*.mp4')do(
设置“g=%%g”
设置“g=!g:\=/!”
对于/f“tokens=1 delims=x”%%a in('ffprobe-v error-select_streams v:0-show_entries stream^=width^,height-of csv^=s^=x:p^=0%%g')do set sW=%a
对于/f“tokens=2 delims=x”%%b in('ffprobe-v error-select_streams v:0-show_entries stream^=width^,height-of csv^=s^=x:p^=0%%g')do set sH=%b
echo%TAB%%TAB%^^^^^^^^^^^^>\u 01.html 2>nul
)
**更新:我尝试了这个方法,效果很好,用了4秒对11秒,但我刚刚注意到一个新的答案,所以我现在将尝试这个建议

@echo off
setlocal EnableDelayedExpansion

>_output_test.txt (for /f %%g in ('dir /B /S *.mp4') do (

    set "g=%%g"
    set "g=!g:\=/!"
    REM @echo !g!

    for /f "tokens=1,2 delims=x" %%a in ('ffprobe -v error -select_streams v:0 -show_entries stream^=width^,height -of csv^=s^=x:p^=0 %%g') do (
        set sW=%%a 
        set sH=%%b
    )
    REM @echo !sW!
    REM @echo !sH!
    @echo %TAB% %TAB% ^<span^>^ ^<a style="text-decoration:none" class="image" href="file:///!g!" target="_blank"^>^ ^<video width="!sW!" height="!sH!" poster="file:///S:/_DaveStuff/_Data/_o/6.gif" preload="auto" muted autoplay loop^>^ ^<source src="file:///!g!" type="video/mp4"^>^ ^</video^>^ ^</a^>^ ^</span^>^  
    )
)

endlocal
pause
exit
@echo关闭
setlocal EnableDelayedExpansion
>_输出_test.txt(对于/f%%g in('dir/B/S*.mp4')do(
设置“g=%%g”
设置“g=!g:\=/!”
雷姆@echo!g!
对于/f“tokens=1,2 delims=x”%%a in('ffprobe-v error-select_streams v:0-show_entries stream^=width^,height-of csv^=s^=x:p^=0%%g')do(
设置sW=%%a
设置sH=%%b
)
REM@echo!sW!
雷姆@echo!嘘!
@回显%TAB%%TAB%^^^^^^^^^^^^^^
)
)
端部
暂停
出口

您在单独的
for/F
循环中两次执行相同的
ffprobe
命令行,这当然是低效的。此外,您将每一行分别写入输出文件,因此会发生许多单独的文件I/O操作。此外,
for/F
dir/B/S
(应该是
dir/B/S/A:-D-H-S
)在开始迭代之前首先构建完整的项目列表,这里不需要,因为迭代的项目不会被更改;因此,
for/R
循环在这里会更快,因为它会缓存一些项目,然后开始迭代

因此,这里有一个可能的改进:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//只重定向到输出文件一次(`>`覆盖,`>>`追加):
>>“_01.html”2>nul(
rem/*`for/F`+`dir/B/S`在迭代之前首先检索整个项目列表,
rem但是'for/R'开始更早地迭代:*/
对于(*.mp4)中的/R%%F,请执行以下操作(
rem//存储当前迭代的文件路径:
设置“文件=%%F”
rem//从'ffprobe'程序获取值:
对于/F“tokens=1,2 delims=x”%%a in('ffprobe-v error-select_streams v:0-show_entries stream^=width^,height-of csv^=s^=x:p^=0”%%F')设置“sW=%a”并设置“sH=%b”
rem//切换延迟扩展以避免出现“!”问题:
setlocal EnableDelayedExpansion
rem//将文件路径中的``替换为`/`:
设置“文件=!文件:\=/!”
rem//返回HTML字符串(避免不必要的转义):
回显%TAB%%TAB%^^^^^
端部
)
)
端部

如果迭代文件路径均不包含感叹号,则可以删除
for/R
循环中的
setlocal
/
endlocal
对,并在开始时将
DisableDelayedExpansion
更改为
EnableDelayedExpansion
,这可能会略微进一步提高性能,但几乎不明显。

1<代码>用于/R2。将这两个
组合在一起,用于
循环3。在整个
循环中插入括号并重定向它,这只会在一次循环中打开文件请注意,要求提高速度的请求,如果您自己没有尝试这样做,基本上都是离题代码请求。因此,我建议你尝试实施迄今为止给出的建议,我们不是来为你做这一切的。谢谢你的回复。我想我理解“合并”部分,但你是什么意思重定向它?@Compo抱歉,我尝试了许多选项在这里搜索,我将继续自己尝试。我可以发布我已经尝试过的内容?目前,对于外部
for/f
循环的每一次迭代,你都将输出重定向到
\u 01.html
。建议是只重定向一次。当您将输出重定向到文件时,它会打开该文件,写入该文件,然后再次关闭该文件。对每个
.mp4
文件执行此操作比重定向整个
for/f
输出要多得多。如果您现在创建的内容需要进一步帮助,请使用更新的代码更新您的问题。但是请包括代码的哪一部分需要它,你的问题应该只限于一个特定的问题,而不是所有的问题。