PowerShell / PowerShell/PSScriptAnalyzer

Rule `PSAvoidShouldContinueWithoutForce` doesn't enforce correct use of the `Force` parameter

Open
#1,308 5 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Up-for-Grabs
Dominant language
C#
Stars
2.2k
Forks
414
Avg merge
13h 1m
Merged PRs (30d)
2

Description

Currently PSScriptAnalyzer shows a PSAvoidShouldContinueWithoutForce violation for any scripts using $PSCmdlet.ShouldContinue that do not include a $Force parameter.
However, once the parameter the violation is resolved; even if that parameter is never used elsewhere in the code.

Steps to reproduce

function Invoke-MVP {
    [CmdletBinding(SupportsShouldProcess = $true)] 
    [OutputType('System.String')]
    Param (
        [Parameter()]
        [switch]$Force # Including this parameter resolves the PSAvoidShouldContinueWithoutForce violation; even though we don't reference Force in the rest of the code
    )
    if ($PSCmdlet.ShouldContinue('Should I continue','Should I continue')) {
        'I continued'
    }
}

# ...
Invoke-ScriptAnalyzer -Path '.\Invoke-MVP.ps1'

Expected behavior

A violation of rule PSAvoidShouldContinueWithoutForce should occur.

Actual behavior

The code is deemed free of violations.

Environment data

> $PSVersionTable

Name                           Value                                                                                                                                                                                                             
----                           -----                                                                                                                                                                                                             
PSVersion                      5.1.14409.1018                                                                                                                                                                                                    
PSEdition                      Desktop                                                                                                                                                                                                           
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                                                                                                           
BuildVersion                   10.0.14409.1018                                                                                                                                                                                                   
CLRVersion                     4.0.30319.42000                                                                                                                                                                                                   
WSManStackVersion              3.0                                                                                                                                                                                                               
PSRemotingProtocolVersion      2.3                                                                                                                                                                                                               
SerializationVersion           1.1.0.1           
> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.18.1

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by locating the PSAvoidShouldContinueWithoutForce rule implementation and its existing tests, then reproduce the issue with the Invoke-MVP example from the report. Done means an unused Force parameter no longer suppresses the violation and a regression test covers that case.

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
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.