PowerShellPracticeAndStyle icon indicating copy to clipboard operation
PowerShellPracticeAndStyle copied to clipboard

New line after pipeline?

Open brianmccarty opened this issue 6 years ago • 4 comments

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

brianmccarty avatar Apr 13 '18 02:04 brianmccarty

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.

dotps1 avatar Apr 13 '18 12:04 dotps1

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.

pauby avatar Apr 13 '18 12:04 pauby

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

  • https://github.com/PowerShell/PowerShell/issues/3020

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.

michaeltlombardi avatar Apr 16 '18 17:04 michaeltlombardi

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.

vexx32 avatar Apr 20 '18 12:04 vexx32