Powershell ParseInput根据脚本中的注释更改输出标记

Powershell ParseInput根据脚本中的注释更改输出标记,powershell,parsing,tokenize,Powershell,Parsing,Tokenize,我想使用Language.Parser类的ParseInput方法从脚本中获取所有标记。 问题是,只要脚本中没有任何注释,它就可以正常工作,但当我添加注释时,它会停止进一步解析。实际上,它给出了整个注释以及注释后面的所有行作为最后一个标记。 如果您测试代码,您会看到i正在根据您在脚本中放置注释的位置进行更改。 我使用了test.ps1中的一个测试代码,使用不同的代码进行测试,这些代码的行为仍然相同 $ParsedScriptContent = [System.Management.Automat

我想使用Language.Parser类的ParseInput方法从脚本中获取所有标记。 问题是,只要脚本中没有任何注释,它就可以正常工作,但当我添加注释时,它会停止进一步解析。实际上,它给出了整个注释以及注释后面的所有行作为最后一个标记。 如果您测试代码,您会看到i正在根据您在脚本中放置注释的位置进行更改。 我使用了test.ps1中的一个测试代码,使用不同的代码进行测试,这些代码的行为仍然相同

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

$i = 0

$ParserTokens | foreach{

    if($_){

        $i++
    }
}

Write-Host $i
使用:

为您的Powershell标记化

如果要使用[System.Management.Automation.Language.Parser]并从基于文件的脚本中提取,请将ParseInput更改为ParseFile

如果使用ParseInput,那么应该像

$script=@'
$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{$_}

谢谢我决定使用这两种方法来分析脚本。Tokenize返回PSToken,而ParseFile返回Token。理论上,两者应该具有相同的属性,但不同。
$ParsedScriptContent = [System.Management.Automation.Language.Parser]::ParseFile("C:\Test.ps1", [ref]$ParserTokens, [ref]$null)
$ParserTokens | ForEach-Object{$_}
$script=@'
$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{$_}