gpt4 book ai didi

c# - 在 ProcessRecord 中停止执行 cmdlet

转载 作者:行者123 更新时间:2023-11-30 20:24:59 25 4
gpt4 key购买 nike

如何停止执行在 ProcessRecord 方法中接受管道输入的 cmdlet。如果不满足 ProcessRecord 中的条件,我需要立即停止执行并返回一个 false:

protected override void BeginProcessing()
{
_output = true;
}

protected override void ProcessRecord()
{
//processing
if(condtion == true) return;

_output = false;
//How do I stop processing now, and ensure _output is returned as result?
}

protected override void EndProcessing()
{
WriteObject(_output);
}

PipelineStoppedException 似乎有效,但没有给我确切的行为。

使用 PipelineStoppedException 更新了一个更具体的示例:

让我们考虑一个 cmdlet First-List,它的行为应该类似于 LINQ 中的 First()。此 cmdlet 的实现如下:

[Cmdlet("First", "List")]
public class FirstList : Cmdlet
{
[Parameter(Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
public object Input { get; set; }

[Parameter(Position = 0, Mandatory = true)]
public ScriptBlock ScriptBlock { get; set; }

protected override void ProcessRecord()
{
var output = ScriptBlock.InvokeWithContext(null, new List<PSVariable>
{
new PSVariable("input", Input),
})[0];

if (output.ToString() != "True") return;

WriteObject(Input);
throw new PipelineStoppedException();
}

protected override void EndProcessing()
{
Error.NoMatch();
}
}

使用 Select -First,我可以执行以下操作:

$a = 1..10 | Select -First 1
#$a is 1

但是在我的实现中:

$a = 1..10 | First-List { $input -ge 5 }
#$a should be assigned 5, but it is not

但是1..10 | First-List { $input -ge 5 } 确实输出 5。

更新 2:

看起来 Select-Object 实际上抛出了 StopUpstreamCommandsException

这里还有一个反馈 - https://connect.microsoft.com/PowerShell/feedback/details/768650/enable-users-to-stop-pipeline-making-stopupstreamcommandsexception-public

最佳答案

我通过抛出 StopUpstreamCommandsException 获得了 Select -First 的行为。但由于它在 System.Management.Automation 内部,因此必须使用反射。编写了如下所示的实用程序方法:

internal static class Error
{
private static readonly Type StopUpstreamCommandsExceptionType =
Assembly.GetAssembly(typeof (PSCmdlet))
.GetType("System.Management.Automation.StopUpstreamCommandsException");

internal static Exception StopUpstreamCommandsException(Cmdlet cmdlet)
{
var stopUpstreamCommandsException = (Exception) Activator.CreateInstance(StopUpstreamCommandsExceptionType,
BindingFlags.Default | BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public,
null,
new Object[] {(InternalCommand) cmdlet},
null
);
return stopUpstreamCommandsException;
}
}

关于c# - 在 ProcessRecord 中停止执行 cmdlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25314741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com