我想检查文件路径是否在PowerShell的给定目录(或其子目录之一)中。如何在PowerShell中检查文件是否位于给定目录下?
现在我做:
$file.StartsWith( $directory, [StringComparison]::InvariantCultureIgnoreCase)
但我敢肯定有更好的方法。
我可以采取$file.Directory
并遍历所有.Parent
s,但我希望更简单一些。
编辑:该文件可能不存在;我只是看着路径。
我想检查文件路径是否在PowerShell的给定目录(或其子目录之一)中。如何在PowerShell中检查文件是否位于给定目录下?
现在我做:
$file.StartsWith( $directory, [StringComparison]::InvariantCultureIgnoreCase)
但我敢肯定有更好的方法。
我可以采取$file.Directory
并遍历所有.Parent
s,但我希望更简单一些。
编辑:该文件可能不存在;我只是看着路径。
真实的东西快:
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。
如何为简单的东西:
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”。
像这样的事情?
Get-ChildItem -Recurse $directory | Where-Object { $_.PSIsContainer -and `
$_.FullName -match "^$($file.Parent)" } | Select-Object -First 1
由于路径可能不存在,使用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可能会有所帮助。
如果您转换您的输入字符串的DirectoryInfo和FileInfo的,你不会有与字符串比较任何问题。
function Test-FileInSubPath([System.IO.DirectoryInfo]$Dir,[System.IO.FileInfo]$File)
{
$File.FullName.StartsWith($Dir.FullName)
}
我对文件是否存在不感兴趣,但是它的路径是否在目录下。另外,你的格式不清楚。 – 2009-06-23 03:01:16
是的,这里的代码格式不适用于PS。这不是一个完整的PS1文件,只是在PS cmd行上键入的东西。你的问题问:“如何检查一个文件是否在给定的目录下?”看起来另一个答案也是检查一个文件,就像你问的那样。我看到你的编辑,但是如果文件不存在,文件怎么会有路径? – Bratch 2009-06-23 05:43:42