PowerShell删除脚本中Out-File写入日志为空的解决方法
故障原因
日志为空的核心原因是管道对象属性调用错误:当你使用Select-Object -ExpandProperty FullName处理管道结果后,传入ForEach-Object脚本块的$_已经是字符串类型的完整路径值,不再是包含FullName属性的文件/目录对象,此时执行$_.FullName会返回空值,写入日志的内容自然为空,而删除操作因为直接接收了路径字符串可以正常执行。
修复后完整代码
# 定义待清理目录 $Folder5 = "E:\What\Ever" # 定义日志存储路径 $logPath = "C:\What\Ever\deleteditems.txt" # 执行清理与日志记录 Get-ChildItem $Folder5 -Recurse -Force -ea 0 | Where-Object { $_.psiscontainer -and $_.fullname -notmatch 'coolfiles' -and $_.LastWriteTime -lt (Get-Date).AddDays(-90) } | Select-Object -ExpandProperty FullName | ForEach-Object { # 先记录日志再执行删除,避免删除报错时记录丢失 $_ | Out-File $logPath -Encoding ASCII -Append $_ | del -Force -Recurse -ea 0 }
注:代码中
del是PowerShell内置命令Remove-Item的别名,两种写法运行效果完全一致。
关键修改说明
- 修正日志写入的取值逻辑:去掉了
$_.FullName的无效属性调用,直接将当前管道对象(即已展开的完整路径字符串)写入日志 - 调整操作顺序:将日志写入步骤移到删除操作之前,避免删除过程抛出异常时对应条目未被记录
- 增加删除命令的错误静默参数:删除单个对象失败(如文件被占用、权限不足)时不会中断整个清理脚本的运行
内容的提问来源于stack exchange,提问作者su7
相关产品推荐
相关产品推荐

