我想知道为什么dir /b/s C:\*.*在cmd.exe和批处理文件之间会有延迟。
我尝试了But批处理文件,但是显示结果需要大约一个小时,但是dis /b/s在cmd.exe中显示结果的速度很快。
for /f "tokens=*" %%a in ('dir/b/s c:\*.*') do (
echo "%%a"
copy "%%a" C:\windows\ )请帮助我在批处理文件中快速显示结果,如cmd.exe。
发布于 2019-04-20 19:59:46
有两个因素导致了这种行为。
for /f总是在开始处理之前检索它需要处理的所有数据。这意味着for /f将在dir工作时“坐”(而不是执行do子句中的代码),等待所有数据。for /f读取磁盘文件时,它将“简单地”将一个足够大的缓冲区装载到内存中,加载文件并开始处理它。但是,当数据源是命令执行时,不知道数据的最终大小,则在检索命令的输出时定义缓冲区并根据需要调整缓冲区的大小。需要检索所有数据和调整缓冲区大小的过程才会产生延迟。
为什么?例如:
dir /s /b c:\windows,我会得到一个包含119343个文件的列表,13 If的数据。for /f定义的内存缓冲区从4KB开始,每次填充时以4KB为单位增加,因此将需要3327个调整大小的操作。如果将从磁盘检索数据所需的时间添加到处理内存分配/内存副本()所需的时间,则在开始处理数据之前会出现明显的延迟。
如果需要删除延迟,请不要使用for /f。一个更好的选择(同时保持类似的方法)可以是
for /r "c:\" %%a in (*) do (
echo "%%~fa"
)也就是说,从指定的启动文件夹中使用for命令的递归版本。
https://stackoverflow.com/questions/55775545
复制相似问题