PowerShell Удалить быстрее - PullRequest
       5

PowerShell Удалить быстрее

1 голос
/ 11 марта 2019

У меня есть сценарий PowerShell, который рекурсивно удаляет все файлы и папки, но исключает некоторые папки, так как их не следует удалять.Это работает на 100%, но моя проблема заключается в производительности.Мне нужно, чтобы это работало намного быстрее.

Есть идеи, как сделать это быстрее?

Write-Host "Purging $InstallationDirectorySite - Deleting files..."

$FolderExlusions = (
    "App_Data",
    "Logs",
    "TEMP",
    "ExamineIndexes",
    "DistCache",
    "GitPathProviderRepository"
)

[regex] $files_regex = "Logs|ExamineIndexes|DistCache*|GitPathProviderRepository*"

if(Test-Path $InstallationDirectorySite) {
    Get-ChildItem -Path $InstallationDirectorySite -Recurse -Exclude $FolderExlusions |
        Where-Object {$_.FullName -notmatch $files_regex} |
        Remove-Item -Recurse
}
else {
    Write-Output "$InstallationDirectorySite doesn't exist"
}

1 Ответ

0 голосов
/ 11 марта 2019

Вы фактически фильтруете исключенные папки дважды.
Первый раз с использованием параметра -Exclude и второй раз с использованием регулярного выражения -match.
Однако параметр Exclude принимает строковый массив, а не одну строку с ключевыми словами, разделенными запятой и символом новой строки, как вы получаете из 'here-string'. Смотрите Get-ChildItem

Кроме того, вы используете неправильное регулярное выражение, потому что звездочки * в регулярном выражении являются квантификатором, а не подстановочным знаком.

Я предлагаю вам отфильтровать один раз, используя один из параметров -Exclude, например, здесь (здесь звездочки являются подстановочными знаками):

$FolderExlusions = "App_Data","Logs","TEMP","ExamineIndexes","DistCache*","GitPathProviderRepository*"
Get-ChildItem -Path $InstallationDirectorySite -Recurse -Exclude $FolderExlusions | Remove-Item -Recurse -WhatIf

Или используйте только метод регулярных выражений в предложении Where-Object, например:

$FolderExlusions = "^(App_Data|Logs|TEMP|ExamineIndexes|DistCache.*|GitPathProviderRepository.*)"
Get-ChildItem -Path $InstallationDirectorySite -Recurse | Where-Object { $_.Name -notmatch $FolderExlusions } | Remove-Item -Recurse -WhatIf

Удалите -WhatIf, если вы удовлетворены результатами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...