Question [Tutoriel] Analyse de code Powershell,Token et AST

Plus d'informations
il y a 9 ans 9 mois #17697 par Laurent Dardenne
Un tutoriel sur l'AST Powershell, sujet orienté tools maker et pas administrateur.

[edit]
GOTCHA
Le caractère Dash/Number sign est autorisé dans un nom de fonction :
[code:1]
$v=10#comment
function MyFunction {'MyFunction'; $args}
function MyFunction# {'MyFunction#'; $args}
MyFunction# {'MyFunction#'; $args}powershell-scripting.com/index.php?optio...6&catid=14#22226
MyFunction # {'MyFunction#'; $args}

new-psdrive -name 'c#' -PSProvider FileSystem -Root c:\temp
dir c#:
[/code:1]
La visu dans ISE le confirme.


[bug]
windowsserver.uservoice.com/forums/30186...actsyntaxtree-parser

StaticParameterBinder.BindCommand throws NullReferenceException when command name cannot be resolved

Message édité par: Laurent Dardenne, à: 16/08/15 13:59

Message édité par: Laurent Dardenne, à: 28/06/16 12:38<br><br>Message édité par: Laurent Dardenne, à: 23/12/17 16:15

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 7 mois #20698 par Laurent Dardenne
Corrections de 3-4 bugs.
Le plus ennuyant dans la version d'origine est que je ne parcours pas toutes les parties de l'AST en cas d'analyse de script.
Ceci est insuffisant :
[code:1]
if ($Ast.EndBlock -ne $null)
{
Write-debug \&quot;ScriptVisitor : EndBlock\&quot;
Invoke-ScriptVisitor $Ast.EndBlock.Statements $Visitor
}
[/code:1]
Et est remplacé par :
[code:1]
if ($Ast.ParamBlock -ne $null)
{
Write-debug \&quot;ScriptVisitor : ParamBlock\&quot;
Invoke-ScriptVisitor $Ast.ParamBlock $Visitor
}

if ($Ast.DynamicParamBlock -ne $null)
{
Write-debug \&quot;ScriptVisitor : DynamicParamBlock\&quot;
Invoke-ScriptVisitor $Ast.DynamicParamBlock.Statements $Visitor
}

if ($Ast.BeginBlock -ne $null)
{
Write-debug \&quot;ScriptVisitor : BeginBlock\&quot;
Invoke-ScriptVisitor $Ast.BeginBlock.Statements $Visitor
}

if ($Ast.ProcessBlock -ne $null)
{
Write-debug \&quot;ScriptVisitor : ProcessBlock\&quot;
Invoke-ScriptVisitor $Ast.ProcessBlock.Statements $Visitor
}

if ($Ast.EndBlock -ne $null)
{
Write-debug \&quot;ScriptVisitor : EndBlock\&quot;
Invoke-ScriptVisitor $Ast.EndBlock.Statements $Visitor
}
[/code:1]
Désormais :
-les noms de chemins sont testés sur -LiteralPath,
-la méthode Invoke-Visitors crée la variable $Global:ErrorAstVisitors à chaque appel,
- et enfin l'énumération automatique de membre pose pb sur une collections vide :
[code:1]
$isCollection=isCollection $AST
#Gotcha : Member Enumeration
# évite l'erreur : '... ne contient pas de méthode nommée «Visit».'
if ($isCollection -and ($AST.Count -eq 0))
{ return }
$AST.Visit($Visitor)
[/code:1]

En passant la version 5 de PS, propose de nouveaux visiteurs pour les classes:
[code:1]
public interface ICustomAstVisitor2 : ICustomAstVisitor
{
object VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst);

object VisitPropertyMember(PropertyMemberAst propertyMemberAst);

object VisitFunctionMember(FunctionMemberAst functionMemberAst);

object VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst);

object VisitUsingStatement(UsingStatementAst usingStatement);

object VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst);

object VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordAst);
}
[/code:1]
Ainsi que les tokens suivants :

Assembly
Base
Colon
Command
Enum
Hidden
Interface
Module
Namespace
Private
Public
Static
Type

A voir si l'adaptation dynamique v4/v5 est possible ...

La pièce jointe ExploreAST.zip est absente ou indisponible


Tutoriels PowerShell
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 6 mois #22226 par Laurent Dardenne
Projet de refonte de la fonction 'Test-LocalizedDataPSV3.ps1' livrée avec les sources du tutoriel.
La nouvelle version permet de gérer le cas où les déclarations de clés de localisation se trouvent dans plusieurs fichiers.<br><br>Message édité par: Laurent Dardenne, à: 1/09/16 19:24

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.128 secondes
Propulsé par Kunena