PowerShell / PSScriptAnalyzer

Download ScriptAnalyzer from PowerShellGallery
https://www.powershellgallery.com/packages/PSScriptAnalyzer/
MIT License
1.8k stars 366 forks source link

PSAvoidAssignmentToAutomaticVariable: Ignore when a Parameter has an Attribute that contains a Variable expression #1988

Open liamjpeters opened 3 months ago

liamjpeters commented 3 months ago

PR Summary

The rule PSAvoidAssignmentToAutomaticVariable alerts when no assignment has taken place.

It does so when $true or $false is used within the ValidateSet attribute of a parameter. Only the automatic variables $true and $false are permitted here - all other read-only automatic variables are a ParseError.

Currently:

param(
  [ValidateSet($true, $false)]
  $MyVar
)

Is flagged by PSAvoidAssignmentToAutomaticVariable.

The Variable 'true' cannot be assigned since it is a readonly automatic variable that is built into PowerShell, please use a different name.

Interestingly when a ValidateSet is used in this way outside of a param block - it does not get flagged.


This PR adds a check for variable expressions found within parameters which are the child of an Attribute, and skips them. Similarly to skipping over the variable expressions that are children of NamedAttributeArguments, which is already present.

This does not prevent the bodies of scriptblocks, within attributes, from being checked. So for instance the below is still flagged by PSAvoidAssignmentToAutomaticVariable.

Invoke-ScriptAnalyzer -ScriptDefinition 'param([ValidateScript({$true = $_})] $MyVar)' -ExcludeRule 'PSReviewUnusedParameter'

Resolves #1970

PR Checklist