PowerShell / PowerShell-RFC

RFC (Request for Comments) documents for community feedback on design changes and improvements to PowerShell ecosystem
MIT License
431 stars 123 forks source link

Get-ChildItem IncludeRoot Parameter #244

Open JohnLBevan opened 4 years ago

JohnLBevan commented 4 years ago

RFC: Author: John Bevan Status: Draft SupercededBy: Version: Area: Standard Functions Comments Due: Plan to implement:

Get-ChildItem; Add IncludeRoot Switch

Suggestion: Currently if you wish to fetch an item and its children you have to make a call to Get-Item and Get-ChildItem. Since this is a common use case, it would be good to reduce this to a single call. By adding an IncludeRoot switch to Get-ChildItem we could easily have it fulfill this requirement.

Here are some examples of people who've hit this scenario & tried to get creative in resolving it.

Motivation

As a PowerShell user,
I can retrieve an item and its children,
so that I have the full tree returned in a single result set.

User Experience

Example of user experience with example code/script. Include example of input and output.

Get-ChildItem -Path 'c:\demo' -IncludeRoot -Recurse | Select-Object -ExpandProperty FullName
c:\demo
c:\demo\subfolder
c:\demo\subfolder\one.txt
c:\demo\subfolder\two.txt

Specification

Include [Parameter()][Switch]$IncludeRoot in the list of available parameters.

Alternate Proposals and Considerations

The current workaround is to make separate calls to Get-Item and Get-ChildItem.

WithHolm commented 3 years ago

Doesn't this defeat the point of the command? I mean you want to get the childitems of said path, not the path-item itself.

In what use cases would you use this added parameter?

JohnLBevan commented 3 years ago

Doesn't this defeat the point of the command?

I understand your point; that the name of the command uses the world "Child". However I wouldn't use the phrase "defeats the point" as this doesn't impact the current functionality; and there's not an existing way (with a single command) to get a folder and its decedents. Rather I'd say it adds flexibility.

Perhaps adding a -IncludeDecendents switch to the Get-Item cmdlet would be more appropriate based on the function names? To me that feels less intuitive; but either option would be welcome.

In what use cases would you use this added parameter?

In most cases where I'd call GetChildItem -Path $Path -Recurse where I'm interested in folders rather than solely files, there's a 50:50 on whether or not I'd also want to include the parent... Most times I want $Path; GetChildItem -Path $Path -Recurse | % FullName though sometimes I want Get-Item -Path $Path; GetChildItem -Path $Path -Recurse.

A couple of examples I can think of when this would be useful are:

.. but really most cases where you'd be interested in the folders of Get-ChildItem there's likely a case where the parent may be of equal interest to its content.