如何在PowerShell脚本中捕获Remove-Item错误并记录未删除文件
修正后的PowerShell脚本
$totalSize = 0 $failedDeletions = @() $results = Get-ChildItem -Path $searchRoot -Filter *.log -Recurse | ForEach-Object { $file = $_ $deleteError = $null $sizeMB = [math]::Round($file.Length / 1MB, 2) $totalSize += $file.Length # 尝试删除文件并捕获错误 try { Remove-Item -Path $file.FullName -Force -Verbose -ErrorAction Stop $deleteStatus = "成功" } catch { $deleteError = $_.Exception.Message $deleteStatus = "失败" # 将删除失败的文件信息存入单独变量 $failedDeletions += [PSCustomObject]@{ Name = $file.Name FullName = $file.FullName "Size (MB)" = $sizeMB LastWriteTime = $file.LastWriteTime ErrorMessage = $deleteError } } # 返回包含删除状态的文件信息 $file | Select-Object -Property Name, FullName, @{n='Size (MB)'; e={$sizeMB}}, LastWriteTime, @{n='删除状态'; e={$deleteStatus}}, @{n='错误信息'; e={$deleteError}} } # 输出所有文件的处理结果 $results # 输出总文件大小(格式化显示为MB) "所有日志文件总大小: {0:N2} MB" -f ($totalSize / 1MB) # 若存在删除失败的文件,单独输出 if ($failedDeletions.Count -gt 0) { "`n删除失败的文件列表:" $failedDeletions | Format-Table -AutoSize }
关键修改说明
1. 整合删除错误信息到结果属性
- 添加了两个计算属性:
删除状态(标记成功/失败)和错误信息(失败时显示具体错误内容,成功时为$null) - 使用
try/catch块配合-ErrorAction Stop强制将Remove-Item的非终止错误转为终止错误,确保能捕获所有删除失败的情况
2. 存储删除失败的文件到单独变量
- 初始化
$failedDeletions数组,在删除失败时将文件的完整信息(名称、路径、大小、修改时间、错误信息)以自定义对象形式存入该变量 - 脚本末尾会自动检查并输出所有删除失败的文件列表
内容的提问来源于stack exchange,提问作者Senior Systems Engineer
相关产品推荐
相关产品推荐

