如何使用 PowerShell cmdlet 对 PowerShell 脚本文件进行完整语法检查

Azh*_*har 4 validation powershell syntax-checking powershell-cmdlet

我正在编写一个控制台应用程序来验证 PowerShell 脚本语法。我的请求是验证 PowerShell 脚本而不执行该脚本。我在下面的 PowerShell 命令中发现了这个命令,它可以在不执行脚本的情况下执行语法检查。

Get-Command -syntax 'D:\powershell\deleteDemoFile.ps1'
Run Code Online (Sandbox Code Playgroud)

但是,我发现它没有进行完整的语法检查。例如,在 PowerShell 中使用变量而未声明,或者变量在(Function、if、ForEach 等)中存在拼写错误,上述命令不会捕获此类语法错误。

下面是 PowerShell 脚本文件 (.\deleteDemoFile.ps1) 的示例代码。请注意,下面的代码中 (if, Function) 的拼写错误,并且使用了变量“$log_dir”但未声明。

当我运行 PowerShell 命令时,Get-Command -syntax 'D:\powershell\deleteDemoFile.ps1'该命令不会引发任何语法错误。

Write-Host "Hello, World!"

ifTypo(-not (test-path -path $log_dir )) {
   new-item -itemtype directory -path $log_dir
}


FunctionTypo log {
   Param ([string]$log_string)
   write-host $log_string
   add-content $log_file -value $log_string
}

log("Deleting a demo txt file")

# PowerShell -WhatIf safety parameter
Clear-Host
Get-Childitem D:\powershell\SomeFile\demo.txt -Recurse | Remove-Item
Run Code Online (Sandbox Code Playgroud)

所以我想知道。

  • 此 PowerShell 命令进行语法检查的效率如何?
  • 它是否仅验证 PowerShell cmdlet、函数和别名的语法?
  • 此命令与哪个版本的 PowerShell 脚本兼容?

还有其他命令可以执行完整的语法检查吗?

以下是PowerShell命令的参考:/sf/answers/3873647711/

mkl*_*nt0 5

Get-Command请注意, 's switch的目的-Syntax是显示命令的语法图,即显示其参数及其类型,即如何调用它

由于发现脚本的此信息需要解析它们,因此作为副作用,您确实会检测到语法错误[1]Get-Command然后调用失败并报告遇到的特定语法错误)。

但是,您的示例脚本不包含语法错误:虽然它在执行时不会执行您想要的操作,但它在语法上是有效的

  • ifTypoFunctionTypo被解释为命令名称,而不是拼写错误的关键字

    • 因此,例如,当尝试调用名为 的命令(cmdlet、函数、脚本、别名、可执行文件)时,您只会在执行时看到问题。ifTypo
  • 有关PowerShell 的两种基本解析模式:参数模式(如 shell)和表达式模式(如编程语言)的信息,请参阅概念性about_Parsing帮助主题。


iRon建议的 cmdlet(可以安装的模块的一部分)也Invoke-ScriptAnalyzerPSScriptAnalyzer在Visual Studio Code 的 PowerShell 扩展中进行设计时分析,也许能够指出潜在的其他问题,但在当前的情况下它不会(它只警告不要在脚本中使用)。Install-Module PSScriptAnalyzerWrite-Host


笔记:

  • PowerShell 的两种解析模式总是相当于相当宽松的语法,而且一般来说,动态语言中的静态分析只能做这么多。

  • 现有功能无法检测脚本的问题;一个潜在的解决方案是通过在项目的 GitHub 存储库中提出问题来要求添加用于标记潜在关键字拼写错误的新规则,但请注意,此类规则最终只是猜测,因为看起来拼写错误的关键字可能是合法的命令名称。Invoke-ScriptAnalyzer


[1] 实际上,Get-Command -Syntax这是间接调用官方 PowerShell 解析器以查找语法错误的便捷捷径,这需要付出更多努力 - 请参阅此答案