PowerShell删除速度更快
我有一个PowerShell脚本,它递归删除所有文件和文件夹,但排除某些文件夹,因为它们不应被删除。 它100%有效,但我的问题是性能。我需要这个跑得更快 有什么办法可以加快速度吗PowerShell删除速度更快,powershell,Powershell,我有一个PowerShell脚本,它递归删除所有文件和文件夹,但排除某些文件夹,因为它们不应被删除。 它100%有效,但我的问题是性能。我需要这个跑得更快 有什么办法可以加快速度吗 Write-Host "Purging $InstallationDirectorySite - Deleting files..." $FolderExlusions = ( "App_Data", "Logs", "TEMP", "ExamineIndexes", "Di
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"
}
实际上,您正在对排除的文件夹进行两次筛选。
第一次使用
-Exclude
参数,第二次使用Regex-match
但是,
Exclude
参数接受一个字符串数组,而不是一个包含关键字的字符串,关键字之间用逗号和换行符分隔,正如您从“here string”中得到的那样。
看
此外,您使用的正则表达式是错误的,因为正则表达式中的asteriks*
是一个量词,而不是通配符
我建议您使用如下-Exclude
参数过滤一次(此处星号为通配符):
或者只在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
<>希望帮助可以比较COM或.NET方法的速度,而不是<代码> RM- R>代码>:考虑使用中间变量而不是管道。将其与
Measure命令
相结合,以确定哪一部分是速度较慢的部分。现在的删除速度有多慢?您希望获得什么样的性能?您正在处理多少目录和文件?删除操作必须处理40多个文件夹,但这些文件夹包含大量文件。最差的文件夹是包含大量文件的节点模块文件夹。现在的删除时间大约是2分钟,如果我能减半,我会很高兴的。我肯定会研究一些测试的Measure命令。众所周知,NTFS在处理大量文件时有其独特之处。看见TL;DR:为1000多个文件/dir环境禁用8.3文件名和上次访问时间。我一直在测试,Where对象{$\uu.FullName-notmatch$files\u regex}实际起作用,并停止删除文件夹及其子文件夹的排除。没有它,文件夹不会被删除,但是子文件夹会被删除,这不是我们想要的结果,因为我们想要保留文件夹及其子文件夹。看起来我不会从中得到太多好处。是时候在服务器上移动到SSD了,
$FolderExlusions = "^(App_Data|Logs|TEMP|ExamineIndexes|DistCache.*|GitPathProviderRepository.*)"
Get-ChildItem -Path $InstallationDirectorySite -Recurse | Where-Object { $_.Name -notmatch $FolderExlusions } | Remove-Item -Recurse -WhatIf