我目前正在嘗試使用PowerShell 3.0中引入的AST功能來修改ScriptBlock。我的要求是,ScriptBlock的參數塊中的所有參數都獲得[Parameter(Mandatory)]
屬性。PowerShell AST修改和範圍
基本上代碼應該修改此:
Param([string]$x)
Write-Host $x
這樣:
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
但是,我補充說,新的屬性的時候,因爲它期望的IScriptExtent
遇到了一個問題,我不當然,我應該如何創建一個新的IScriptExtent
。
如何創建新的腳本範圍?我可以使用什麼值作爲職位?我是否必須改變以下所有程度的位置?
我試圖重新使用我修改的每個參數的範圍,但不幸的是,這似乎並沒有產生它應該的結果(例如,當我在修改的ScriptBlock
上調用ToString
時,我沒有看到任何更改)。
我到目前爲止的實現是基於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);
}
我知道的接口是什麼,我的問題圍繞在我身邊不太能夠弄清楚創造新的代碼時,範圍在PowerShell中的工作方式(有很多人修改代碼和重用程度的例子,但我找不到任何人創建新代碼的例子)。 – chrischu
@chrischu從你的問題來看,你不太清楚你是否熟悉界面,因爲你問了如何創建一個新的'IScriptExtent',所以我覺得最好在安全的方面犯錯並解釋,特別是因爲它可能對你有幫助其他訪問者發現你的問題,但不知道接口是什麼。你也可以考慮在你的問題中包括你到目前爲止所嘗試的內容。 – briantist