如果Remove-Item失败,则退出PowerShell

时间:2018-07-14 08:40:29

标签: powershell error-handling

我有这样的命令

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

删除旧文件夹。在大多数情况下,它都有效。但是,有时这些文件夹包含隐藏文件,并且此作业会记录日志。 “您没有足够的访问权限来执行此操作。” <-这是有意的。

我不知道的是:

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

2 个答案:

答案 0 :(得分:2)

Your own answer有问题,因为它在 first 错误时退出,该错误是:

  • 之前可能有任意数量的成功删除
  • ,并且可能还会留下任何数量的可移动目录和/或不可移动文件夹。

相反,最好让Remove-Item完成对 all 目录的处理,只保留不可移动的目录,并确定之后是否发生错误

# 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以确定与发生的特定路径有关的特定错误。

答案 1 :(得分:1)

当然,在发布问题后,答案就刚刚出现。

要解决我的问题,我需要使用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
}