我编写了一个powershell脚本,它将迭代三个不同的路径并获取少于7年的文件列表,并从当前时间戳中删除它们。 我正在创建文件的创建年份,如果能够递归遍历所有这三个路径。 问题是3,两个路径有太多的文件夹和文件,因为当脚本在循环中它显示内存异常。此外,我无法设置maxmemorypershellMB,因为我无法访问。
我可以做任何其他事情来避免内存异常 这是下面的代码:
$files = Get-ChildItem "$path" –Recurse -file
for ($i=0; $i -lt $files.Count; $i++) {
$outfile = $files[$i].FullName #file name
$FileDate = (Get-ChildItem $outfile).CreationTime #get creation date of file
$creationYear = $FileDate.Year
$creationMonth =$FileDate.Month #get only year out of creation date
If( $creationYear -lt $purgeYear ){
If (Test-Path $outfile){ #check if file exist then only proceed
$text=[string]$creationYear+" "+$outfile
$text >> 'listOfFilesToBeDeleted_PROD.txt' #this will get list of files to be deleted
#remove-item $outfile
}
}
}
答案 0 :(得分:2)
您可以尝试使用where-object而不是for循环来过滤文件:
$limit = (Get-Date).AddYears(-7)
$path = "c:\"
$outfile = "c:\test.txt"
Get-ChildItem -Path "$path" -Recurse -file |
Where-Object { $_.CreationTime -lt $limit } |
foreach { '{0} {1}' -f $_.CreationTime, $_.FullName |
Out-File -FilePath $outfile -Append }
您的评论解决方案:
# retrieve all affected files and select the fullname and the creationtime
$affectedFiles = Get-ChildItem -Path "$path" -Recurse -file |
Where-Object { $_.CreationTime.Year -lt $purgeYear } |
select FullName, CreationTime
foreach ($file in $affectedFiles)
{
# write the file to listOfFilesToBeDeleted
'{0} {1}' -f $file.CreationTime.Year, $file.FullName |
Out-File -FilePath listOfFilesToBeDeleted.txt -Append
# delete the file
Remove-Item -Path $file.FullName -Force
}