PoshCode / PowerShellPracticeAndStyle

The Unofficial PowerShell Best Practices and Style Guide
https://poshcode.gitbooks.io/powershell-practice-and-style
Other
2.24k stars 289 forks source link

New line after pipeline? #106

Open brianmccarty opened 6 years ago

brianmccarty commented 6 years ago

What do you think about the pipeline and newlines.

Get-PSSession |
    Where-Object { $_.computername -like "*.outlook.com" } |
    Remove-PSSession
Get-PSSession | Where-Object { $_.computername -like "*.outlook.com" } | Remove-PSSession
dotps1 commented 6 years ago

I personally do it like this:

Get-Process |
    Sort-Object -Property Name |
        Out-GridView

When I'm writing scripts anyway. I don't do that when I'm using the shell.

pauby commented 6 years ago

Reability is more important and having it all on one line makes it more difficult to understand at a quick glance. If your code is more readable over multiple lines then break it up.

michaeltlombardi commented 6 years ago

If we care about readability, we sure might want to chime in on a very relevant PowerShell issue:

When it comes to style, clarity, and readability, the options below are organized from best to worst:

# Doesn't work, but it _should_
Get-PSSession
| Where-Object { $_.computername -like "*.outlook.com" }
| Remove-PSSession
Get-PSSession |
  Where-Object { $_.computername -like "*.outlook.com" } |
  Remove-PSSession
Get-PSSession `
| Where-Object { $_.computername -like "*.outlook.com" } `
| Remove-PSSession
Get-PSSession |
  Where-Object { $_.computername -like "*.outlook.com" } |
    Remove-PSSession
Get-PSSession | Where-Object { $_.computername -like "*.outlook.com" } | Remove-PSSession
Get-PSSession |
Where-Object { $_.computername -like "*.outlook.com" } |
Remove-PSSession

The version with backticks is better than the pyramid indent but worse than the single indent because it is slightly harder to maintain, but it remains easier to read and understand especially with long or complex pipelines.

vexx32 commented 6 years ago

That first option is very F#-like. I approve.

let f1 str server =
    str
    |> parseUserName
    |> getUserByName server
    |> validateLogin <| DateTime.Now

Getting that to work, though, would be a fairly big task, I think. It goes against a few established behaviours. Currently my go to is option 2.