代码之家  ›  专栏  ›  技术社区  ›  Jay Bazuzi Buck Hodges

如何在PowerShell中检查文件是否在给定的目录下?

  •  6
  • Jay Bazuzi Buck Hodges  · 技术社区  · 15 年前

    现在我在做:

    $file.StartsWith(  $directory, [StringComparison]::InvariantCultureIgnoreCase )
    

    但我相信还有更好的方法。

    我可以接受 $file.Directory .Parent s、 但我希望有更简单的东西。

    编辑

    5 回复  |  直到 15 年前
        1
  •  6
  •   Keith Hill    15 年前

    简单点的事情怎么样:

    PS> gci . -r foo.txt
    

    它隐式使用-filter参数(按位置)指定食品.txt作为过滤器。您还可以指定*.txt或foo?。文本。StartsWith的问题是,在处理不区分大小写的比较时,仍然存在一个问题:在PowerShell中,/和\都是有效的路径分隔符。

    假设该文件可能不存在,$file和$directory都是绝对路径,则可以使用“PowerShell”方法执行此操作:

    (Split-Path $file -Parent) -replace '/','\' -eq (Get-Item $directory).FullName
    

    [io.path]::GetDirectoryName($file) -eq [io.path]::GetFullPath($directory)
    

    其中一个问题是GetFullPath还将使相对路径成为基于进程当前dir的绝对路径,而当前dir通常是

        2
  •  1
  •   Community holdenweb    7 年前

    string.StartsWith 做这种类型的测试很好(不过 OrdinalIgnoreCase is a better representation of how the file system compares paths ).

    唯一需要注意的是,路径必须是规范形式的。否则,像 C:\x\..\a\b.txt C:/a/b.txt 会失败“这是在 C:\a\ “测试”目录。你可以用静电 Path.GetFullPath 方法在执行测试之前获取路径的全名:

    function Test-SubPath( [string]$directory, [string]$subpath ) {
      $dPath = [IO.Path]::GetFullPath( $directory )
      $sPath = [IO.Path]::GetFullPath( $subpath )
      return $sPath.StartsWith( $dPath, [StringComparison]::OrdinalIgnoreCase )
    }
    

    \\some\network\path\ 映射到 Z:\path\ ,测试是否 \\some\network\path\b.txt Z:\ 将失败,即使文件可以通过 Z:\path\b.txt ). 如果你需要支持这种行为, these questions

        3
  •  0
  •   guillermooo    15 年前

    像这样?

    Get-ChildItem -Recurse $directory | Where-Object { $_.PSIsContainer -and `
        $_.FullName -match "^$($file.Parent)" } | Select-Object -First 1
    
        4
  •  0
  •   Mattia72    10 年前

    如果将输入字符串转换为DirectoryInfo和FileInfo,则字符串比较不会有任何问题。

    function Test-FileInSubPath([System.IO.DirectoryInfo]$Dir,[System.IO.FileInfo]$File)
    {
        $File.FullName.StartsWith($Dir.FullName)
    }
    
        5
  •  0
  •   Andreas Covidiot    6 年前

    很快的事情:

    14:47:28 PS>pwd
    
    C:\Documents and Settings\me\Desktop
    
    14:47:30 PS>$path = pwd
    
    14:48:03 PS>$path
    
    C:\Documents and Settings\me\Desktop
    
    14:48:16 PS>$files = Get-ChildItem $path -recurse | 
                         Where {$_.Name -match "thisfiledoesnt.exist"}
    
    14:50:55 PS>if ($files) {write-host "the file exists in this path somewhere"
                } else {write-host "no it doesn't"}
    no it doesn't
    

    (在桌面上或桌面上的文件夹中创建新文件并将其命名为“此文件存在.txt")

    14:51:03 PS>$files = Get-ChildItem $path -recurse | 
                         Where {$_.Name -match "thisfileexists.txt"}
    
    14:52:07 PS>if($files) {write-host "the file exists in this path somewhere"
                } else {write-host "no it doesn't"}
    the file exists in this path somewhere