PowerShell删除速度更快

PowerShell删除速度更快,powershell,Powershell,我有一个PowerShell脚本,它递归删除所有文件和文件夹,但排除某些文件夹,因为它们不应被删除。 它100%有效,但我的问题是性能。我需要这个跑得更快 有什么办法可以加快速度吗 Write-Host "Purging $InstallationDirectorySite - Deleting files..." $FolderExlusions = ( "App_Data", "Logs", "TEMP", "ExamineIndexes", "Di

我有一个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"
}

实际上,您正在对排除的文件夹进行两次筛选。
第一次使用
-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