【问题标题】:Exit PowerShell if Remove-Item fails如果 Remove-Item 失败,则退出 PowerShell
【发布时间】:2018-07-14 08:40:28
【问题描述】:

我有这样的命令

dir "D:\BA1\xml-data\build-dir" -Directory | Where LastAccessTime -lt  (Get-Date).AddDays(-22)  | Remove-Item -Recurse

删除旧文件夹。大多数时候它都有效。但是有时这些文件夹包含隐藏文件和此作业日志。 “您没有足够的访问权限来执行此操作。”

我不知道的是:

如果该命令无法删除至少一项,如何使整个作业失败(将错误代码设置为 1 并退出)。

【问题讨论】:

  • 请提供有关所需行为的更多详细信息。如果至少可以删除一个子文件夹,您是否希望退出代码为 0?子文件夹中的任何项目?您是否希望在出现错误时继续删除(尽可能多地删除项目)?还是要在第一个错误后退出?
  • 如果出现任何问题,预期的行为会失败,以便管理员收到通知并进行调查。

标签: powershell error-handling


【解决方案1】:

Your own answer 存在问题,因为它在 first 错误处退出,其中:

  • 之前可能已经成功删除了任意数量
  • 还可能留下任意数量的可移动目录和/或不可移动文件夹。

相反,最好让Remove-Item 处理完所有目录,只留下不可删除的目录,然后判断是否发生错误之后

# Let the command run to completion and collect errors in $removalErrors.
dir "D:\BA1\xml-data\build-dir" -Directory |
  Where LastAccessTime -lt  (Get-Date).AddDays(-22) |
    Remove-Item -Recurse -ErrorVariable removalErrors

# Exit with -1, if at least 1 error occurred, and with 0 otherwise.
exit (0, -1)[$removalErrors.Count -gt 0]

-ErrorVariable removalErrors 使用-ErrorVariable 通用参数收集Remove-Item 在变量$removalErrors 中遇到的所有非终止错误。请注意变量的名称必须在没有$ 的情况下传递给参数。

这有一个额外的好处,您可以检查$removalErrors 以了解与发生的特定路径相关的特定错误。

【讨论】:

    【解决方案2】:

    当然是在发布问题答案之后。

    为了解决我的问题,我需要使用 add -ErrorAction Stop 标志并用 try catch 包装它

    try{
        dir "D:\BA1\xml-data\build-dir" -Directory | Where LastAccessTime -lt  (Get-Date).AddDays(-22)  | Remove-Item -Recurse -ErrorAction Stop
    }
    catch 
    {
        exit -1
    }
    

    【讨论】:

    • 这会删除一些项目,然后当它发现无法删除的项目时,停止吗?你需要失败或失败吗?
    • 请注意,此代码不会执行您在问题中描述的内容。如果至少有一个删除失败,它将退出并返回状态码 -1,即使一个或多个删除已经成功。
    • 嗨,是的,很抱歉没有正确地描述它。核心思想是,如果至少一件事失败,我不在乎什么会被删除。无论如何,系统管理员都必须看看这个。所以我不需要继续这项工作,因为无论如何它都必须重新运行。
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多