0

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

$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 

  }

}

4

1 回答 1

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。如果你想解决这个问题,你需要建立一些检查,让你在删除之前查看每个文件夹是否有另一个文件夹。

希望这有助于更多!

于 2013-09-04T21:03:26.943 回答