我需要一些帮助:需要更改以下脚本,以便脚本仅删除子目录中的文件夹而不是文件。任何人都可以帮助我吗?
$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
}
}
答案 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。如果您想要解决这个问题,您需要构建一些检查,以便在删除之前查看每个文件夹中是否包含其他文件夹。
希望这会有所帮助!