首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dir /b /s在cmd.exe和批处理文件中的不同

Dir /b /s在cmd.exe和批处理文件中的不同
EN

Stack Overflow用户
提问于 2019-04-20 16:32:07
回答 1查看 5.5K关注 0票数 0

我想知道为什么dir /b/s C:\*.*cmd.exe和批处理文件之间会有延迟。

我尝试了But批处理文件,但是显示结果需要大约一个小时,但是dis /b/scmd.exe中显示结果的速度很快。

代码语言:javascript
复制
for /f "tokens=*" %%a in ('dir/b/s c:\*.*') do (
echo "%%a" 
copy "%%a" C:\windows\ )

请帮助我在批处理文件中快速显示结果,如cmd.exe

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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个调整大小的操作。
  • 每次需要调整大小时,都会分配一个新的4KB大缓冲区,并将旧缓冲区中的数据复制到新的更大缓冲区中。对于13 we,我们需要3327调整大小的操作,这意味着aprox。内存复制操作中的21GB (每次调整缓冲区大小时,复制的数据都会增加)。也许这看起来并不多,记忆也很快,但有时(比如)( 这里)事情并不那么简单。

如果将从磁盘检索数据所需的时间添加到处理内存分配/内存副本()所需的时间,则在开始处理数据之前会出现明显的延迟。

如果需要删除延迟,请不要使用for /f。一个更好的选择(同时保持类似的方法)可以是

代码语言:javascript
复制
for /r "c:\" %%a in (*) do (
    echo "%%~fa"
)

也就是说,从指定的启动文件夹中使用for命令的递归版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55775545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档