2017-09-01 60 views
0

我有一个对象集合(数万个),每个对象都包含一个包含文件路径的属性作为字符串。这些在下面的代码中被命名为$ fileObjects。通过字符串数组筛选对象集合

(i.e. 
    $fileObject.FilePath = "\\root\folder1\foldera\folderb\folderc" 
    $fileObject.FilePath = "\\root\foo\bar\fldr1" 
    $fileObject.FilePath = "\\bar\foo\folder3" 
). 

我也有一个小的字符串集合,每个字符串是一个文件路径

(i.e. 
    "\\root\folder1", 
    "\\root\folder2", 
    "\\root\folder3" etc. 
) 

的起始部分,这些字符串被称为$下面的代码路径。

我想过滤(而不是使用foreach循环)所有的$ fileObjects,这样我就可以只返回文件路径以$ paths string集合中的一个值开始的对象。

下面的代码不工作,但它是我想要做什么:

foreach($path in $paths) 
{ 

    # Get all $fileObjects where FilePath property starts with $path 
    # 
     $subfolders = $fileObjects.FolderPath.StartsWith($path) 

    # Now process the $subfolders 
} 

我还没有找到一种简洁的方式来做到这一点没有的foreach循环每$文件对象agains每$路径。

+0

你试图做的事情非常让我想起像SQL这样的语言中的关系连接。这不是一个解决方案,但我注意到你已经得到了一个可以接受的答案。令我惊讶的是,PS没有关系连接操作,虽然我看到其他脚本编写人员做了一些努力。 –

回答

0

加入路径集合|进行比较后,可以使用正则表达式匹配。

$RegEx = (@("\\root\folder1","\\root\folder2","\\root\folder3") | ForEach-Object {[regex]::Escape($_)}) -join '|' 
$subfolders = $fileObjects | Where-Object {$_.FolderPath -match $RegEx}