我有一个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"
}
答案 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
。
希望有帮助