在类方法中使用Write-Error不会产生有用的信息| 电源外壳

潘卡·库玛(Pankaj Kumar)

我使用了带有和不带有类的方法,而Write-Error似乎会产生不同的输出。如果是类,则不指定函数,行号始终为1,1

function oper1() {
    Try {
        [string] $cmd = ".\some_exe_which_does_not_exist.exe"
        iex $cmd 
    }
    Catch {
        Write-Error $_.Exception.Message
    }
}

oper1

以上输出:

oper1:术语'。\ some_exe_which_does_not_exist.exe'不被识别为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。在F:\ debug \ encryption_concat_tests \ Untitled1.ps1:11个字符:1 + oper1 + ~~~~~ + CategoryInfo:未指定:(:) [Write-Error],WriteErrorException + FullyQualifiedErrorId:Microsoft.PowerShell.Commands.WriteErrorException,歌剧1

当我在一个类中包含相同的函数时,我得到了:

class Operator {
    [void] oper1() {
        Try {
            [string] $cmd = ".\some_exe_which_does_not_exist.exe"
            iex $cmd 
        }
        Catch {
            Write-Error $_.Exception.Message
        }
    }
}

[Operator] $operator = New-Object Operator
$operator.oper1()

术语“。\ some_exe_which_does_not_exist.exe”不能识别为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。在第1行:char:1 + F:\ debug \ encryption_concat_tests \ Untitled1.ps1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ + + CategoryInfo:未指定:(:) [Write-Error],WriteErrorException + FullyQualifiedErrorId:Microsoft.PowerShell.Commands.WriteErrorException

类内部方法的这种行为可能是什么原因?

mklement0

顺便说一句:Invoke-Expressioniex)一般应避免; 绝对不要使用它来调用外部程序-只需直接调用它,如下所示。


在PowerShell类方法中:

  • 不要使用Write-Error,因为类并非旨在发出非终止错误。

    • 您根本看不到任何输出的唯一原因是PowerShell Core 7.0.0-rc.3中的一个错误,其方法的返回类型恰好是[void]-请参见此GitHub问题
  • 相反,仅通过错误Throw语句一起抛出捕获终止错误(包括.NET方法的异常和带有的cmdlet调用-ErrorAction Stop)来传达错误

    • 注意:Throw-ErrorAction Stop(或$ErrorActionPreference = 'Stop')创建脚本终止(运行空间终止)错误,而.NET方法抛出的异常(未在类方法中捕获并重新抛出)仅创建语句终止错误;也就是说,当类方法主体立即终止时,默认情况下在调用者中继续执行;后者也适用于调用运算符(&)找不到可执行文件,表达式错误(例如1 / 0和和cmdlet调用),这些表达式发出语句终止错误(它们可以报告的最严重的错误类型),而没有被提升为脚本终止错误,-ErrorAction Stop; 看到这个GitHub文档问题 全面了解PowerShell的复杂错误处理。

请参阅此答案以获取有关特别是类方法中的错误处理和流输出行为的更多信息。

这是您的代码的更正版本。

class Operator {
    [void] oper1() {
        Try {
            # Try to invoke a non-existent executable.
            & ".\some_exe_which_does_not_exist.exe"
        }
        Catch {
            # Re-throw the error.
            # Alternatively, don't use try / catch, but the error
            # then only aborts the method call, not the entire script.
            Throw
        }
    }
}

[Operator] $operator = New-Object Operator
$operator.oper1()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章