Pester でテストする前に構文チェックとかしたいなぁと思ったので使い方を思い出します。
Invoke-ScriptAnalyzer a.Tests.ps1
出力はこんな感じ
RuleName Severity ScriptName Line Message
-------- -------- ---------- ---- -------
UnexpectedToken ParseError a.Tests.ps 1 式またはステートメントのトークン '}' を使用できません。
1
ルールの一覧は以下のコマンドで出力できます。
Get-ScriptAnalyzerRule
ビルトインのルール一覧の機械翻訳。UnexpectedToken は無いが、当たり前のような気がするのであまり気にしない。
| RuleName | Google翻訳 |
|---|---|
| PSAlignAssignmentStatement | 代入演算子が揃うように代入ステートメントを並べます。 |
| PSAvoidUsingCmdletAliases | エイリアスは、コマンドレットまたはコマンド要素(関数、スクリプト、ファイル、実行ファイルなど)の別名またはニックネームです。暗黙的なエイリアスは、このプレフィックスを持つコマンドから「Get-」プレフィックスを省略したものでもあります。ただし、スクリプトを元の作成者または他のWindows PowerShellスクリプト作成者によって長期にわたってメンテナンスされる可能性がある場合は、エイリアスではなく完全なコマンドレット名の使用を検討してください。エイリアスは、可読性、理解性、可用性において問題を引き起こす可能性があります。 |
| PSAvoidAssignmentToAutomaticVariable | この自動変数は PowerShell に組み込まれており、読み取り専用です。 |
| PSAvoidDefaultValueSwitchParameter | スイッチパラメータはデフォルトで true に設定しないでください。 |
| PSAvoidDefaultValueForMandatoryParameter | 必須パラメータは、無視されるため、param ブロック内でデフォルト値で初期化しないでください。このルール違反を修正するには、param ブロック内で必須パラメータの値を初期化しないようにしてください。 |
| PSAvoidUsingEmptyCatchBlock | 空のcatchブロックは、tryブロック内でエラーが発生した場合、そのエラーがそのまま無視され、処理が行われないため、設計上好ましくないと考えられています。これは本質的には悪影響を及ぼしませんが、回避することは可能であり、可能であれば避けるべきです。このルール違反を修正するには、catchブロック内でWrite-Errorまたはthrowステートメントを使用してください。 |
| PSAvoidExclaimOperator | 読みやすさの観点から、否定演算子 ! は使用しないでください。代わりに -not を使用してください。 |
| PSAvoidGlobalAliases | グローバルエイリアスが使用されていないことを確認します。グローバルエイリアスは、名前の競合により必要なエイリアスを上書きしてしまうため、使用は強く推奨されません。 |
| PSAvoidGlobalFunctions | グローバル関数とエイリアスが使用されていないことを確認します。グローバル関数は、異なるシステム間でエラーを引き起こす可能性があるため、使用は強く推奨されません。 |
| PSAvoidGlobalVars | グローバル変数が使用されていないことを確認します。グローバル変数は、異なるシステム間でエラーを引き起こす可能性があるため、使用しないことを強くお勧めします。 |
| PSAvoidInvokingEmptyMembers | 定数でないメンバーを呼び出すと、潜在的なバグが発生する可能性があります。呼び出されるメンバーが定数でないことを確認するために、構文を再度確認してください。 |
| PSAvoidLongLines | 行の長さは設定された最大値より短くする必要があります |
| PSAvoidMultipleTypeAttributes | パラメータには複数の型指定子を指定できません。 |
| PSAvoidNullOrEmptyHelpMessageAttribute | HelpMessage 属性を空の文字列または null 値に設定すると、PowerShell インタープリターは対応する関数の実行中にエラーをスローします。 |
| PSAvoidOverwritingBuiltInCmdlets | PowerShellに含まれるコマンドレットの定義を上書きしないでください。 |
| PSAvoidUsingPositionalParameters | 読みやすさと明瞭さは、長期にわたって維持されるスクリプトの目標であるべきです。パラメータを取るコマンドを呼び出す際は、可能な限り、位置パラメータではなく名前パラメータの使用を検討してください。このルールに違反している場合は、コマンドを呼び出す際に位置パラメータではなく名前パラメータを使用してください。 |
| PSReservedCmdletChar | コマンドレット名に予約文字が含まれていないか確認します。これらの文字は通常、解析エラーを引き起こします。それ以外の場合は、一般的に実行時エラーを引き起こします。 |
| PSReservedParams | 関数定義内の予約パラメータをチェックします。これらのパラメータがユーザーによって定義されている場合、通常はエラーが発生します。 |
| PSAvoidSemicolonsAsLineTerminators | 行はセミコロンで終わってはいけません |
| PSAvoidShouldContinueWithoutForce | ShouldContinue を使用する関数には、ユーザーがそれをバイパスできるようにブール型の強制パラメータが必要です。 |
| PSAvoidTrailingWhitespace | 各行の末尾には空白文字があってはいけません。 |
| PSAvoidUsingUsernameAndPasswordParams | 関数は、PSCredential 型の Credential パラメーター (PowerShell 4.0 以前ではその後に Credential 変換属性が定義されている) を受け取るか、Password パラメーターを SecureString 型に設定する必要があります。 |
| PSAvoidUsingAllowUnencryptedAuthentication | 暗号化されていない接続を介して資格情報や秘密を送信することは避けてください。 |
| PSAvoidUsingBrokenHashAlgorithms | 壊れたアルゴリズム MD5 または SHA-1 の使用は避けてください。 |
| PSAvoidUsingComputerNameHardcoded | コマンドレットの ComputerName パラメータは、システムに関する機密情報が公開されるため、ハードコードしないでください。 |
| PSAvoidUsingConvertToSecureStringWithPlainText | プレーンテキストで ConvertTo-SecureString を使用すると、セキュリティ保護された情報が公開されます。 |
| PSAvoidUsingDeprecatedManifestFields | 「ModuleToProcess」は最新のPowerShellバージョンでは廃止されています。PowerShellのバージョン間の不整合を避けるため、マニフェストファイル内の最新のフィールド「RootModule」に更新してください。 |
| PSAvoidUsingDoubleQuotesForConstantString | 文字列が定数の場合は一重引用符を使用します。 |
| PSAvoidUsingInvokeExpression | Invoke-Expression コマンドレットは、指定された文字列をコマンドとして評価または実行し、式またはコマンドの結果を返します。非常に強力なため、全く使わないというわけではありませんが、使用には細心の注意が必要です。特に、データがプログラム自体からのみ取得される場合は、おそらく安全です。ユーザーから提供されるデータを含める場合は、コードインジェクションから保護する必要があります。このルール違反を修正するには、スクリプトから Invoke-Expression を削除し、代わりに他のオプションを探してください。 |
| PSAvoidUsingPlainTextForPassword | プレーンテキストを受け入れるパスワード パラメータを使用すると、パスワードが公開され、システムのセキュリティが危険にさらされることになります。 |
| PSAvoidUsingWMICmdlet | 非推奨。Windows PowerShell 3.0 以降では、これらのコマンドレットは CIM コマンドレットに置き換えられました。 |
| PSAvoidUsingWriteHost | Write-Host コマンドレットの使用は避けてください。代わりに、Write-Output、Write-Verbose、または Write-Information を使用してください。Write-Host はホスト固有であるため、実装は予期せず変化する可能性があります。また、PowerShell 5.0 より前のバージョンでは、Write-Host はストリームへの書き込みを行わなかったため、ユーザーはストリームを抑制したり、その値をキャプチャしたり、リダイレクトしたりすることはできません。 |
| PSUseCompatibleCommands | 指定された PowerShell バージョンおよびオペレーティング システムと互換性のあるコマンドを使用します。 |
| PSUseCompatibleSyntax | 指定された PowerShell バージョンと互換性のあるスクリプト構文を使用する |
| PSUseCompatibleTypes | 指定された PowerShell バージョンおよびオペレーティング システムと互換性のある型を使用する |
| PSMisleadingBacktick | エスケープされた空白文字で行末に記述するのは誤解を招きやすいです。行末のバッククォートは通常、行の継続を示すために使用されます。ユーザーは通常、エスケープされた空白文字で行末に記述することを意図していません。 |
| PSMissingModuleManifestField | モジュール マニフェストの一部のフィールド (ModuleVersion など) は必須です。 |
| PSPlaceCloseBrace | 閉じ括弧は新しい行に単独で記述する必要があります。 |
| PSPlaceOpenBrace | 開き中括弧は、前の式と同じ行または新しい行に配置します。 |
| PSPossibleIncorrectComparisonWithNull | 等価比較(eq、ne、ceq、cne、ieq、ine)の左側に$nullがあるかどうかを確認します。null等価比較の左側に配列がある場合、PowerShellは配列がnullかどうかではなく、配列内の$nullの有無を確認します。比較の両側が逆になっている場合、この問題は修正されます。したがって、念のため、等価比較の左側には常に$nullがあるようにしてください。 |
| PSPossibleIncorrectUsageOfAssignmentOperator | 「=」または「==」は PowerShell 言語の比較演算子ではないため、条件ステートメント内で必要になることはほとんどありません。 |
| PSPossibleIncorrectUsageOfRedirectionOperator | 異なる言語を切り替えるとき、PowerShell では '>' が「より大きい」を意味しないことを忘れがちです。 |
| PSProvideCommentHelp | すべてのコマンドレットにヘルプコメントがあるかどうかを確認します。このルールはコメントの存在のみをチェックします。コメントの内容はチェックしません。 |
| PSReviewUnusedParameter | すべてのパラメータが、宣言されている同じスクリプト、スクリプト ブロック、または関数内で使用されていることを確認します。 |
| PSUseApprovedVerbs | 定義されたすべてのコマンドレットが承認された動詞を使用していることを確認します。これは PowerShell のベストプラクティスに準拠しています。 |
| PSUseBOMForUnicodeEncodedFile | ASCII 以外の形式でエンコードされたファイルの場合は、このファイルを使用するすべてのアプリケーションが正しく解釈できるように、BOM が存在することを確認してください。 |
| PSUseCmdletCorrectly | コマンドレットは必須パラメータを使用して呼び出す必要があります。 |
| PSUseCompatibleCmdlets | 指定された PowerShell のバージョンとエディション、およびオペレーティング システムと互換性のあるコマンドレットを使用します。 |
| PSUseConsistentIndentation | 各ステートメント ブロックには一貫したインデントが必要です。 |
| PSUseConsistentWhitespace | キーワードと開き括弧/中括弧の間、代入演算子 ('=') の周囲、算術演算子の周囲、区切り文字 (',' および ';') の後に空白文字がないか確認します。 |
| PSUseCorrectCasing | 読みやすさと一貫性を高めるために、大文字と小文字の表記を統一してください。 |
| PSUseDeclaredVarsMoreThanAssignments | 宣言された変数が割り当て時だけでなく、スクリプトの他の場所でも使用されていることを確認します。 |
| PSUseLiteralInitializerForHashtable | ハッシュテーブルを作成する場合は、デフォルトで大文字と小文字を区別しないリテラル初期化子 @{} を使用します。 |
| PSUseOutputTypeCorrectly | コマンドレットの戻り値の型は、OutputType 属性を使用して宣言する必要があります。 |
| PSUseProcessBlockForPipelineCommand | コマンド パラメータがパイプラインから値を取得する場合、コマンドはプロセス ブロックを使用して、パイプラインからの入力オブジェクトをそのパラメータにバインドする必要があります。 |
| PSUsePSCredentialType | PowerShell 4.0 以前では、PSCredential 型の Credential という名前のパラメーターには、PSCredential 型属性の後に資格情報変換属性を定義する必要があります。 |
| PSShouldProcess | SupportsShouldProcess が存在する場合、関数は ShouldProcess/ShouldContinue を呼び出し、その逆も同様に呼び出します。どちらか一方のみが存在するスクリプトでは、通常、エラーや予期しない動作が発生します。 |
| PSUseShouldProcessForStateChangingFunctions | システム状態を変更する New、Start、Stop、Set、Reset、Restart などの動詞を持つ関数は、「ShouldProcess」をサポートする必要があります。 |
| PSUseSingularNouns | コマンドレットでは複数名詞ではなく単数名詞を使用する必要があります。 |
| PSUseSupportsShouldProcess | コマンドは通常、対話型環境での実行をより細かく制御するために、Confirm パラメータと Whatif パラメータを提供します。PowerShell では、コマンドは SupportsShouldProcess 属性を使用してこの機能を提供できます。したがって、コマンドにこれらのパラメータを手動で追加することは推奨されません。コマンドに Confirm パラメータと Whatif パラメータが必要な場合は、ShouldProcess をサポートする必要があります。 |
| PSUseToExportFieldsInManifest | モジュールマニフェスト内のAliasesToExport、CmdletsToExport、FunctionsToExport、VariablesToExportの各フィールドのエントリには、ワイルドカードや$nullを使用しないでください。モジュールの自動検出中に、これらのエントリのいずれかが欠落しているか、$nullまたはワイルドカードが含まれている場合、PowerShellはモジュールの残りの部分を分析するために、潜在的にコストの高い処理を実行します。 |
| PSUseUsingScopeModifierInNewRunspaces | ScriptBlock を新しい RunSpace として実行する場合は、その内部の変数に 'Using:' スコープ修飾子を使用するか、ScriptBlock 内で初期化する必要があります。 |
| PSUseUTF8EncodingForHelpFile | PowerShell ヘルプ ファイルでは UTF8 エンコードを使用する必要があります。 |
| PSDSCDscExamplesPresent | すべてのDSCリソースモジュールには、各リソースのサンプル構成を含む「Examples」フォルダが必要です。サンプル構成のタイトルには、デモ対象のリソース名を含める必要があります。 |
| PSDSCDscTestsPresent | すべてのDSCリソースモジュールには、各リソースのテストを含む「Tests」フォルダが必要です。テストスクリプトのファイル名には、テスト対象のリソース名を含める必要があります。 |
| PSDSCReturnCorrectTypesForDSCFunctions | DSCクラスのSet関数とDSCリソースのSet-TargetResource関数は何も返さないでください。DSCクラスのGet関数はDSCクラスのインスタンスを返す必要があり、DSCリソースのGet-TargetResource関数はハッシュテーブルを返す必要があります。DSCクラスのTest関数とDSCリソースのGet-TargetResource関数はブール値を返す必要があります。 |
| PSDSCUseIdenticalMandatoryParametersForDSC | DSC リソースの Get/Test/Set TargetResource 関数には、同じ必須パラメータが必要です。 |
| PSDSCUseIdenticalParametersForDSC | DSC リソースの Test 関数と Set-TargetResource 関数には同じパラメーターが必要です。 |
| PSDSCStandardDSCFunctionsInResource | DSCリソースはGet、Set、Test-TargetResource関数を実装する必要があります。DSCクラスはGet、Set、Test関数を実装する必要があります。 |
| PSDSCUseVerboseMessageInDSCResource | DSCリソース関数では、有益な詳細情報メッセージを出力することがベストプラクティスです。これは、DSC構成実行時の問題のデバッグに役立ちます。 |
PSAvoidTrailingWhitespace とかは機械的に修正ができます。
Invoke-ScriptAnalyzer -Fix a.Tests.ps1
Invoke-Formatter でフォーマットの整理ができます。
$src = Get-Item "a.Tests.ps1"
$raw = Get-Content -raw $src
$f = Invoke-Formatter $raw
# 差分があれば上書き
if ($raw -ne $f) {
$f | Out-File $src -Force
}