【问题标题】:Powershell: cannot hide 'Access is denied' error on 'Remove-Item'Powershell:无法隐藏“删除项目”上的“访问被拒绝”错误
【发布时间】:2020-07-31 02:54:48
【问题描述】:

我想让Remove-Item 指令保持安静,无论是否异常。我在脚本中运行以下命令来删除证书:

Remove-Item $store\$thumbprint

如果我以本地管理员身份运行脚本,很好...它保持安静并且文件被删除。 但是,如果我以非特权用户身份运行它,我会按预期收到“拒绝访问”错误,但无论如何我都希望保持安静。

我尝试了以下方法:

$output = (Remove-Item $store\$thumbprint)
# or...
try{Remove-Item $store\$thumbprint} catch{}
# or...
Remove-Item $store\$thumbprint -ErrorAction SilentlyContinue

但我总是收到错误/异常 显示在控制台上。

【问题讨论】:

  • try{Remove-Item $store\$thumbprint -ErrorAction Stop} catch{$null = $_} 应该可以工作...
  • NB 除非-Path 是一种模式,否则此建议将起作用。如果它是一个模式并且匹配 2 个以上的项目,那么在此异常之后“剩余”项目可能不会被删除。
  • 感谢您的帮助。 @JosefZ,您可以将解决方案写为答案;它对我有用(路径在我的情况下是唯一的)。

标签: powershell exception error-handling


【解决方案1】:

默认情况下,Remove-Item 会生成一个非终止错误,它会将错误添加到$Error 变量中而不会引发异常。要查看出现非终止错误时 Windows PowerShell 会做什么,请查看 $ErrorActionPreference variable 的值(其默认值为 Continue)。

Access to the path '…' is denied 是此类非终止错误的示例,因此您可以使用 ErrorAction 参数覆盖当前命令的 $ErrorActionPreference 变量的值

Remove-Item $store\$thumbprint -ErrorAction SilentlyContinue

另一方面,$ErrorActionPreferenceErrorAction 参数不会影响 PowerShell 如何响应停止 cmdlet 处理的终止错误。因此,如果我们不确定错误是否正在终止,那么使用-ErrorAction Stop 处理Try-Catch-Finally 块的任何错误是安全的,如下所示:

try {
    Remove-Item $store\$thumbprint -ErrorAction Stop
} catch {
    ### A Catch block can include commands for tracking the error
    ###         or for recovering the expected flow of the script
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2019-01-14
    • 1970-01-01
    • 2018-04-03
    • 2012-01-17
    • 2017-07-30
    相关资源
    最近更新 更多