PowerShell删除30天前文件时日志不记录被删文件问题排查
问题原因
你当前脚本日志无法记录删除文件的核心原因有两个:
Remove-Item命令默认没有标准输出,你添加的-Verbose参数输出属于Verbose流,不会直接进入管道传递给Write-MyLog,因此日志无法捕获到删除信息- 你没有提前收集待删除的文件列表,也没有配置删除命令返回操作对象,自然无法输出删除记录
调整方案
按如下代码修改即可实现全场景日志记录:
首先补全你遗漏的Write-MyLog函数声明,再调整删除逻辑:
Function Write-MyLog { [Cmdletbinding()] param( [Parameter()]$LogPath = 'C:\Admin\scripts\Clean_Folder\Log\log.txt', [Parameter(ValueFromPipeline)]$Message ) process { $timeStampedMessage = "[$(Get-Date -Format 's')] $Message" $timeStampedMessage | Out-File -FilePath $LogPath -Append } } Function Remove-FilesCreatedBeforeDate { [Cmdletbinding()] param( [Parameter()]$Path = '\\servername\path\', [Parameter()]$Date = $(Get-Date).AddDays(-30) ) process { if(-not (Test-Path $Path -IsValid)) { "路径无效:$Path" | Write-MyLog return } "路径校验通过:$Path,开始执行清理" | Write-MyLog try { # 先拉取所有符合删除条件的文件/文件夹 $toDelete = Get-ChildItem -Path $Path -Recurse | Where-Object { $_.LastWriteTime -lt $Date } if ($toDelete.Count -eq 0) { "未找到30天以上的旧文件,无需执行清理" | Write-MyLog return } "共匹配到$($toDelete.Count)个待清理对象,开始执行删除:" | Write-MyLog # 删除时加-PassThru返回被删除的对象,遍历写入日志 $toDelete | Remove-Item -Recurse -Force -PassThru | ForEach-Object { "已删除:$($_.FullName)" | Write-MyLog } "清理任务执行完成" | Write-MyLog } catch { "删除操作异常:$($_.Exception.Message)" | Write-MyLog } } } # 执行清理任务 Remove-FilesCreatedBeforeDate
核心修改点
- 补全了
Write-MyLog的函数声明,避免脚本运行报错 - 提前拉取待删除列表,先统计数量写入日志,覆盖无文件可删的场景
- 给
Remove-Item添加-PassThru参数,让命令返回已删除的对象,遍历后把文件全路径写入日志 - 补充了任务完成、异常场景的日志记录,覆盖全运行流程
内容的提问来源于stack exchange,提问作者Juggybash
相关产品推荐
相关产品推荐

