PowerShell删除更快

时间:2019-03-11 08:51:25

标签: powershell

我有一个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 :(得分:0)

您实际上是两次过滤排除的文件夹。
第一次使用-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子句中仅使用regex方法,如下所示:

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

如果对结果满意,请删除-WhatIf

希望有帮助