Таким образом, в опубликованном вами коде PowerShell, безусловно, есть некоторые базовые вещи, которые можно улучшить, но они все еще могут быть не очень быстрыми. Исходя из примера, который вы нам дали, я предполагаю, что вы хотите сопоставить имена файлов со списком слов. Вы просматриваете список слов (400 итераций) и в каждом цикле вы просматриваете все 1119 файлов. Это всего 447 600 итераций!
Предполагая, что вы не можете уменьшить количество итераций в цикле, давайте начнем с ускорения каждой итерации. Командлет Add-Member
будет очень медленным, поэтому переключитесь на него, приведя хеш-таблицу к ускорителю типа [PSCustomObject]:
[PSCustomObject]@{
SearchWord = $Word
File = $File.FullName
}
Кроме того, нет необходимости предварительно создавать объект массива, а затем добавлять в него каждый файл. Вы можете просто записать выход цикла foreach в переменную:
$Results = Foreach ($Word in $Words)
{
...
Так что более быстрый цикл может выглядеть так:
$Words = Get-Content -Path $WordList
$Files = Get-ChildItem -Path $Path -Recurse -File
$Results = Foreach ($Word in $Words)
{
foreach ($File in $Files)
{
if ($File.BaseName -match $Word)
{
[PSCustomObject]@{
SearchWord = $Word
File = $File.FullName
}
}
}
}
Более простым подходом может быть использование Where-Object в массиве файлов:
$Results = Foreach ($Word in $Words)
{
$Files | Where-Object BaseName -match $Word
}
Попробуйте оба варианта и проверьте производительность.