约 2248 字

约 11 分钟

#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 只能发现静态问题,无法替代运行时测试。
  • 部分规则带有主观性,应结合项目规范调整,而不是盲目禁用。
  • 自动修复只适用于少数规则,修改后仍需运行测试。
  • 设置文件和内置规则集可能随版本变化,升级后应重新检查结果。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2