2017-10-19 58 views
0

Je souhaite utiliser la méthode ParseInput de la classe Language.Parser pour obtenir tous les jetons d'un script. Le problème est tant que je n'ai aucun commentaire dans le script cela fonctionne bien mais quand j'ajoute un commentaire, il arrête d'analyser plus loin. En fait, il me donne tout le commentaire et toutes les lignes qui suivent les commentaires comme le dernier jeton. Si vous testez le code, vous voyez que le i change en fonction de l'endroit où vous placez un commentaire dans un script. J'ai utilisé un code de test placé dans test.ps1, testé avec différents codes se comportant toujours de la même manière.ParseInput modifie les jetons out en fonction des commentaires du script

$ParsedScriptContent = [System.Management.Automation.Language.Parser]::ParseInput((Get-Content .\test.ps1), [ref]$ParserTokens, [ref]$null) 

$i = 0 

$ParserTokens | foreach{ 

    if($_){ 

     $i++ 
    } 
} 

Write-Host $i 

Répondre

1

Utilisation:

System.Management.Automation.PSParser]::Tokenize((Get-Content C:\Script.ps1),[ref]$null) | %{$_} 

pour votre Powershell Tokenize

Si vous souhaitez utiliser [System.Management.Automation.Language.Parser] et tirer d'un changement de script basé sur des fichiers ParseInput à ParseFile

$ParsedScriptContent = [System.Management.Automation.Language.Parser]::ParseFile("C:\Test.ps1", [ref]$ParserTokens, [ref]$null) 
$ParserTokens | ForEach-Object{$_} 

Si vous utilisez ParseInput alors vous devriez tirer en ligne comme

[email protected]' 
$a = 1;$b = 2 
#hello 
$c = $a + $b;$c 
'@ 
$ParserTokens = $null 
$ParsedScriptContent = [System.Management.Automation.Language.Parser]::ParseInput($script, [ref]$ParserTokens, [ref]$null) 
$ParserTokens | ForEach-Object{$_} 
+0

Merci! J'ai décidé d'utiliser les deux méthodes pour analyser le script. Le Tokenize retourne PSToken tandis que ParseFile renvoie Token. Théoriquement, les deux devraient avoir les mêmes propriétés mais c'est différent. –