如何从 Remove-Item 中捕获错误并发出警告?

Pac*_*ac0 3 error-handling powershell azure-devops

在持续集成管道 (Azure DevOps) 中使用的部署后脚本中,我正在删除旧文件。

基本上,它是一个 PowerShell 脚本,可删除部署目录中的除当前文件夹之外的所有发布文件夹。

有时,Remove-Item 由于某种原因而失败(例如,旧文件仍由部署机器上的某个人打开)

没什么大不了的。我不希望出现错误,说我的整个部署因此而失败。但是,我想要一个警告,所以我知道它发生了。

例如(MCVE):

Remove-Item INEXISTENT_FILE
Run Code Online (Sandbox Code Playgroud)

问题:它会导致错误。


尝试 1:

Remove-Item INEXISTENT_FILE -ErrorAction SilentlyContinue
Run Code Online (Sandbox Code Playgroud)

问题:它完全消除了错误,这不是我想要的(我想要一个警告)


尝试 2:我尝试按照此处的建议使用 ErrorVariable:https ://devblogs.microsoft.com/powershell/erroraction-and-errorvariable/

Remove-Item INEXISTENT_FILE -ErrorAction SilentlyContinue -ErrorVariable $removeItemError
if ($removeItemError) {
    Write-Warning "Warning, something failed!"
}
Run Code Online (Sandbox Code Playgroud)

问题:它不起作用,它不显示if零件。如果我删除“SilentlyContinue”错误操作,它只会发出一个错误,并且在任何情况下都不会进入该if部分。


尝试 3:我也尝试使用此处建议的 Try Catch 块:PowerShell -ErrorAction SilentlyContinue 不适用于 Get-ADUser

Try {
    Remove-Item INEXISTENT_FILE
}
Catch {
    Write-Warning "Warning, something failed!"
}
Run Code Online (Sandbox Code Playgroud)

问题:它也永远不会进入 catch 块(!?)


如果 Remove-Item 失败,任何人都有另一种选择来显示警告而不是错误?

box*_*dog 10

产生的错误Remove-Item被认为是“非终止”,这意味着它被“try/catch”忽略。要强制它变为“可见”以“尝试/捕获”,请使用以下ErrorAction参数:

Remove-Item INEXISTENT_FILE -ErrorAction Stop

或者,您可以在脚本级别(即对于所有后续命令)进行更改,如下所示:

$ErrorActionPreference = 'Stop'

可以使用$_.Exception.Message或检索错误消息$error[0]