0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PSScriptAnalyzer

0
Posted at

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
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?