Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does the Get-ChildItem -Exclude Parameter work?

Tags:

powershell

How does the Get-ChildItem -Exclude parameter work? What rules does it follow?

The Get-Help for Get-ChildItem isn't detailed at all:

Omits the specified items. The value of this parameter qualifies the Path parameter. Enter a path element or pattern, such as "*.txt". Wildcards are permitted.

And on Stackoverflow and elsewhere the general consensus seems to be it's too difficult to use and we should all just pipe the output of Get-ChildItem to Where-Object instead.

While I'm willing to use Where-Object I'm curious as to the rules -Exclude follows.

For example, I have a folder with the following sub-folders:

HsacFixtures
HsacFixturesBuild
RestFixture
RestFixtureBuild

If I execute the following command:

Get-ChildItem $rootFolderPath -Exclude HsacFixturesBuild -Directory

it returns the results expected:

HsacFixtures
RestFixture
RestFixtureBuild

However, if I add a -Recurse parameter:

Get-ChildItem $rootFolderPath -Exclude HsacFixturesBuild -Directory -Recurse

Then it returns sub-folders in the HsacFixturesBuild folder.

I've also tried HsacFixturesBuild\ and HsacFixturesBuild\*, which have the same results.

So does -Exclude only apply to immediate children, and not to grand-children or deeper sub-folders?

like image 419
Simon Tewsi Avatar asked Nov 02 '16 00:11

Simon Tewsi


People also ask

What is the use of get-ChildItem?

The Get-ChildItem cmdlet gets the items in one or more specified locations. If the item is a container, it gets the items inside the container, known as child items. You can use the Recurse parameter to get items in all child containers and use the Depth parameter to limit the number of levels to recurse.

What does get-ChildItem do in PowerShell?

Get-ChildItem displays the files and directories in the PowerShell console. By default, Get-ChildItem lists the mode (Attributes), LastWriteTime, file size (Length), and the Name of the item. The letters in the Mode property can be interpreted as follows: l (link)

What is the difference between GET and ChildItem?

Differences Between Get-Item and Get-ChildItemGet-Item returns information on just the object specified, whereas Get-ChildItem lists all the objects in the container. Take for example the C:\ drive.

How does $_ work in PowerShell?

The “$_” is said to be the pipeline variable in PowerShell. The “$_” variable is an alias to PowerShell's automatic variable named “$PSItem“. It has multiple use cases such as filtering an item or referring to any specific object.


1 Answers

Exclude omits child objects based on the Name,

For files, gets the name of the file. For directories, gets the name of the last directory in the hierarchy if a hierarchy exists. Otherwise, the Name property gets the name of the directory

not the FullName,

which gets the full path of the directory or file

So even though the object is a grandchild in a recursive call, the exclude only looks at the object's Name, not the FullName so the exclude wont affect omission unless the child objects share a common substring of the name that happens to be part of the exclude parameter

Source Get-ChildItem

Example 3: Get all child items using an inclusion and exclusion

This command lists the .txt files in the Logs subdirectory, except for those whose names start with the letter A. It uses the wildcard character (*) to indicate the contents of the Logs subdirectory, not the directory container. Because the command does not include the Recurse parameter, the command does not include the content of directory automatically; you need to specify it.

Windows PowerShell

PS C:\> Get-ChildItem –Path "C:\Windows\Logs\*" -Include "*.txt" -Exclude "A*"
like image 182
Nkosi Avatar answered Sep 20 '22 15:09

Nkosi