Я ищу помощи, чтобы сделать что-то более производительное, так как мой метод действительно глупый, но работает
Я немного поискал в 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
содержит каждый подготовленный пакет приложения в образе
например -> Отображаемое имя = Microsoft.ZuneMusic
$applist
содержит те имена приложений, которые нужно удалить в CSV
например -> Имя приложения = Microsoft.ZuneVideo
И я хочу четко видеть, что пропущено, а что удалено.
Расскажите, пожалуйста, об источниках данных (AD?) и размерах. В общем, попробуйте передать (использовать конвейер) внешний цикл (/самый медленный ввод), например. с помощью $Apps | ForEach-Object {...
.
Я отредактировал свой пост для уточнения @iRon
Думаю, я бы использовал для этого оператор регулярного выражения -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
}
}
надеюсь, это поможет
Используйте
Where-Object
или содержит (.Contains()
или-Contains
).