Question [Fonction] Contrôle de mot clés VB dans 1 workflow

Plus d'informations
il y a 9 ans 2 mois #18700 par Laurent Dardenne
Voici une fonction contrôlant la présence de mot clés VB dans le code d'un Workflow afin d'éviter ce bug lors de son exécution :
[code:1]Function Test-WFVBKeywords {
#from msdn.microsoft.com/en-us/library/dd409611.aspx (vs 2013)
#PS v3& v4, bug MSConnect : connect.microsoft.com/PowerShell/Feedback/Details/735357
Param(
[ValidateNotNull()]
[Parameter(Mandatory=$true,ValueFromPipeline = $true)]
[string] $Code
)
begin {
$VbKeywords=@'
AddHandler
AddressOf
Alias
And
AndAlso
As
Boolean
ByRef
Byte
ByVal
Call
Case
Catch
CBool
CByte
CChar
CDate
CDbl
CDec
Char
CInt
Class
CLng
CObj
Const
Continue
CSByte
CShort
CSng
CStr
CType
CUInt
CULng
CUShort
Date
Decimal
Declare
Default
Delegate
Dim
DirectCast
Do
Double
Each
Else
ElseIf
End
EndIf
Enum
Erase
Event
Exit
Finally
For
Friend
Function
Get
GetType
GetXMLNamespace
Global
GoSub
GoTo
Handles
If
If()
Implements
Imports
In
Inherits
Integer
Interface
Is
IsNot
Let
Lib
Like
Long
Loop
Me
Mod
Module
MustInherit
MustOverride
MyBase
MyClass
Namespace
Narrowing
New
Next
Not
Nothing
NotInheritable
NotOverridable
Object
Of
On
Operator
Option
Optional
Or
OrElse
Out
Overloads
Overridable
Overrides
ParamArray
Partial
Private
Property
Protected
Public
RaiseEvent
ReadOnly
ReDim
REM
RemoveHandler
Resume
Return
SByte
Select
Set
Shadows
Shared
Short
Single
Static
Step
Stop
String
Structure
Sub
SyncLock
Then
Throw
To
Try
TryCast
TypeOf
UInteger
ULong
UShort
Using
Variant
Wend
When
While
Widening
With
WithEvents
WriteOnly
Xor
#Const
#Else
#ElseIf
#End
#If
'@ -split \"`n\"

#Collisions de mot clés entre le VB et PS
#'True' et 'False' sont en R/O
#et l'usage de 'Error' est invalidé par le parseur : VariableNotSupportedInWorkflow
$Except=@('True','False','Error')
}#begin

process {
#Test des collisions de nom de variable
# $VbKeywords|% {New-Variable -Name $_ -Value 10 -Description 'VB keyword'}
# $T=Dir Variable:*|Where {$_.Description -eq 'VB keyword'}|Select -ExpandProperty Name
# Compare-Object $t $VbKeywords -IncludeEqual

$ErrorsList=$TokensList=$null
$Ast=[System.Management.Automation.Language.Parser]::«»ParseInput($Code,[ref]$TokensList,[ref]$ErrorsList)

#La présence de mot clés VB dans le bloc Param ne provoque pas d'erreur d'exécution du Workflow
$Functor= {
($Args[0] -is [System.Management.Automation.Language.VariableExpressionAst]) -or
($Args[0] -is [System.Management.Automation.Language.SwitchStatementAst]) -and
($Args[0].Parent.Parent -isnot [System.Management.Automation.Language.ParamBlockAst])

}
$Result=@(
$Ast.FindAll($Functor, $true) |
Where {
#Split-VariablePath
($_.VariablePath.UserPath -Replace '^(.*):«»(.*)$','$2') -in $VbKeywords
}|
Foreach {
Write-Verbose $_
Write-output $_
}
)
Return ($Result.Count -eq 0)
}#process
}#Test-WFVBKeywords
[/code:1]
Un exemple de code contenant des noms de variable identiques aux mot clés du VB .Net :
[code:1]
$Code=@'
Workflow Test {
param (
[String[]] $Handles,
[switch] $Explicit
)
$In=10 #usage impossible, car 'In' est un mot clé du VB
$Return=$Input
Write-Output $Handles #usage possible, car $Handles est un paramètre
Write-Output $Variant
$Text='Unreserved Keyword' #usage possible, car 'Distinct' ne pose pas de pb ici.
$Distinct='Unreserved Keyword'
}
'@
Test-WFVBKeywords -code $Code
#True
[/code:1]
Un exemple de code contenant des noms de variable identiques aux mot clés du VB .Net, mais uniquement dans la clause Param :
[code:1]
$Code=@'
Workflow Test {
param (
[String[]] $Handles,
[switch] $Explicit
)
Write-Warning 'ok'
}
'@
Test-WFVBKeywords -code $Code
#False
[/code:1]
A insérer dans une tâche PSake de contrôle de livraison.<br><br>Message édité par: Laurent Dardenne, à: 31/12/14 14:53

Tutoriels PowerShell

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

Plus d'informations
il y a 9 ans 1 mois #18980 par Laurent Dardenne
Une nouvelle version corrigeant les limites et erreurs de la précédente.
Une variable (ou un paramètre) dont le nom est identique à un mot-clé du VB.Net est autorisé dans une fonction ou un bloc InlineScript.
Seule son affectation déclenchera une exception à l'exécution.

Voir les exemples de la documentation.

La pièce jointe Test_VariableNamedWithVBKeywords.ps1 est absente ou indisponible

<br><br>Message édité par: Laurent Dardenne, à: 9/02/15 15:25

Tutoriels PowerShell

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

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