2016-03-08 150 views
1

我基本上需要在不知道完整路徑的情況下將變量設置爲文件夾路徑。查找匹配字符串或部分字符串的所有子目錄

我的問題是我需要找到一個名爲「DirA」的例子。但是這個目錄可能位於「DirB \」或「DirB \ DirC」中,有時它們可​​能包含的目錄名稱不一樣。

我知道目錄路徑的第一部分將是相同的,無論如何我想使用-recurse篩選器來查找文件夾名稱,但有時候我要查找的目錄名稱並不像通常那樣預計,有時候會有一封額外的信。

是否可以做這樣的事情......

$MyVariable = Get-ChildItem D:\Data\Dir1 -Recurse | Where-Object {$_.name -like "name"} -Directory | 
% { $_.fullname } 

任何幫助,不勝感激!

回答

2

嘗試是這樣的:

$BaseDir = "C:\Dir1" 
$NameToFind = "\DirA" 

$MyVariable = Get-ChildItem $BaseDir -Recurse | Where-Object { $_.PSIsContainer -and $_.Name.EndsWith($NameToFind)} 

這應該通過在樹中的所有目錄,起始於C:\ Dir1中,並返回目錄對象迪拉還給你。

如果您只需要在目錄的路徑,只需使用:

$MyVariable.FullName 
+0

您好,先生,太棒了!我改變了一點,因爲它更容易找到開始,所以「$ _。Name.EndsWith」,並從$ NameToFind中刪除反斜槓 –

+0

很高興已經幫助 –

0

可以使用Get-ChildItem和遞歸就像你正在做的,扔在一個地方對象搶目錄只,然後也使用名稱過濾器。使用的試圖找到迪拉(但是可能會在它有字母),將永遠是裏面的某個地方你的方向1例如,這個查詢應該工作:

$MyVariable = Get-Childitem D:\Data\Dir1 -recurse | Where-Object {$_.PSIsContainer -and $_.name -like "*DirA*" | Select-Object -expandproperty fullname 
1

你不需要後期處理這一與Where-Object-Filter已經可以爲你取得這個了。如果你至少有PowerShell 3.0,那麼你可以刪除整個Where-object

(Get-ChildItem -Path D:\Data\Dir1 -Filter "*DirA*" -Recurse -Directory).Fullname 

這將返回有DIRA的確切名稱路徑下的所有目錄。如果您需要部分匹配,那麼只需使用簡單的通配符:-Filter "Dir*some"

如果運行PowerShell 2.0,則可以執行以下操作。

Get-ChildItem -Path D:\Data\Dir1 -Filter "*DirA*" -Recurse | Where-Object {$_.PSIsContainer} | Select-Object -ExpandProperty Fullname 
+0

問題是,這需要能夠在各種操作系統上運行'所以需要與v2兼容「/ –

+0

@dewi新增了我建議的2.0等價物,基本上讓過濾器儘可能地減輕後處理的負擔 – Matt

+0

這樣快得多 – ferics2

相關問題