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

Batch file cmd.exe和批处理文件中的Dir/b/s不同,batch-file,Batch File,我想知道为什么cmd.exe中的dir/b/s C:\*.和批处理文件之间有延迟 我尝试了blow批处理文件,但显示结果大约需要一个小时,但是dis/b/s中的cmd.exe可以快速显示结果 for /f "tokens=*" %%a in ('dir/b/s c:\*.*') do ( echo "%%a" copy "%%a" C:\windows\ ) 请帮助我在批处理文件fast中显示结果,如cmd.exe首先,dir/b/s c:\*.的语法无效。它之所以能工作,是因为Window

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

我尝试了blow批处理文件,但显示结果大约需要一个小时,但是
dis/b/s
中的
cmd.exe
可以快速显示结果

for /f "tokens=*" %%a in ('dir/b/s c:\*.*') do (
echo "%%a" 
copy "%%a" C:\windows\ )

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

首先,
dir/b/s c:\*.
的语法无效。它之所以能工作,是因为Windows命令处理器会自动更正命令行。正确答案是:

dir /b /s C:\*.*
或100%有效期更短:

dir /b /s C:\*
或100%有效:

dir /b /s C:\
Windows命令行上的常规语法为:

命令/可执行文件空格参数1空格“参数2空格/选项

命令
dir
与其第一个参数
/b
之间没有空格不是100%正确的语法。在没有脚本和编程语言的情况下,依靠解释代码的应用程序自动更正语法来编写代码通常是不好的。我每天访问许多使用旧浏览器的网站时都会看到这种情况,旧浏览器无法正确显示网页,原因是网页的一个文件中的代码不正确,而最新的浏览器可以很好地显示这些文件,因为它们过度自动检测和自动更正了由编写文件的人造成的语法错误这是网页的一部分

批处理文件中DIR命令的执行速度较慢,因为带有选项
/F
FOR和使用
%CompSpec%/C
执行DIR命令行的新命令过程在后台启动了在“…”中的设置。最后输出到handle的所有内容都由FOR捕获,并在启动后cmd.exe自行终止后进行处理

FOR带有选项
/F
忽略处理附加命令进程捕获输出时的所有空行。无法使用选项更改此行为

FOR带有选项
/F
使用普通空格和水平制表符作为字符串分隔符,将每行拆分为子字符串(标记)。可以使用选项
delims=
来控制字符串拆分行为,使用此选项时不指定任何字符将关闭字符串拆分行为

FOR带有选项
/F
默认情况下,仅将第一个空格/制表符分隔的子字符串分配给指定的循环变量。可以使用选项
标记=
控制此行为。使用
“tokens=*”
会删除所有前导空格/制表符,并将捕获的行的其余部分分配给指定的循环变量

FORwith option
/F
默认情况下也会忽略以分号开头的所有行。此行为可通过选项
eol=
(行尾)控制

那么执行此命令行时会发生什么情况:

for /f "tokens=*" %%a in ('dir/b/s c:\*.*') do ( echo "%%a")
for /F "eol=| delims=" %%I in ('dir /B /S C:\ 2^>nul') do echo "%%I"
  • FOR在后台启动一个命令进程,执行命令DIR
  • DIR搜索驱动器C:及其所有非隐藏子目录上的非隐藏文件和目录,并输出它们的名称和完整路径,以处理for捕获的后台命令进程的STDOUT
  • 在后台启动
    cmd.exe
    DIR完成后自动终止
  • FOR处理捕获的行。
    • 没有空行,因为
      dir/B
      不输出空行
    • 没有以空格/制表符开头的行,因为在这种情况下,
      dir/B/S
      会输出文件名和目录名,其完整路径以drive
      C:
      开头。没有完整路径的文件或目录名可以以一个或多个空格开头
    • 没有以
      开头的行也是因为
      dir/B/S
      。文件名或目录名的第一个字符可以是分号,但不能以完整路径输出
  • FOR对分配给循环变量
    a
    的每个字符串运行命令ECHO
  • 最好是命令行:

    for /f "tokens=*" %%a in ('dir/b/s c:\*.*') do ( echo "%%a")
    
    for /F "eol=| delims=" %%I in ('dir /B /S C:\ 2^>nul') do echo "%%I"
    
    此命令行也适用于DIR选项
    /S
    ,不使用该选项会导致仅输出文件/文件夹名,而不输出路径,即使是以分号或空格字符开头的文件/文件夹。行结束选项是用竖线定义的,因为根据Microsoft文档,没有文件/文件夹名称可以包含
    |

    建议在命令提示符窗口中运行命令,并将
    /?
    作为第一个也是唯一的参数,以便在使用该命令之前显示该命令的帮助/文档。在命令提示窗口中使用
    for/?
    dir/?
    进行尝试,并同时运行
    cmd/?
    ,因为此可执行文件处理批处理文件


    有可执行文件
    %SystemRoot%\System32\robocy.exe
    用于复制整个目录树或不推荐使用的旧可执行文件
    %SystemRoot%\System32\xcopy.exe
    。有关这两个外部命令的文档,请参阅和,以获取简短帮助。除了在带有
    /?
    的命令提示窗口中运行它们之外,还有两个因素导致了这种行为

    • for/f
      将始终在开始处理之前检索需要处理的所有数据。Than表示,
      for/f
      将“静坐”(不执行
      do
      子句中的代码),同时
      dir
      工作,等待所有数据
    • for/f
      读取磁盘文件时,它将“简单地”调整一个足够大的缓冲区,将其加载到内存中,加载文件并开始处理它。但当数据源是命令执行时,