PowerShell / PSScriptAnalyzer

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

Rule Request: UseCompatibleStrings #2015

Open daprahamian opened 4 months ago

daprahamian commented 4 months ago

Summary of the new feature

The `e and `u{xxxx} special characters in double-quoted strings were added in Powershell 6. It would be nice to have a compatibility rule that detects these escape characters when writing for Powershell <6 and suggests a different syntax (ex. suggesting $([char]0x1b) for `e)

What is the latest version of PSScriptAnalyzer at the point of writing v1.22

iRon7 commented 4 months ago

I would name it UseCompatibleEscapeSequences as it specifically concerns the use of compatible escape sequences

SydneyhSmith commented 3 months ago

Thanks... would want to make sure this came with great test coverage 😄

iRon7 commented 3 months ago

Specifically for the escape character (`e): $([char]0x1b) is a nice suggestion for the auto correction (-fix), yet my recommendation for a (documented) more idiomatic (and presumably more efficient) compatible correction would be to define a new (common) $Esc variable also knowing that in most cases this doesn't require any Subexpression operator $( ) as it is usually followed by a special character:

$Esc = $([char]0x1b)
"This is $Esc[7mInverse$Esc[27m text."

The same might apply to any specific unicode escape sequences (although less common):

$Smiley = $([char]0x263a)
"Please $Smiley, I am taking a picture"
liamjpeters commented 3 months ago

@iRon7 I'm not sure I agree that we should be defining a new variable.

There's a minutia of complexities with doing so. Not least of all:

With PowerShell's dynamic scopes, lexical analysis would be insufficient to find a suitable name or place. Though perhaps I'm over-thinking it? 🤔

I've made a first stab at the MVP of this and learned a fair bit.

UseCompatibleEscapeSequences

As Sydney says, much testing is going to be needed; There are many edge cases.