代码之家  ›  专栏  ›  技术社区  ›  tenpn

将目录的父目录与where管道中的另一个目录进行比较

  •  1
  • tenpn  · 技术社区  · 15 年前

    假设我有这样的目录结构:

    parentDir\dirA\foo\
    parentDir\dirB\foo\
    parentDir\dirC\
    parentDir\dirD\bar\foo\
    parentDir\dirE\foo\
    parentDir\dirF\
    

    我只想选择a)是parentdir的直接子目录,b)将foo目录作为直接子目录。

    所以A、B和E是合格的,而C、D和F是不合格的。

    我首先尝试了此PowerShell脚本:

    $rootDir = gi(".")
    dir -include "*foo*" -recurse | ? {$_.PSIsContainer -eq $true} | % {$_.Parent} 
        | ? { $_.Parent -eq $rootDir } 
    

    它查找根目录下的所有foo项,过滤掉非目录,向上搜索中间目录,然后过滤掉任何不是根目录子目录的目录。

    这将返回一个空列表。

    但是,如果我将最后一个where子句更改如下:

    ? { $_.Parent.FullName -eq $rootDir.Fullname }
    

    它工作,我得到了正确的目录输出。

    所以我的问题是,为什么不能直接比较目录对象呢?这看起来可能有点小,但这意味着我对PowerShell对象的理解存在一些漏洞。

    (另外,请随意批评脚本中我的PowerShell编码风格,或指出更快/更正确的方法)

    2 回复  |  直到 15 年前
        1
  •  3
  •   Keith Hill    15 年前

    在比较.NET对象时,有许多因素在起作用。首先,比较可以是一个简单的引用相等比较,即该变量引用的对象是否与其他变量引用的对象完全相同。在许多情况下(大多数引用类型),这是相等的默认行为。但是,还有其他类型(值类型)根据对象中字段的值执行相等操作,例如日期时间、TimeSpan、Int32、Double等。然后,有一些对象通过重写operator==or和/或overriding equals()虚拟方法来重写默认行为。字符串是一种引用类型,它重写这些类型以提供“基于值”的相等性。

    看看这是否起作用:

    $rootDir = gi .
    gci . -r *Foo* | ?{$_.PSIsContainer -and $_.Name -eq 'Tools' -and `
                       $_.Parent.Name -eq $rootDir.Name}
    
        2
  •  2
  •   x0n    15 年前

    DirectoryInfo类的两个不同实例被认为是不相等的,即使它们指向相同的路径。另一方面,如果两个字符串包含相同的字母,并且顺序相同,则始终认为它们是相等的。

    -奥辛

    推荐文章