2017-10-19 42 views
0

我想使用Language.Parser類的ParseInput方法從腳本獲取所有令牌。 問題是,只要我沒有在腳本中的任何評論,它的工作正常,但當我添加評論停止進一步解析。實際上,它將整個評論和評論後面的所有行作爲最後一個標記。 如果您測試代碼,您會看到我正在根據您在腳本中放置註釋的位置進行更改。 我已經使用了test.ps1中的測試代碼,使用不同代碼測試的代碼仍然表現相同。ParseInput根據腳本中的註釋更改出令牌

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

$i = 0 

$ParserTokens | foreach{ 

    if($_){ 

     $i++ 
    } 
} 

Write-Host $i 

回答

1

用途:

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

您Powershell的記號化

如果你想使用[System.Management.Automation.Language.Parser]和基於文件的腳本改變拉ParseInputParseFile

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

如果使用ParseInput,那麼你應該拉內嵌像

[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

謝謝!我決定使用這兩種方法來分析腳本。當ParseFile返回Token時,Tokenize返回PSToken。理論上兩者應該具有相同的屬性,但不同。 –