PSScriptAnalyzer icon indicating copy to clipboard operation
PSScriptAnalyzer copied to clipboard

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

Open liamjpeters opened this issue 1 year ago • 0 comments

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

liamjpeters avatar Mar 27 '24 15:03 liamjpeters