【问题标题】:How to handle powershell Advanced function ErrorAction parameter?如何处理powershell高级功能ErrorAction参数?
【发布时间】:2016-08-04 20:19:47
【问题描述】:

我怎样才能在我的高级函数中正确使用 ErrorAction 参数?比如我有这样的功能:

function test1 {
[CmdletBinding()]
param([string]$path = "c:\temp")

$src = Join-Path $path "src"
$dest = Join-Path $path "dest"

Copy-Item -Path $src $dest -Recurse -Verbose
write "SomeText"
}

假设源路径 $src 不存在。我正在使用 ErrorAction = Stop 执行此功能:

test1 -ea stop

我预计会引发错误,并且我将不会看到“SomeText”消息。但我明白了:

Copy-Item : Cannot find path 'C:\temp\src' because it does not exist.
At line:5 char:1
+ Copy-Item -Path $path\src $path\dest -Recurse -Verbose
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\temp\src:String) [Copy-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.CopyItemCommand

SomeText

我可以将 ErrorAction 参数添加到 test1 函数内的 Copy-Item cmdlet,但 我希望能够显式将其设置为启用/禁用错误操作行为的函数

我应该怎么做才能让它工作?

【问题讨论】:

  • 无法重现此行为。这是哪个版本的 PowerShell?如果您使用完整的参数名称(test1 -ErrorAction Stop)会有所不同吗?
  • 同样,无法在 PowerShell 5 中重现。
  • 我发现没有 Verbose 参数添加到 Copy-Item 它工作正常(在错误后立即停止)。但是使用 Verbose 参数它不起作用。 PowerShell v.5
  • 嗯,明确的偏好变量必须防止自动传递......很有帮助。很好的收获。

标签: powershell error-handling


【解决方案1】:

您需要使用$PSBoundParameters 和alos check $ErrorActionPreference

function test1 {
    [CmdletBinding()]
    param([string]$path = "c:\temp")

    $src = Join-Path $path "src"
    $dest = Join-Path $path "dest"

    $errorAction = $PSBoundParameters["ErrorAction"]
    if(-not $errorAction){
        $errorAction = $ErrorActionPreference
    }


    Copy-Item -Path $src $dest -Recurse -Verbose -ErrorAction $errorAction
    write "SomeText"
}

$ErrorActionPreference = 'Stop'
test1

$ErrorActionPreference = 'continue'
test1 -ErrorAction Stop

【讨论】:

    【解决方案2】:

    我建议您改为为输入参数放置验证事件,如下所示:

    param([ValidateScript({Test-Path $_})][string]$path = "c:\temp")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多