[英]Write-Error doesn't result useful information when used inside class methods | Powershell
I used a method with and without a class and the Write-Error seems to produce different outputs.我使用了有和没有 class 的方法,Write-Error 似乎产生了不同的输出。 In case of class, it doesn't specify the function and the line number is always 1,1
对于 class,它不指定function,行号始终为 1,1
function oper1() {
Try {
[string] $cmd = ".\some_exe_which_does_not_exist.exe"
iex $cmd
}
Catch {
Write-Error $_.Exception.Message
}
}
oper1
Output for above: Output 以上:
oper1 : The term '.\some_exe_which_does_not_exist.exe' is not recognized as the name of a cmdlet, function, script file, or operable program.
oper1 :术语“.\some_exe_which_does_not_exist.exe”未被识别为 cmdlet、function、脚本文件或可运行程序的名称。 Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。 At F:\debug\encryption_concat_tests\Untitled1.ps1: 11 char:1 + oper1 + ~~~~~ + CategoryInfo: NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId: Microsoft.PowerShell.Commands.WriteErrorException,oper1
在 F:\debug\encryption_concat_tests\Untitled1.ps1: 11 char:1 + oper1 + ~~~~~ + CategoryInfo: NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId: Microsoft.PowerShell.Commands.WriteErrorException,操作员1
When I enclosed the same function in a class, I got this:当我将相同的 function 包含在 class 中时,我得到了这个:
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()
The term '.\some_exe_which_does_not_exist.exe' is not recognized as the name of a cmdlet, function, script file, or operable program.
术语“.\some_exe_which_does_not_exist.exe”未被识别为 cmdlet、function、脚本文件或可运行程序的名称。 Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。 At line:1 char:1 + F:\debug\encryption_concat_tests\Untitled1.ps1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId: Microsoft.PowerShell.Commands.WriteErrorException
在第 1 行 char:1 + F:\debug\encryption_concat_tests\Untitled1.ps1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId: Microsoft.PowerShell.Commands.WriteErrorException
What could be the reason for this behaviour for methods inside classes?类内方法出现这种行为的原因可能是什么?
As an aside: Invoke-Expression
( iex
) should generally be avoided ; iex
: 通常应该避免Invoke-Expression
( iex
) ; definitely don't use it to invoke an external program - just invoke it directly , as shown below.绝对不要用它来调用外部程序-只需调用它直接,如下图所示。
In PowerShell class methods:在 PowerShell 类方法中:
Do not use Write-Error
, as classes are not designed to emit non-terminating errors.不要使用
Write-Error
,因为类不是为了发出非终止错误而设计的。
[void]
- see this GitHub issue .[void]
- 请参阅此 GitHub 问题。 Instead, communicate errors solely by throwing them with the Throw
statement or by not catching terminating errors (which include exceptions from .NET methods and cmdlet calls with -ErrorAction Stop
).相反,仅仅通过投掷他们沟通错误
Throw
陈述或者不要再追终止错误(包括从.NET方法,并与小命令调用例外-ErrorAction Stop
)。
Throw
and -ErrorAction Stop
(or $ErrorActionPreference = 'Stop'
) create script -terminating (thread-terminating) errors, whereas exceptions thrown by a .NET method (not caught and re-thrown in the class method) only create statement -terminating errors;Throw
和-ErrorAction Stop
(或$ErrorActionPreference = 'Stop'
)创建脚本终止(线程终止)错误,而 .NET 方法抛出的异常(未在类方法中捕获并重新抛出)仅创建语句- 终止错误; that is, while the class-method body is terminated right away, execution continues in the caller by default;&
) not finding an executable, errors in expressions such as 1 / 0
, and cmdlet calls that emit statement-terminating errors (the most severe error type they can report) without their being promoted to script -terminating ones with -ErrorAction Stop
;&
)、表达式中的错误(例如1 / 0
)以及发出语句终止错误(它们可以报告的最严重的错误类型)的 cmdlet 调用而没有将它们提升为脚本-用-ErrorAction Stop
终止那些; see this GitHub docs issue for a comprehensive overview of PowerShell's complex error handling. See this answer for more information about error handling and stream-output behavior in class methods in particular.有关特别是类方法中的错误处理和流输出行为的更多信息,请参阅此答案。
Here's a corrected version of your code.这是您的代码的更正版本。
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()
I also have this problem!我也有这个问题! But I really wanted to figure out how to output information and return the desired type of information from the function!
但我真的很想弄清楚如何从函数中获取 output 信息并返回所需类型的信息! I solved the problem using
Write-Warning
我使用
Write-Warning
解决了这个问题
[bool] hidden AddUserToGroup([Microsoft.ActiveDirectory.Management.ADGroup]$group, [Microsoft.ActiveDirectory.Management.ADUser]$user)
{
try
{
Add-ADGroupMember -Server $this.server -Identity $group -Members $user;
return $true;
}
catch [System.SystemException]
{
Write-Warning $_.Exception.Message;
return $false;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.