PowerShell / PowerShell/PSScriptAnalyzer
PSAvoidAssignmentToAutomaticVariable generates false positives during script analysis
Nobody has claimed this yet.
- Dominant language
- C#
- Stars
- 2.2k
- Forks
- 414
- Avg merge
- 13h 1m
- Merged PRs (30d)
- 2
Description
Steps to reproduce
Run this function through PSSA.
function Write-Log {
[CmdletBinding()]
param
(
[Parameter(Position = 0, Mandatory)]
[ValidateNotNullOrEmpty()]
[string]
$Message,
[switch]
$Error
)
$callerEAP = $ErrorActionPreference
try {
$messageColor = if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey('Error') -and $Error) {
[ConsoleColor]::Red
} else {
[ConsoleColor]::Cyan
}
Write-Host -Foreground $messageColor -Object $Message
# Reset colors to return to default after an error message on a compilation error
[System.Console]::ResetColor()
} catch {
Write-Error -ErrorRecord $_ -ErrorAction $callerEAP
}
}
Expected behavior
It passes.
Actual behavior
PSSA reports the following:
The Variable 'Error' cannot be assigned since it is a readonly automatic variable that is built into PowerShell, please use a different name.
There are a number of problems with this:
- The comma should be a period for it to read properly.
- The error text is incorrect.
$Errorcan be assigned in child scopes without issue.$Erroris read-only only in the global scope, and errors are automatically written into that globally-scoped collection that is read-only from PowerShell. In functions, or child scopes, you can use a$Errorvariable to your hearts content. - Most importantly: the issue that is being called out by PSSA here should not be called out at all.
Environment data
> $PSVersionTable
Name Value
---- -----
PSVersion 7.0.1
PSEdition Core
GitCommitId 7.0.1
OS Microsoft Windows 10.0.18363
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.19.0
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the supplied Write-Log function through PSScriptAnalyzer and inspect the PSAvoidAssignmentToAutomaticVariable rule that reports the $Error parameter. Confirm the diagnostic against the stated PowerShell scoping behavior; done means this case is not reported and the diagnostic text is corrected if it remains applicable elsewhere.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- csharp, powershell
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100