Obecnie próbuję użyć funkcji AST wprowadzonej w PowerShell 3.0, aby zmodyfikować ScriptBlock. Moim wymaganiem jest, aby wszystkie parametry w bloku parametrów skryptu ScriptBlock uzyskały atrybut [Parameter(Mandatory)]
.Modyfikacja i zakres funkcji PowerShell AST
Zasadniczo kod powinien zmodyfikować to:
Param([string]$x)
Write-Host $x
do tego:
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
Jednak wpadłem na problem podczas dodawania ten nowy atrybut, ponieważ oczekuje IScriptExtent
i nie jestem na pewno powinienem stworzyć nowy IScriptExtent
.
Jak mogę utworzyć nowy zakres skryptu? Jakie wartości mogę użyć dla pozycji? Czy muszę zmienić pozycję wszystkich poniższych zakresów?
Próbowałem ponownie wykorzystywać zakres każdego modyfikowanego przeze mnie parametru, ale niestety nie wydaje się, aby przyniósł on wyniki, które powinien (np. Gdy wywołuję ToString
zmodyfikowanego ScriptBlock
, nie widzę żadnych zmian).
Moja implementacja do tej pory oparta jest na ICustomAstVisitor
znalezionych here.
Najważniejsza metoda wygląda następująco:
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);
}
wiem co interfejs jest moje pytanie kręci się wokół mnie nie do końca jest w stanie zorientować się, jak zakresy pracy w PowerShell podczas tworzenia nowego kodu (istnieje wiele przykładów ludzi modyfikowania kodu i ponowne zasięgi, ale nie można znaleźć żadnego przykładu, w którym ludzie stworzyli nowy kod). – chrischu
@chrischu nie jest całkiem jasne z twojego pytania, że znasz interfejsy, ponieważ pytasz, jak stworzyć nowy "IScriptExtent", więc uznałem, że najlepiej jest błądzić po bezpiecznej stronie i wyjaśnić, zwłaszcza że może to być pomocne inni użytkownicy, którzy znajdą twoje pytanie, ale nie wiesz, co to jest interfejs. Możesz również rozważyć umieszczenie w swoim pytaniu tego, co dotychczas wypróbowałeś. – briantist