Introduction
PowerShell is a powerful scripting language and command-line shell designed for system administration. One of its fundamental commands is Get-Command
, which retrieves files, directories, and other objects from the file system. While this command can output both files and directories, you might often need to filter out just the directories. This tutorial will guide you through various methods to list only directories using PowerShell’s Get-ChildItem
command across different versions.
Understanding Get-ChildItem
The Get-ChildItem
cmdlet is versatile and can retrieve a wide range of items from the file system, including files, directories, registry keys, etc. By default, it lists all children (files and subdirectories) in the specified path. However, to focus solely on directories, we need filtering techniques.
Using PowerShell 3.0 and Above
For those using PowerShell version 3.0 or newer, Get-ChildItem
offers a straightforward option to list only directories:
# Lists all subdirectories under the current directory recursively
Get-ChildItem -Directory -Recurse
You can also use aliases such as dir
, ls
, and gci
:
# Using alias 'dir'
dir -Directory -Recurse
# Using alias 'ls'
ls -Directory -Recurse
The -Directory
parameter is specifically designed to filter out directories, simplifying the command.
Handling Versions Below PowerShell 3.0
If you are working with PowerShell versions earlier than 3.0 (such as PowerShell 2.0), there’s no direct switch to list only directories. Instead, we use properties available in these older versions:
# Lists all subdirectories under the specified path recursively
Get-ChildItem -Recurse | Where-Object { $_.PSIsContainer }
The PSIsContainer
property is a boolean attribute that indicates whether an item is a container (directory) or not.
To extract just the names of these directories, you can refine the command further:
# Lists only the full path names of all subdirectories recursively
Get-ChildItem -Recurse | Where-Object { $_.PSIsContainer } | Select-Object FullName
Advanced Filtering Using Attributes
Another approach is to leverage the Attributes
property, which contains metadata about files and directories:
# Lists only directories by matching attributes
Get-ChildItem "<name_of_directory>" | Where-Object { $_.Attributes -match 'Directory' }
While this method works, it’s more common to use the -Directory
option in newer PowerShell versions for simplicity.
Cross-Platform Considerations
With the advent of PowerShell Core starting from version 6.0, PowerShell has become cross-platform, running on Windows, macOS, and Linux. The directory listing behavior remains consistent across platforms. However, when using recursive options (-Recurse
or -r
) with symlinks on PowerShell Core, you may need to include the -FollowSymlink
switch if following symlinks is necessary:
# Recursively lists only directories and follows symlinks
Get-ChildItem -Directory -Recurse -FollowSymlink
Conclusion
Filtering directories using Get-ChildItem
in PowerShell can be efficiently achieved with the right parameters. For users on versions 3.0 and later, the -Directory
switch is a simple and effective method. Meanwhile, earlier versions require filtering through properties such as PSIsContainer
. These techniques ensure you can manage and script directory structures seamlessly across different environments.