Batch file 比较Win 7中的目录时出现意外错误

Batch file 比较Win 7中的目录时出现意外错误,batch-file,Batch File,我需要比较两个包含大量文件的目录是否相等(例如,compd1\*.*d2\*.)。单独比较文件的for循环太慢。我只关心所有的文件是否存在并且是平等的;换句话说,我只关心comp.exe返回代码 但是,如果存在以句点开头的文件,则会出现意外错误。例如,如果我执行以下操作: md d1 echo x >d1\.file md d2 echo x >d2\.file comp d1\*.* d2\*.* 它产生: d1\.file d2\*.* Could not expan

我需要比较两个包含大量文件的目录是否相等(例如,
compd1\*.*d2\*.
)。单独比较文件的
for
循环太慢。我只关心所有的文件是否存在并且是平等的;换句话说,我只关心
comp.exe
返回代码

但是,如果存在以句点开头的文件,则会出现意外错误。例如,如果我执行以下操作:

md d1
echo x >d1\.file
md d2
echo x >d2\.file
comp d1\*.* d2\*.*
它产生:

d1\.file      d2\*.*
Could not expand second file name so as to match first

comp
替换为
fc
会产生相同的结果。我不知道为什么会发生这种情况——目录应该完全相等——我想知道是否有解决办法。

打开命令提示符窗口,运行或并阅读输出简短帮助。或者阅读两个引用的Microsoft帮助页面,其中包含来自Microsoft的示例

我们必须澄清一些术语来理解这个问题

Windows上的文件名由两部分组成:

  • 文件名文件名中最后的
  • 文件扩展名是最后一个
    文件名中的所有内容
  • 最后一个
    实际上是文件名文件扩展名之间的分隔符。因此,最后一个
    后面的字符串在文件扩展名中为实字符串。但点/点也必须属于文件名文件扩展名,以建立在文件名两部分的简单连接之上。因此,最后一个点被添加到文件扩展名中

    因此,在Windows上,文件名为的文件名为
    。文件名为空,文件扩展名为,在命令提示窗口中运行时可以看到:

    @for %I in (.file) do @echo File name="%~nI" & echo File extension="%~xI"
    
    输出为:

    File name=""
    File extension=".file"
    
    在Unix/Linux上,没有由两部分组成的文件名的定义,尽管Unix/Linux上的许多文件也有name.ext语法,因为这使人们更容易获得有关文件类型的信息(png、jpg、sh、txt等)

    所有Windows文件系统都支持属性hidden,将文件或目录标记为隐藏。Unix/Linux文件系统没有这样的属性。在Unix/Linux上,当目录或文件的名称以
    开头时,目录或文件被解释为隐藏。因此,像
    .file
    这样的文件在Unix/Linux上被解释为名为
    file
    的隐藏文件
    .htaccess
    是Linux web服务器上非常常见的隐藏文件,其名称为real
    htaccess
    ,而在Unix/Linux上,开始处的点将此文件标记为隐藏文件

    好的。那么,将只包含一个文件的目录
    d1
    d2
    文件名进行比较的问题是什么呢

    这两个文件没有文件名。但是这两个compare命令都需要使用通配符文件名部分来标识两个目录中要比较的两个文件。Windows上的这两个比较命令就是这样设计的,用于比较两个目录中的多个文件

    工作人员包括:

    comp d1\.file d2\.file
    fc d1\.file d2\.file
    
    但是,如果与通配符模式匹配的两个目录中的一个目录中的一个文件的文件名为空,则与通配符的比较不起作用。在这种特殊情况下,
    %SystemRoot%\System32
    中的两个控制台应用程序
    comp.exe
    fc.exe
    无法在另一个目录中找到匹配的文件,该目录也没有文件名,只有匹配的文件扩展名

    使用的命令行
    comp d1\*.*d2\*.
    也可以写为
    comp d1\*d2\*.
    ,因为Windows解释
    *.
    总是像
    *
    一样。在运行
    dir*
    时可以看到这一点,它还可以找到根本不包含
    的文件夹和文件

    在使用
    comp d1\*.*d2\*.
    时,控制台应用程序comp首先搜索目录
    d1
    中的任何文件,在本例中,会找到该文件
    .file
    。它将此文件的名称拆分为文件名文件扩展名文件名是长度为0的空字符串

    COMP用于在其他目录
    d2
    中搜索与第一个目录中找到的文件具有相同文件名的文件,文件扩展名在命令行上指定为第二个参数。在这种情况下,命令行上指定的文件扩展名也是
    *
    ,表示任何文件扩展名

    因此COMP应该不搜索任何内容。*或者更准确地说,在文件夹
    d2
    中搜索
    *
    ,因为文件名为
    .file
    的文件没有文件名

    dir*
    dir*
    相比,
    dir.*
    输出什么

    dir.*
    只输出以点开头的文件和文件夹名称,而
    dir*
    dir*
    则输出当前目录中的所有文件和文件夹

    所以COMP应该在
    d2
    中查找文件
    .file

    但是,如果COMP找到一个文件名为空的文件,它甚至不会在其他目录中运行此搜索,而是输出错误消息

    有趣的是,在这个特殊的用例中不起作用:

    comp d1\*      d2\*
    comp d1\*.*    d2\*.*
    comp d1\.file  d2\*
    comp d1\.file  d2\*.*
    comp d1\.file  d2\*.file
    
    comp d1\*      d2\.file
    comp d1\*.*    d2\.file
    comp d1\*.file d2\.file
    
    但是在这个特殊的用例中工作:

    comp d1\*      d2\*
    comp d1\*.*    d2\*.*
    comp d1\.file  d2\*
    comp d1\.file  d2\*.*
    comp d1\.file  d2\*.file
    
    comp d1\*      d2\.file
    comp d1\*.*    d2\.file
    comp d1\*.file d2\.file
    
    这(对我来说)是一个非常明确的指示,说明了编写