【发布时间】:2016-05-25 00:34:05
【问题描述】:
目标:使用脚本运行 500 万至 1000 万个 XML 文件并评估其日期,如果超过 90 天则删除该文件。该脚本将每天运行。
问题:使用 powershell Get-ChildItem -recurse,导致脚本锁定并且无法删除任何文件,我认为这是因为 Get-ChildItem 在对任何文件采取任何操作之前需要构建整个数组的方式.
解决方案?:经过大量研究,我发现 [System.IO.Directory]::EnumerateFiles 将能够在数组完全构建之前对数组中的项目采取行动,这样可以提高效率(@987654321 @)。经过更多测试,我发现foreach ($1 in $2) 比$1 | % {} 更有效
在我运行此新代码并可能再次使此服务器崩溃之前,是否有人可以建议任何调整以更有效地编写脚本?
为了测试,我刚刚在 15,000 个目录中创建了 15,000 x 0.02KB txt 文件,其中包含随机数据并运行以下代码,我在 $date 变量上使用了 90 秒而不是 90 天,仅用于测试,花了 6秒删除所有txt文件。
$getfiles = [System.IO.Directory]::EnumerateFiles("C:\temp", "*.txt", "AllDirectories")
$date = ([System.DateTime]::Now).AddSeconds(-90)
foreach ($2 in $getfiles) {
if ([System.IO.File]::GetLastWriteTime($2) -le $date) {
[System.IO.File]::Delete($2)
} #if
} #foreach
【问题讨论】:
-
如果您还没有这样做,disable 8.3 filename generation 可能会有所帮助。首先阅读所有警告。做一两个备份。使用风险自负。
-
只要您只是将 enumeratefiles 的输出保存到变量中,您就不会从 ienumerable 中获得任何好处,因为 PS 将等待该行完成后再继续(它不是异步方法) .您需要直接在循环、管道或类似的东西中使用它。
标签: powershell datetime delete-file memory-efficient