You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为管道至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. 创建新任务,选择“不管用户是否登录都要运行”,并授予系统权限;
  2. 触发器设置为“每日”,开始时间选1:00,重复任务间隔设为1小时,持续时间3小时;
  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策略配置

如果有多台服务器,可通过组策略批量设置:

  1. 打开组策略编辑器,定位到用户配置 > 管理模板 > Windows组件 > 文件资源管理器;
  2. 启用“不要将已删除的文件移动到回收站”策略;
  3. 若需针对系统账户,可设置计算机配置下的对应策略,或通过GPO筛选目标服务器。

内容的提问来源于stack exchange,提问作者kindzmarauli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:37:49