Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alias "?" is changed to "%" by Invoke-Formatter #1209

Closed
mkht opened this issue Apr 6, 2019 · 3 comments · Fixed by #1210
Closed

Alias "?" is changed to "%" by Invoke-Formatter #1209

mkht opened this issue Apr 6, 2019 · 3 comments · Fixed by #1210

Comments

@mkht
Copy link

mkht commented Apr 6, 2019

Invoke-Formatter will convert "?" to "%".

Before formatting

1..10 | ? { ($_ % 2) -eq 0 }

After formatting

1..10 | % { ($_ % 2) -eq 0 }

I found this bug when I research PowerShell/vscode-powershell#1842 and PowerShell/vscode-powershell#1849 .
It's a ridiculous bug.

Steps to reproduce

In the standalone Windows PowerShell console.

PS C:\> Get-Module PSScriptAnalyzer -ListAvailable
PS C:\> Install-Module PSScriptAnalyzer -Force -Scope CurrentUser
PS C:\> Get-Module PSScriptAnalyzer -ListAvailable


    Directory: C:\Users\Administrator\Documents\WindowsPowerShell\Modules


ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     1.18.0     PSScriptAnalyzer                    {Get-ScriptAnalyzerRule, Invoke-ScriptAnalyzer, Invoke-Formatter}


PS C:\> Invoke-Formatter '1..10 | ? { ($_ % 2) -eq 0 }' -Verbose
VERBOSE: Using settings file at C:\Users\Administrator\Documents\WindowsPowerShell\Modules\PSScriptAnalyzer\1.18.0\Settings\CodeFormatting.psd1.
VERBOSE: Analyzing Script Definition.
VERBOSE: Running PSPlaceCloseBrace rule.
VERBOSE: Found 0 violations.
VERBOSE: Fixed 0 violations.
VERBOSE: Analyzing Script Definition.
VERBOSE: Running PSPlaceOpenBrace rule.
VERBOSE: Found 0 violations.
VERBOSE: Fixed 0 violations.
VERBOSE: Analyzing Script Definition.
VERBOSE: Running PSUseConsistentWhitespace rule.
VERBOSE: Found 0 violations.
VERBOSE: Fixed 0 violations.
VERBOSE: Analyzing Script Definition.
VERBOSE: Running PSUseConsistentIndentation rule.
VERBOSE: Found 0 violations.
VERBOSE: Fixed 0 violations.
VERBOSE: Analyzing Script Definition.
VERBOSE: Running PSAlignAssignmentStatement rule.
VERBOSE: Found 0 violations.
VERBOSE: Fixed 0 violations.
VERBOSE: Analyzing Script Definition.
VERBOSE: Running PSUseCorrectCasing rule.
VERBOSE: Found 1 violations.
VERBOSE: Fixed 1 violations.
1..10 | % { ($_ % 2) -eq 0 }

Environment data

PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17763.316
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.316
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

PS C:\> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.18.0
@mkht
Copy link
Author

mkht commented Apr 6, 2019

I confirmed that the issue is also occurred in the macOS 10.14 with PSCore 6.2 .

@bergmeister
Copy link
Collaborator

bergmeister commented Apr 6, 2019

Thanks for reporting this. I had a look at it and the bug seems to be caused by the CommandInfo lookup here, where PSSA takes the first element, when it executes Get-Command -Name '?' -ErrorAction SilentlyContinue. Executing it locally shows why it replaces it with % then as shown below. The way the CommandInfo lookup function worked has not changed in the last releases in terms of functionality but the addition of the new formatting rule UseCorrectCasing makes this issue surface only now although I do not understand why PowerShell returns % and other aliases when being asked for ?

>Get-Command -Name '?' -ErrorAction SilentlyContinue

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object
Alias           ? -> Where-Object
Alias           d -> dotnet.exe
Alias           g -> git.exe
Alias           h -> Get-History
Alias           r -> Invoke-History

Concluding, I think we might have to change the default setting of this rule to be not enabled by default in the VS-Code extension to prevent to minimise the damage (although people are encourage to use source control and look at the diff). I'd hope that we can patch PSSA at some point then and modify the rule to look only for certain CommandTypes and not aliases. I'd also like to raise the question in the PowerShell repo as to why PowerShell returns such a result. cc @TylerLeonhardt @SteveL-MSFT

@B-Art
Copy link

B-Art commented Nov 12, 2023

A bit of topic, but why not use:

(1..10).where{ ($_ % 2) -eq 0 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants