2016-08-19 1 views
0

У меня есть $array из PSCustomObjects, которые содержат путь, дни, процеживают и RECURSE свойстваудалить объекты из массива, когда их свойство пути равняется объект в другом массиве

Я Test-Path пути каждого PSCustomObject и если это false, я сохранить только путь в другой переменной, как $failpath

Теперь я хочу, чтобы удалить все объекты внутри $array когда путь находится внутри $failpath

Я попытался вещи, как .remove() метод $array, но это не работает, и дал мне эту ошибку (например, ПИК из Интернета): https://i0.wp.com/www.sapien.com/blog/wp-content/uploads/2014/11/image8.png

Так что я попытался создать новый массив, но это дает мне трудное время, потому что я не знаю как правильно выполнить итерацию ошибок. так что каждый правильный объект только отправляется в новый массив один раз (когда я его пробовал, правильный объект был там несколько раз) - я не могу показать вам код для этого, потому что я уже редактировал его слишком много раз, и теперь это просто бардак.

это как $array и $faultypath выглядеть

$array = @(
    [pscustomobject]@{ 
     path = "\\server\daten\Alle Adressen\Dokumente 70" 
     filter = "*.pdf" 
     days = "90" 
     recurse = "false" 
    } 
    [pscustomobject]@{ 
     path = "\\server\Tobit\itacom\ERP2UMS" 
     filter = "*.fax" 
     days = "7" 
     recurse = "false" 
    } 
) 

[string[]]$faultypath = @() 
$pfade | % { if (!(Test-Path $_.path)) { $faultypath += $_.path } } 

Как я могу вычитать все, что находится в $faultypath от $array?

ответ

3

В PowerShell 3 или выше

$faultyPath = $pfade | Where-Object { -not (Test-Path $_.Path) } | ForEach-Object Path 
$array | Where-Object Path -notin $faultyPath 

Для PowerShell 2 или ниже

$faultyPath = $pfade | Where-Object { -not (Test-Path $_.Path) } | ForEach-Object { $_.Path } 
$array | Where-Object { $faultyPath -notcontains $_.Path } 

Это потенциально дорогостоящее сравнение массива, если оба набора являются большими. В этом случае словари или хеш-таблицы будут обеспечивать лучшую производительность для сравнения.

+0

Или используйте '$ массив = System.Collections.ArrayList New-Object, это позволяет .Add () и .remove ()' ' – whatever

+0

System.Collections.Generic.List [строка]' будет немного быстрее –

+0

Большое спасибо Крису, отлично работает. @ MathiasR.Jessen, если я возьму ваше утверждение, мои переменные выглядели бы так: 'System.Collections.Generic.List [string] $ faultypath =" xy "," xy2 "' не должно быть ' [строка []] '? – SimonS

Смежные вопросы