2009-06-22 42 views
5

我想检查文件路径是否在PowerShell的给定目录(或其子目录之一)中。如何在PowerShell中检查文件是否位于给定目录下?

现在我做:

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

但我敢肯定有更好的方法。

我可以采取$file.Directory并遍历所有.Parent s,但我希望更简单一些。

编辑:该文件可能不存在;我只是看着路径。

回答

0

真实的东西快:

14:47:28 PS>pwd 

C:\ Documents和Settings \我\桌面

14点47分30秒PS> $ PATH = PWD

14时48分03秒PS > $ PATH

C:\ Documents和Settings \我\桌面

14时48分16秒PS> $文件= GET-ChildItem $路径 - 递归|其中{$ _。Name -match thisfiledoesnt.exist“}

14:50:55 PS> if($ files){write-host”文件存在于此路径某处“} else {write-host”不,它不需要“} 没有也

(在桌面上创建或桌面和名称的文件夹中的新文件是‘thisfileexists.txt’)

14时51分03秒PS> $ files = Get-ChildItem $ path -recurse |其中{$ _。Name --match“thisfileexists.txt”}其他{write-host“{write-host”文件存在于此路径中的某处“}其他{write-host”}其他{不,它不会“} 该文件存在于此路径

当然,迭代仍在进行,但PS是为你做的。如果查找系统/隐藏文件,您也可能需要-force。

+0

我对文件是否存在不感兴趣,但是它的路径是否在目录下。另外,你的格式不清楚。 – 2009-06-23 03:01:16

+0

是的,这里的代码格式不适用于PS。这不是一个完整的PS1文件,只是在PS cmd行上键入的东西。你的问题问:“如何检查一个文件是否在给定的目录下?”看起来另一个答案也是检查一个文件,就像你问的那样。我看到你的编辑,但是如果文件不存在,文件怎么会有路径? – Bratch 2009-06-23 05:43:42

5

如何为简单的东西:

PS> gci . -r foo.txt 

这隐含使用筛选参数(按位置)指定foo.txt的作为过滤器。你也可以指定* .txt或foo?.txt。 StartsWith的问题在于,在处理不区分大小写的比较时,仍然存在PowerShell中的/和\是有效路径分隔符的问题。

假设文件可能不存在两者$文件和$目录的绝对路径,你可以做到这一点“的PowerShell”的方式:

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

但是,这不是伟大的,因为你还是要规范路径/ - > \但至少PowerShell字符串比较是不区分大小写的。另一种选择是使用IO.Path来规范路径,例如:这个

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

一个问题是,GetFullPath也将相对路径基于进程的当前目录,其更多的时间比不是绝对路径,是一样PowerShell的当前目录。因此,只要确保$ directory是绝对路径,即使您必须指定它为“$ pwd \ $ directory”。

0

像这样的事情?

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

由于路径可能不存在,使用string.StartsWith是精做这种类型的测试(虽然OrdinalIgnoreCase is a better representation of how the file system compares paths)。

唯一要注意的是,路径需要在一个规范形式。否则,像C:\x\..\a\b.txtC:/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.txtZ:\将失败,即使该文件可以通过Z:\path\b.txt访问)。如果您需要支持此行为,these questions可能会有所帮助。

0

如果您转换您的输入字符串的DirectoryInfo和FileInfo的,你不会有与字符串比较任何问题。

function Test-FileInSubPath([System.IO.DirectoryInfo]$Dir,[System.IO.FileInfo]$File) 
{ 
    $File.FullName.StartsWith($Dir.FullName) 
} 
相关问题