gpt4 book ai didi

PowerShell AST 修改和范围

转载 作者:行者123 更新时间:2023-12-04 18:34:51 29 4
gpt4 key购买 nike

我目前正在尝试使用 PowerShell 3.0 中引入的 AST 功能来修改 ScriptBlock。我的要求是ScriptBlock的参数 block 中的所有参数都得到一个[Parameter(Mandatory)]属性。

基本上代码应该修改这个:

Param([string]$x)

Write-Host $x

对此:
Param([Parameter(Mandatory)][string]$x)

Write-Host $x

但是,我在添加新属性时遇到了问题,因为它需要 IScriptExtent我不知道我应该如何创建一个新的 IScriptExtent .

如何创建新的脚本范围?我可以为该职位使用什么值?我是否必须更改所有以下范围的位置?

我尝试重用我正在修改的每个参数的范围,但不幸的是,这似乎并没有产生应有的结果(例如,当我在修改后的 ToString 上调用 ScriptBlock 时,我没有看到任何变化)。

到目前为止,我的实现是基于 ICustomAstVisitor找到 here .

最重要的方法如下所示:

public object VisitParameter(ParameterAst parameterAst)
{
var newName = VisitElement(parameterAst.Name);

var extent = // What to do here?

var mandatoryArg = new AttributeAst(extent, new ReflectionTypeName(typeof (ParameterAttribute)),
new ExpressionAst[0],
new[] {new NamedAttributeArgumentAst(extent, "Mandatory", new ConstantExpressionAst(extent, true), true)});

var newAttributes = new[] {mandatoryArg}.Concat(VisitElements(parameterAst.Attributes));
var newDefaultValue = VisitElement(parameterAst.DefaultValue);
return new ParameterAst(parameterAst.Extent, newName, newAttributes, newDefaultValue);
}

最佳答案

脚本范围主要用于错误报告,但也用于调试(例如,设置行断点。)

通常,合成脚本的选项(如您的示例)是:

  • 重用现有的 ast,可能与您要添加的 ast 接近/相关
  • 使用空 ast(基本上创建 ScriptExtent 和 ScriptPosition 的实例,没有文件,空行)
  • 创建一个合成范围,以某种方式帮助调试,可能包含一些特殊内容

  • 在您的示例中,上述任何一种都是合适的。第二个选项是最简单的。第三个选项只是第二个选项的变体,但您可以将内容设置为有用的内容,例如
    <#Generated: [Parameter(Mandatory)] #>

    关于PowerShell AST 修改和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35994001/

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