Attualmente sto cercando di utilizzare la funzionalità AST introdotta in PowerShell 3.0 per modificare uno ScriptBlock. Il mio requisito è che tutti i parametri nel blocco parametri di ScriptBlock abbiano un attributo [Parameter(Mandatory)]
.Modifica ed estensioni AST PowerShell
In pratica il codice dovrebbe modificare questo:
Param([string]$x)
Write-Host $x
a questo:
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
Tuttavia, mi sono imbattuto in un problema quando si aggiunge che nuovo attributo, dal momento che prevede un IScriptExtent
e io non sono certo come dovrei creare un nuovo IScriptExtent
.
Come posso creare una nuova estensione di script? Quali valori posso usare per la posizione? Devo cambiare la posizione di tutte le seguenti estensioni?
Ho provato a riutilizzare l'estensione di ciascun parametro che sto modificando, ma sfortunatamente questo non sembra fornire i risultati che dovrebbe (ad esempio quando sto chiamando ToString
sul modificato non vedo alcuna modifica).
La mia implementazione fino ad ora si basa su ICustomAstVisitor
trovato here.
Il metodo più importante aspetto:
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);
}
so che cosa l'interfaccia è, la mia domanda ruota attorno a me non del tutto essere in grado di capire come estensioni funzionano in PowerShell per la creazione di un nuovo codice (ci sono molti esempi di persone modificare il codice e il riutilizzo di estensioni, ma io non è stato possibile trovare alcun esempio in cui le persone hanno creato un nuovo codice). – chrischu
@chrischu non è abbastanza chiaro dalla tua domanda che tu abbia familiarità con le interfacce dato che ti chiedi come creare un nuovo 'IScriptExtent', quindi ho ritenuto che fosse meglio errare sul lato sicuro e spiegare, soprattutto perché potrebbe essere utile altri visitatori che trovano la tua domanda ma non sanno cosa sia un'interfaccia. Potresti anche considerare di includere nella tua domanda ciò che hai provato fino ad ora. – briantist