Question [Tutoriel] Analyse de code Powershell,Token et AST
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6298
- Remerciements reçus 68
il y a 9 ans 5 mois #17697
par Laurent Dardenne
Tutoriels PowerShell
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
[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.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6298
- Remerciements reçus 68
il y a 8 ans 3 mois #20698
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Tutoriel] Analyse de code Powershell,Token et AST
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 \"ScriptVisitor : EndBlock\"
Invoke-ScriptVisitor $Ast.EndBlock.Statements $Visitor
}
[/code:1]
Et est remplacé par :
[code:1]
if ($Ast.ParamBlock -ne $null)
{
Write-debug \"ScriptVisitor : ParamBlock\"
Invoke-ScriptVisitor $Ast.ParamBlock $Visitor
}
if ($Ast.DynamicParamBlock -ne $null)
{
Write-debug \"ScriptVisitor : DynamicParamBlock\"
Invoke-ScriptVisitor $Ast.DynamicParamBlock.Statements $Visitor
}
if ($Ast.BeginBlock -ne $null)
{
Write-debug \"ScriptVisitor : BeginBlock\"
Invoke-ScriptVisitor $Ast.BeginBlock.Statements $Visitor
}
if ($Ast.ProcessBlock -ne $null)
{
Write-debug \"ScriptVisitor : ProcessBlock\"
Invoke-ScriptVisitor $Ast.ProcessBlock.Statements $Visitor
}
if ($Ast.EndBlock -ne $null)
{
Write-debug \"ScriptVisitor : EndBlock\"
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 :
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 \"ScriptVisitor : EndBlock\"
Invoke-ScriptVisitor $Ast.EndBlock.Statements $Visitor
}
[/code:1]
Et est remplacé par :
[code:1]
if ($Ast.ParamBlock -ne $null)
{
Write-debug \"ScriptVisitor : ParamBlock\"
Invoke-ScriptVisitor $Ast.ParamBlock $Visitor
}
if ($Ast.DynamicParamBlock -ne $null)
{
Write-debug \"ScriptVisitor : DynamicParamBlock\"
Invoke-ScriptVisitor $Ast.DynamicParamBlock.Statements $Visitor
}
if ($Ast.BeginBlock -ne $null)
{
Write-debug \"ScriptVisitor : BeginBlock\"
Invoke-ScriptVisitor $Ast.BeginBlock.Statements $Visitor
}
if ($Ast.ProcessBlock -ne $null)
{
Write-debug \"ScriptVisitor : ProcessBlock\"
Invoke-ScriptVisitor $Ast.ProcessBlock.Statements $Visitor
}
if ($Ast.EndBlock -ne $null)
{
Write-debug \"ScriptVisitor : EndBlock\"
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 :
A voir si l'adaptation dynamique v4/v5 est possible ...Assembly
Base
Colon
Command
Enum
Hidden
Interface
Module
Namespace
Private
Public
Static
Type
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.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6298
- Remerciements reçus 68
il y a 7 ans 3 mois #22226
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Tutoriel] Analyse de code Powershell,Token et AST
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
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.059 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- [Tutoriel] Analyse de code Powershell,Token et AST