#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
}
}
Надеюсь, это поможет