2017-09-01 94 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}