删除count> 5的文件夹

时间:2013-09-03 07:05:52

标签: powershell count directory delete-file

我需要一些帮助:需要更改以下脚本,以便脚本仅删除子目录中的文件夹而不是文件。任何人都可以帮助我吗?

$path = "C:\test\1"
$keep = 3
$strLogFileName   = "c:\test\yourlogfile.log";

function Log-Message
 {
   Param ([string]$logtext)
   Add-content $strLogFileName -value $logtext
 }

  $dirs = Get-ChildItem -Path $path -Recurse | Where-Object {$_.PsIsContainer}
  foreach ($dir in $dirs) {
  $files = Get-ChildItem -Path $dir.FullName | Where-Object {-not $_.PsIsContainer -and $_.name -      like "*.zip"}
  if ($files.Count -gt $keep) {
    $files | Sort-Object CreationTime -desc| Select-Object -First ($files.Count - $keep) | 
    % { $dt=get-date;(Log-Message "Deleting File $_  on  $dt");$_ }| Remove-Item -Force 

  }

}

1 个答案:

答案 0 :(得分:1)

我原来的答案是-WAY- off base,并且有了RTFQ我有一些适合你的东西。

function Remove-LargeFolders
{
Param([string]$RootPath)

$keep = 5

#Get a list of the dirs in the first level of the folder
$dirs = Get-ChildItem -Path $RootPath | Where-Object {$_.PsIsContainer}

foreach ($dir in $dirs) {

    #Call function on the new folder to check all the sublevels before deleting 
    #the top-level folder.
    Remove-LargeFolders $dir.FullName

    $files = Get-ChildItem -Path $dir.FullName | Where-Object {-not $_.PsIsContainer `
     -and $_.name -like "*.zip"}

    if ($files.Count -gt $keep) {
        $dt=get-date
        Log-Message "Deleting Folder $dir  on  $dt"
        $dir

        Remove-Item $dir.FullName -Force -Recurse
        }
}
}

这应该做你想要的。答案是递归!本质上,脚本一次只查看一个级别的文件夹。它会深入到每个文件夹树的底部,然后再回到顶部。

此脚本将按照书面形式工作,但有一个附带条件。现在,如果脚本的目标是这样的结构:

Target Folder (4 files)
    SubFolder (10 files)
      SubSubFolder (5 files)

它将首先检查SubSubFolder而不是删除它,因为它有5个或更少的文件。然而,一旦它跳回到SubFolder,它将看到一个太大的文件夹并将其删除,在此过程中摆脱SubSubFolder。如果您想要解决这个问题,您需要构建一些检查,以便在删除之前查看每个文件夹中是否包含其他文件夹。

希望这会有所帮助!