#PSScriptAnalyzer
#简介
PSScriptAnalyzer 是 PowerShell 官方的静态代码分析工具,用于检查脚本和模块中的风格问题、潜在错误和安全风险。它既能用于日常开发,也能集成到 CI 流水线中,作为代码质量门禁。
#安装
Install-Module PSScriptAnalyzer -Scope CurrentUser -Force
Get-Module PSScriptAnalyzer -ListAvailable
安装后可以直接使用 Invoke-ScriptAnalyzer 命令。
#基本用法
分析单个脚本或整个目录:
Invoke-ScriptAnalyzer -Path ./scripts/Deploy.ps1
Invoke-ScriptAnalyzer -Path ./src
Invoke-ScriptAnalyzer -Path ./src -Recurse
输出通常包含规则名、严重级别、文件、行号和消息。默认分析会应用内置规则集。
#常用规则
常用规则包括 PSAvoidUsingWriteHost、PSUseApprovedVerbs、PSAvoidUsingCmdletAliases、PSAvoidUsingInvokeExpression、PSUseSingularNouns、PSAvoidGlobalVars、PSPossibleIncorrectComparisonWithNull 和 PSUseDeclaredVarsMoreThanAssignments。
这些规则覆盖常见问题,但并非所有规则都适合每个项目。例如面向交互式终端的脚本可能确实需要使用 Write-Host。
#按严重级别过滤
Invoke-ScriptAnalyzer -Path ./src -Recurse -Severity Error,Warning
-Severity 可取 Error、Warning、Information。在 CI 中通常只阻断 Error 和 Warning。
#排除规则
Invoke-ScriptAnalyzer -Path ./src -Recurse -ExcludeRule PSAvoidUsingWriteHost
需要长期忽略时,建议写入设置文件,而不是每次都传参数。
#自定义设置文件
创建 PSScriptAnalyzerSettings.psd1:
@{
Severity = @('Error', 'Warning')
ExcludeRules = @('PSAvoidUsingWriteHost')
Rules = @{
PSUseApprovedVerbs = @{
Enable = $true
}
}
}
Invoke-ScriptAnalyzer -Path ./src -Recurse `
-Settings ./PSScriptAnalyzerSettings.psd1
#在 CI 中使用
$issues = Invoke-ScriptAnalyzer -Path ./src -Recurse `
-Settings ./PSScriptAnalyzerSettings.psd1
if ($issues) {
$issues | Format-Table RuleName, Severity, ScriptName, Line, Message -AutoSize
exit 1
}
Write-Output 'PSScriptAnalyzer 检查通过'
在 GitHub Actions、Azure Pipelines 等环境中,只需确保使用 pwsh 执行该脚本即可。
#注意事项
- PSScriptAnalyzer 只能发现静态问题,无法替代运行时测试。
- 部分规则带有主观性,应结合项目规范调整,而不是盲目禁用。
- 自动修复只适用于少数规则,修改后仍需运行测试。
- 设置文件和内置规则集可能随版本变化,升级后应重新检查结果。