Ich versuche derzeit, die AST-Funktionalität zu verwenden, die in PowerShell 3.0 eingeführt wird, um einen ScriptBlock zu ändern. Meine Voraussetzung ist, dass alle Parameter im Parameterblock des ScriptBlocks ein [Parameter(Mandatory)]
Attribut erhalten.PowerShell AST-Änderung und Extents
Grundsätzlich sollte der Code dies ändern:
Param([string]$x)
Write-Host $x
dazu:
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
Allerdings habe ich ein Problem lief, wenn das neue Attribut hinzufügen, da es eine IScriptExtent
erwartet und ich bin nicht sicher wie ich ein neues IScriptExtent
erstellen soll.
Wie kann ich einen neuen Skriptumfang erstellen? Welche Werte kann ich für die Position verwenden? Muss ich die Position aller folgenden Extents ändern?
Ich versuchte, nur das Ausmaß jedes Parameters, den ich verändere, wiederzuverwenden, aber leider scheint dies nicht zu den Ergebnissen zu führen, die es sollte (z.B. wenn ich ToString
auf dem modifizierten ScriptBlock
aufrufen sehe ich keine Änderungen).
Meine bisherige Implementierung basiert auf der ICustomAstVisitor
gefunden here.
Die wichtigste Methode sieht wie folgt aus:
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);
}
Ich weiß, was eine Schnittstelle ist, dreht ich meine Frage um mich nicht ganz in der Lage sein, herauszufinden, wie Ausdehnungen in Powershell arbeiten, wenn neuen Code zu schaffen (es Ausdehnungen viele Beispiele von Menschen, Code zu modifizieren und Wiederverwendung ist, aber ich konnte kein Beispiel finden, wo Leute neuen Code erstellt haben). – chrischu
@chruschu Es ist nicht ganz klar aus deiner Frage, dass du mit Interfaces vertraut bist, da du fragst, wie man einen neuen 'IScriptExtent' erstellt, also war es das Beste, auf der sicheren Seite zu bleiben und zu erklären, besonders da es hilfreich sein kann andere Besucher, die Ihre Frage finden, aber nicht wissen, was eine Schnittstelle ist. Sie könnten auch in Ihre Frage einbeziehen, was Sie bisher versucht haben. – briantist