我有以下用C#编写的cmdlet,它基本上只会抛出一个错误:
http://www.example.com/example.html
我假设(我可能错了),这在PowerShell中是等效的)
[Cmdlet("Use", "Dummy")]
public class UseDummyCmdlet :PSCmdlet
{
protected override void ProcessRecord()
{
var errorRecord = new ErrorRecord(new Exception("Something Happened"), "SomethingHappened", ErrorCategory.CloseError, null);
ThrowTerminatingError(errorRecord);
}
}
PowerShell版本的行为符合预期:
Function Use-Dummy()
{
[CmdletBinding()]
Param()
process
{
$errorRecord = New-Object System.Management.Automation.ErrorRecord -ArgumentList (New-Object System.Exception), 'SomethingHappened', 'NotSpecified', $null
$PSCmdlet.ThrowTerminatingError($errorRecord)
}
}
然而,C#版本崩溃了,其中包含以下信息:
Use-Dummy : Exception of type 'System.Exception' was thrown.
At line:1 char:10
+ use-dummy <<<<
+ CategoryInfo : NotSpecified: (:) [Use-Dummy], Exception
+ FullyQualifiedErrorId : SomethingHappened,Use-Dummy
我做错了什么?
答案 0 :(得分:1)
可以证实,这是一个环境问题,而且是一个该死的奇怪的人。
基本上,如果您按照here说明操作,那么请调试任何二进制模块,如果您致电ThrowTerminatingError
,它会与PipelineStoppedException
崩溃。
现在我需要某种修复/解决方法。
编辑:找到修复程序,检查项目属性中的“启用本机代码调试”。
答案 1 :(得分:1)
只需将ThrowTerminateError(errorRecord)包装到try块中,如下所示。
[Cmdlet("Use", "Dummy")]
public class UseDummyCmdlet :PSCmdlet
{
protected override void ProcessRecord()
{
var errorRecord = new ErrorRecord(new Exception("Something Happened"), "SomethingHappened", ErrorCategory.CloseError, null);
try
{
ThrowTerminatingError(errorRecord);
}
catch (PipelineStoppedException ex)
{}
}
}