Поиск соответствия в 2 списках, повышение производительности powershell

#powershell

#powershell

Вопрос:

Я обращаюсь за помощью, чтобы сделать что-то более производительное, поскольку мой метод действительно глуп, но работает

Я немного поискал в stackoverflow, но не нашел ничего, что соответствовало бы моей идее

 ForEach($app in $apps){
    ForEach($removeapp in $applist)
    {
        If ($app.Displayname -like $removeapp.appname) {
            Write-Host "Removing: " $app.Displayname -ForegroundColor Green
        }
        Else{
            Write-Host "Skiping: " $app.Displayname -ForegroundColor Red
        }
    }
}
  

Я в основном сравниваю каждый из них, что дает мне возможность x ^ y, что довольно плохо и замедляет любую помощь, как сделать это быстрее?

$apps содержит каждый пакет приложений provisiond в образе
, например -> Displayname = Microsoft.ZuneMusic

$applist содержит те имена приложений, которые должны быть удалены, например, в формате CSV -> Appname = Microsoft.ZuneVideo

И я хочу четко видеть, какие из них пропущены, а какие удалены.

Комментарии:

1. Используйте Where-Object или содержит ( .Contains() или -Contains ).

2. Пожалуйста, дайте некоторую информацию об источниках данных (AD?) и размерах. В общем, попробуйте передать ( использовать конвейер ) внешний цикл (/ самый медленный ввод), например, с помощью $Apps | ForEach-Object {... .

3. Я отредактировал свой пост для очистки @iRon

Ответ №1:

Я думаю, что я бы использовал -match для этого оператор регулярных выражений. Что-то вроде приведенного ниже:

 # build a regex from all the app displaynames joined using the regex OR ("|") character
$appNames = ($apps | ForEach-Object { [regex]::Escape($_.DisplayName) }) -join '|'
$applist | ForEach-Object {
    if ( $_.appname -match $appNames ) {
        Write-Host "Removing: $($_.appname)" -ForegroundColor Green
    }
    else {
        Write-Host "Skipping: $($_.appname)" -ForegroundColor Red
    }
}
  

Надеюсь, это поможет