Powershell脚本,用于按创建年份清除文件

时间:2015-07-30 07:01:15

标签: powershell

我编写了一个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 
            }
    }

}

1 个答案:

答案 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
 }