2016-03-08 158 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

相关问题