如何为管道至Measure-Object的Get-ChildItem添加进度指示器?
解决方案
一、为Get-ChildItem添加实时进度指示器
你的问题出在Measure-Object会缓冲管道中所有输入,直到全部接收完成才开始处理,导致中间的Write-Output无法实时显示。改用Write-Progress可以绕过缓冲,实时输出进度:
$dir = 'C:\$Recycle.Bin\S-1-5-18\' $processedCount = 0 # 遍历文件并实时显示进度 $sizeSum = Get-ChildItem -LiteralPath $dir -File -Recurse -Force -ErrorAction SilentlyContinue | ForEach-Object { $processedCount++ # 每处理1000个文件更新一次进度(可根据需求调整频率) if ($processedCount % 1000 -eq 0) { Write-Progress -Activity "扫描回收站文件" -Status "已处理 $processedCount 个文件" -PercentComplete (-1) } $_ # 将文件对象传递给后续的Measure-Object } | Measure-Object -Property Length -Sum # 结束进度条 Write-Progress -Activity "扫描回收站文件" -Completed # 输出最终大小 $sizeSum.Sum / 1GB
由于无法提前获取回收站的总文件数,使用-PercentComplete (-1)会显示滚动式进度条,实时反馈处理状态。
二、智能清空回收站(按文件删除时间+定时执行)
按删除时间清理文件
回收站中的文件带有DeletedDate属性(记录文件被删除的时间),可基于此筛选并删除指定天数前的文件:
$dir = 'C:\$Recycle.Bin\S-1-5-18\' $daysToKeep = 7 # 保留最近7天删除的文件 $deletedCount = 0 Get-ChildItem -LiteralPath $dir -Force -ErrorAction SilentlyContinue | ForEach-Object { $deletedDate = $_.GetItemPropertyValue('DeletedDate') if ($deletedDate -lt (Get-Date).AddDays(-$daysToKeep)) { $deletedCount++ if ($deletedCount % 100 -eq 0) { Write-Progress -Activity "清理旧回收站文件" -Status "已删除 $deletedCount 个项目" -PercentComplete (-1) } # 强制删除文件/目录 Remove-Item -LiteralPath $_.FullName -Force -Recurse -ErrorAction SilentlyContinue } } Write-Progress -Activity "清理旧回收站文件" -Completed Write-Host "共删除 $deletedCount 个过期回收站项目"
定时执行
通过Windows任务计划程序设置每日1-4点执行脚本:
- 创建新任务,选择“不管用户是否登录都要运行”,并授予系统权限;
- 触发器设置为“每日”,开始时间选1:00,重复任务间隔设为1小时,持续时间3小时;
- 操作选择“启动程序”,程序路径填
powershell.exe,参数填-ExecutionPolicy Bypass -File "C:\路径\你的清理脚本.ps1"。
三、阻止应用使用回收站
注册表强制永久删除(针对系统账户/特定卷)
通过设置NukeOnDelete注册表项,让指定卷的删除操作跳过回收站:
# 获取C卷的唯一GUID $volumeGuid = (Get-Volume -DriveLetter C).UniqueId -replace '\\\\\?\\Volume(.+?)\\', '$1' $regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume\$volumeGuid" # 创建注册表路径(如果不存在) if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force | Out-Null } # 设置NukeOnDelete为1,强制永久删除 Set-ItemProperty -Path $regPath -Name 'NukeOnDelete' -Value 1 -Type DWord
GPO策略配置
如果有多台服务器,可通过组策略批量设置:
- 打开组策略编辑器,定位到用户配置 > 管理模板 > Windows组件 > 文件资源管理器;
- 启用“不要将已删除的文件移动到回收站”策略;
- 若需针对系统账户,可设置计算机配置下的对应策略,或通过GPO筛选目标服务器。
内容的提问来源于stack exchange,提问作者kindzmarauli
相关产品推荐
相关产品推荐

