小编Wil*_*ill的帖子

在Windows中基于修改日期删除数百万个文件的最有效方法

目标:使用脚本运行500万--1000万个XML文件并评估其日期,如果超过90天,则删除该文件.该脚本将每天运行.

问题:使用powershell Get-ChildItem -recurse会导致脚本锁定并且无法删除任何文件,我认为这是因为Get-ChildItem需要在对任何文件执行任何操作之前构建整个阵列.

解决方案?:经过大量研究后,我发现[System.IO.Directory] ​​:: EnumerateFiles能够在数组完全构建之前对数组中的项采取操作,这样可以提高效率(https:// msdn .microsoft.com/library/dd383458%28v = vs.100%29.aspx).经过更多测试后,我发现它foreach ($1 in $2)比$1 | % {} 以前运行这个新代码更有效率并且可能再次崩溃这个服务器是否有任何调整任何人可以建议更有效的方法来编写脚本?

为了测试,我刚刚在15,000个目录中创建了15,000 x 0.02KB txt文件,其中包含随机数据并运行以下代码,我在$date变量上使用90秒而不是90天仅用于测试,删除所有txt需要6秒文件.

$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
Run Code Online (Sandbox Code Playgroud)

powershell datetime delete-file memory-efficient

4
推荐指数
2
解决办法
8075
查看次数