我目前正在尝试使用PowerShell 3.0中引入的AST功能来修改ScriptBlock。我的要求是ScriptBlock参数块中的所有参数都要添加[Parameter(Mandatory)]属性。
基本上,代码应该修改为:
然而,当我添加新属性时遇到了一个问题,因为它需要一个
我应该如何创建一个新的脚本范围?可以使用哪些位置值?我是否需要更改所有后续范围的位置?
我尝试只重用我修改的每个参数的范围,但不幸的是,这似乎没有产生应有的结果(例如,当我在修改后的
到目前为止,我的实现基于这里找到的
最重要的方法看起来像这样:
基本上,代码应该修改为:
Param([string]$x)
Write-Host $x
转换为:
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
然而,当我添加新属性时遇到了一个问题,因为它需要一个
IScriptExtent
,而我不确定应该如何创建一个新的IScriptExtent
。我应该如何创建一个新的脚本范围?可以使用哪些位置值?我是否需要更改所有后续范围的位置?
我尝试只重用我修改的每个参数的范围,但不幸的是,这似乎没有产生应有的结果(例如,当我在修改后的
ScriptBlock
上调用ToString
时,我看不到任何变化)。到目前为止,我的实现基于这里找到的
ICustomAstVisitor
。最重要的方法看起来像这样:
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);
}
IScriptExtent
,所以我认为最好保险起见解释一下,特别是对于那些发现你的问题但不知道什么是接口的其他访问者可能会有帮助。你也可以考虑在你的问题中包含你已经尝试过什么。 - briantist