2009-06-22 45 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) 
} 
相關問題